Gå til innhold

Importere fra csv fil, noe galt med koden min?


Anbefalte innlegg

Hei,

 

Jeg prøver å lage et script for å inserte en csv fil i mysql databasen. Det funker, tror alt kommer inn i databasen, men jeg får en feilmelding som jeg ikke skjønner hva kommer av? Vil helst ikke få feilmelding... Noen som ser feil i koden min?

 

Dette er feilen: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ',,,,)' at line 1

 

CSV filen ser slik ut:

quote_date,paper,exch,open,high,low,close,volume,value

20090220,IGE,Oslo Børs,0.80,0.80,0.67,0.72,24656750,18135172

20090219,IGE,Oslo Børs,0.92,0.94,0.85,0.85,17713280,15930991

osv...

...så jeg bruker "if ($line_of_text[0] == 'quote_date')" for å "hoppe" over den første linjen.

 

Så vidt jeg kan se er det denne som har noen feil, men skjønner ikke hva:

$insert = mysql_query("INSERT INTO exchange_osl (pricedate, exchange, ticker, open, high, low, close, volume, value) VALUES ('$line_of_text[0]','OSL','$line_of_text[1]',$line_of_text[3],$line_of_text[4],$line_of_text[5],$line_of_text[6],$line_of_text[7],$line_of_text[8])") or die(mysql_error());

 

Hele koden er under:

 

$file_handle = fopen("tmp/yourfile.csv", "r");

while (!feof($file_handle) ) 
{

$line_of_text = fgetcsv($file_handle);

if ($line_of_text[0] == 'quote_date') 
{
} 
else 
{
//	echo print_r($line_of_text);
$test = mysql_query("SELECT * FROM exchange_osl WHERE pricedate = '$line_of_text[0]' AND exchange = 'OSL' AND ticker = '$line_of_text[1]'") or die(mysql_error());


if(mysql_num_rows($test) != 0) 
{
}

	else 
	{

	$insert = mysql_query("INSERT INTO exchange_osl (pricedate, exchange, ticker, open, high, low, close, volume, value) VALUES ('$line_of_text[0]','OSL','$line_of_text[1]',$line_of_text[3],$line_of_text[4],$line_of_text[5],$line_of_text[6],$line_of_text[7],$line_of_text[8])") or die(mysql_error());


	}


}
}

fclose($file_handle);

Lenke til kommentar
Videoannonse
Annonse

Bytt

$insert = mysql_query("INSERT INTO exchange_osl (pricedate, exchange, ticker, open, high, low, close, volume, value) VALUES ('$line_of_text[0]','OSL','$line_of_text[1]',$line_of_text[3],$line_of_text[4],$line_of_text[5],$line_of_text[6],$line_of_text[7],$line_of_text[8])") or die(mysql_error());

Med

$query = "INSERT INTO exchange_osl (pricedate, exchange, ticker, open, high, low, close, volume, value) VALUES ('$line_of_text[0]','OSL','$line_of_text[1]',$line_of_text[3],$line_of_text[4],$line_of_text[5],$line_of_text[6],$line_of_text[7],$line_of_text[8])"
$insert = mysql_query($query) or die("Query: $query\n".mysql_error());

(evt fiks mine feil) og se om du ikkje blir klokere av å se spørringen som du sender til databsen forran deg...

Endret av bjorn.e
Lenke til kommentar

Takk skal dere ha, det var visst en blank linje som den prøvde å inserte. Endret bare til if ($line_of_text[0] == 'quote_date' || $line_of_text[0] == "") og feilmeldingen forsvant.

 

Forressten jeg bruker mysql_real_escape_string, men det er vel ikke nødvendig om man ikke har input fra brukere... Og det andre greiene skjønner jeg ikke så mye av :hmm:

Lenke til kommentar
  • 2 uker senere...

Bare ryddet litt i koden din.

 

<?php

$fp = fopen("tmp/yourfile.csv", "r");

while (($data = fgetcsv($fp, 1000, ',')) !== false)
{
if (!(int)$data[0]) continue; // skip csv header

$result = mysql_query("
SELECT *
FROM exchange_osl
WHERE
pricedate = '".mysql_real_escape_string($data[0])."'
AND exchange = 'OSL'
AND ticker = '".mysql_real_escape_string($data[1])."'
");

if (!mysql_num_rows($result))
{
	mysql_query("
INSERT INTO exchange_osl SET
pricedate = '".mysql_real_escape_string($data[0])."',
exchange = 'OSL',
ticker = '".mysql_real_escape_string($data[1])."',
open = '".(float)$data[3]."',
high = '".(float)$data[4]."',
low = '".(float)$data[5]."',
close = '".(float)$data[6]."',
volume = '".(float)$data[7]."',
value = '".(int)$data[8]."'
");
}

}

fclose($fp);

?>

Lenke til kommentar

Ja, jøss - det der ser jo virkelig elegant ut.

 

Pfff, benytt deg av en standard og, ikke minst, anerkjent syntaks. Slutt å lær bort subjektive preferanser i forhold til formatering i god tro om at dette er det "riktige". (Koden din ser for øvrig utrolig stygg ut, nå som vi er inne på estetikk) F.eks. så er Zend ganske så populært. Se spesielt på string concatenation i sammenheng med queries.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...