我的代码的目的是从CSV文件中提取数据并将其上传到我的数据库中。
我可以从文件的每一行中提取所有属性,但它会在sql查询中显示错误。
这是我的PHP文件:
<?
$row = 1;
$server="XXXXX";
$user="XXXX";
$password="XXXX";
$db="XXXX";
mysql_connect($server,$user,$password) or die('erreur au serveur');
mysql_select_db($db) or die('erreur db');
if (($handle = fopen('XXXX/articles.csv','r+')) !== FALSE) {
while (($data = fgetcsv($handle,";")) !== FALSE) {
$num = count($data);
//echo "<p> $num champs à la ligne $row: <br /></p>\n";
$row++;
for ($c=0; $c < $num; $c++) {
echo $data[$c] . "<br />\n";
$produit =$data[$c];
$att = explode(";", $produit);
$prod = $att[0]; echo 'id = '.$prod .'<br/>';
$code = $att[1]; echo 'code = '.$code.'<br/>';
$nom = $att[2]; echo 'nom = '.$nom.'<br/>';
$cat = $att[3]; echo 'categorie = '.$cat.'<br/>';
$prix = $att[4]; echo 'prix = '.$prix.'<br/>';
$cond = $att[5]; echo 'cond = '.$cond.'<br/>';
$date = $att[6]; echo 'date = '.$date.'<br/>';
$qtes = $att[7]; echo 'qtes = '.$qtes.'<br/>';
$photo = $att[8]; echo 'photo = '.$photo.'<br/>';
$qte = $att[9]; echo 'qte = '.$qte.'<br/>';
$cam = $att[10]; echo 'camion = '.$cam;
$sql = 'UPDATE produit SET code_barre ='.$code.',nom_prod ='.$nom.', photo ='.$photo.',categorie='.$cat.',condition ='.$cond.',prix_uniraire ='.$prix.', date_exp='.$date.' ,qte ='.$qte.',qte_stock ='.$qtes.', id_camion= '.$cam.' WHERE id_prod ='.$prod.'';
$res = mysql_query($sql) or trigger_error(mysql_error()." in ".$sql);
$row++;
}
}
fclose($handle);
}
?>
这就是我得到的:
注意:您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 'condition =emballés,prix_uniraire = 3450,date_exp = 04/02/2016附近 ,qte = 200,qte_stock'在UPDATE produit SET code_barre的第1行 = 345123,nom_prod = Nutella,photo = www.google.com,categorie = Chocolat,condition =emballés,prix_uniraire = 3450,date_exp = 04/02 / 2016,qte = 200,qte_stock = 2100,id_camion = 2 WHERE id_prod = 3在/home/a2258793/public_html/seekarticles.php上 第34行
答案 0 :(得分:2)
注意问题的开始,MySQL告诉你问题出在哪里:
(旁注:在您提问的评论部分,他们同样重要)。
for the right syntax to use near 'condition ^ the problem starts here
&#34;的条件强>&#34;是一个MySQL保留字,需要特别注意。
您可以将列名称包裹在刻度中,或者将其重命名为另一个单词,例如&#34; conditions&#34;以复数形式。它不是MySQL保留字。
`condition` ='.$cond.'
您可以/也应该将该行重写为:(并使用不同的引用方法),因为您的值包含字符串。其余的,MySQL将处理整数。
$sql = "UPDATE produit SET code_barre ='".$code."',
nom_prod ='".$nom."', photo ='".$photo."',categorie='".$cat."',
`condition` ='".$cond."',prix_uniraire ='".$prix."',
date_exp='".$date."' ,qte ='".$qte."',
qte_stock ='".$qtes."', id_camion= '".$cam."'
WHERE id_prod ='".$prod."' ";
Nota:只需要引用字符串值。您可以根据需要进行修改。
I.e。:WHERE id_prod = $prod";
如果$prod
是包含您的列的整数。
<强>旁注:强>
您目前的代码向SQL injection开放。使用mysqli
with prepared statements或PDO with prepared statements,他们更安全。
<强>脚注:强>
如果您遇到任何其他错误,则需要使用mysql_real_escape_string()
转义您的值。
MySQL会抱怨撇号等等。Nutella's the best!
并将其解释为VALUES中的'Nutella's the best!'
导致语法错误。而转义数据会将其解释为'Nutella\'s the best!'
使其有效,因为它已被转义。
答案 1 :(得分:1)
你需要逃避你的价值观,试试这个:
$sql = 'UPDATE `produit` SET `code_barre` = "'.$code.'", `nom_prod` = "'.$nom.'", `photo` = "'.$photo.'", `categorie` = "'.$cat.'", `condition` = "'.$cond.'", `prix_uniraire` = "'.$prix.'", `date_exp` = "'.$date.'", `qte` = "'.$qte.'", `qte_stock` = "'.$qtes.'", `id_camion` = "'.$cam.'" WHERE `id_prod` = "'.$prod.'"';
使用PDO(PDO::prepare
)会对你有所帮助:它会自动设法转义值。
答案 2 :(得分:1)
只需将您的查询更新为。这完全是因为转义值而condition是mysql中的保留关键字
$sql = "UPDATE produit SET code_barre = '$code',nom_prod ='$nom', photo ='$photo',categorie='$cat',condition ='$cond',prix_uniraire ='$prix', date_exp='$date' ,qte ='$qte',qte_stock ='$qtes', id_camion= '$cam' WHERE id_prod ='$prod'";
答案 3 :(得分:0)
如果你打印你的查询,你会发现文字没有被cotes包围,所以把这样的婴儿床。
$sql = 'UPDATE produit SET code_barre ="'.$code.'",nom_prod ="'.$nom.'", photo ="'.$photo.'",categorie="'.$cat.'",condition ="'.$cond.'",prix_uniraire ="'.$prix.'", date_exp="'.$date.'" ,qte ="'.$qte.'",qte_stock ="'.$qtes.'", id_camion= "'.$cam.'" WHERE id_prod ="'.$prod.'"';
希望它能解决你的问题