2016-01-01 67 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)' –