Warz Skrevet 22. februar 2009 Del Skrevet 22. februar 2009 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,value20090220,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
bjorn.e Skrevet 22. februar 2009 Del Skrevet 22. februar 2009 (endret) 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 22. februar 2009 av bjorn.e Lenke til kommentar
OIS Skrevet 23. februar 2009 Del Skrevet 23. februar 2009 Du kan lese litt i manualen angående parse array variabler i strenger. Du kan også se om du liker sprintf funksjonen. Du kan også lese litt om og begynne å bruke mysql_real_escape_string. Du burde gjerne prøve PDO med prepared statements, eller mysqli med prepared statements. Lenke til kommentar
Warz Skrevet 23. februar 2009 Forfatter Del Skrevet 23. februar 2009 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 Lenke til kommentar
ymsefisen Skrevet 9. mars 2009 Del Skrevet 9. mars 2009 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
Jonas Skrevet 9. mars 2009 Del Skrevet 9. mars 2009 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå