2016-01-01 66 views
0

我的代碼:SQL#1064解析錯誤

for($i=0; $i<count($_POST['value']);$i=$i+3) 
{ 
    $sql = "(NULL, '".$_POST['value'][$i]."', '".$_POST['value'][$i+1]."', '".$_POST['value'][$i+2]."')"; 
} 
$query = "INSERT INTO 'googlemaps'.'values' ('id','lat','long','desc') VALUES ".$sql; 

,但我得到的錯誤這在SQL

#1064 - ERREUR德syntaxe的PRA德'谷歌地圖值' ( '身份證', '緯度', '長', '遞減')VALUES(NULL,'20 0.593684' ,'78」點菜 LIGNE 1

可有一個建議這裏有什麼問題?

或任何其他的方式來簡化這個代碼?

+1

從'表和列名稱'中使用'引號'來代替'backtick'! – Saty

+0

@Clayton你的答案將無法正常工作,而不是目前的狀態,因爲我在它之下概括。 –

回答

3

我要去猜你打算插入的GoogleMaps表,而不是調用表名爲值的GoogleMaps(如果我錯了,讓我知道,我將修改我的答案)數據庫。所以這是第一件事。接下來的事情是你想使用反引號而不是單引號表和列名。

$query = "INSERT INTO `googlemaps` (`id`,`lat`,`long`,`desc`) VALUES ".$sql; 

倒引號是報價標識符,並且將防止意外使用保留關鍵字時,列或表名之意。

的標識符引號字符是反引號(「`」)Click here to read more

既然你不使用任何關鍵字,除了遞減而長,你也可以寫你的查詢是這樣的:

$query = "INSERT INTO googlemaps (id,lat,`long`,`desc`) VALUES ".$sql; 

而且因爲沒有人願意讓一個SQL注入,你可以修改你的for循環是這樣的:

$sql = "(NULL, '".mysqli_escape_string($db, $_POST['value'][$i])."', '".mysqli_escape_string($db, $_POST['value'][$i+1])."', '".mysqli_escape_string($db, $_POST['value'][$i+2])."')"; 

mysqli_escape_string將字符串中的特殊字符轉義爲在SQL語句中使用,同時考慮連接的當前字符集。 Read more by clicking here

看起來你正在嘗試做的擴展插入太

你的最終代碼會是這個樣子(設置$ DB到任何您的連接變量):

$sql = []; // define as an array 
for($i=0; $i<count($_POST['value']);$i=$i+3) { 
    $sql[] = "(NULL, '".mysqli_escape_string($db, $_POST['value'][$i])."', '".mysqli_escape_string($db, $_POST['value'][$i+1])."', '".mysqli_escape_string($db, $_POST['value'][$i+2])."')";  

} 
$query = "INSERT INTO googlemaps (id,lat,`long`,`desc`) VALUES ".implode(',', $sql); 

破滅將加入SQL字符串一起回來逗號分隔

破滅使用字符串加入數組元素Read more by reading the documentation here

+0

'mysqli_escape_string()'是http://php.net/manual/en/mysqli.real-escape-string.php的一個別名,還需要一個連接來傳遞給它'串mysqli_real_escape_string($ mysqli的鏈接,字符串$ escapestr)' –