SQL语法中的错误

时间:2015-05-15 10:41:21

标签: php mysql sql

我的代码的目的是从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行

4 个答案:

答案 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 statementsPDO 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.'"';

希望它能解决你的问题