mysqli返回错误,但查询在phpmyadmin中正常工作

时间:2017-03-23 19:36:47

标签: php mysql sql mysqli phpmyadmin

问题如下:我在php数组中打包了一系列INSERT查询。通过implode函数,我将总查询发送到数据库引擎(使用mysqli类)。

PHP代码:

$query = array();
foreach ($intestazione as $i => $val) {
$query[] = "INSERT INTO `intestazioni` (`id_tabella`, `nome`, `ordine`) "
            . "VALUES ('$id_tabella', '$val', '$i') ";
}
if ($matper_connection->query(implode(';',$query)) === FALSE) {
    die ("Query error: <br />".$matper_connection->error."<br>".implode(';<br />',$query));
}

浏览器结果:

Query non riuscita: 
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 'INSERT INTO `intestazioni` (`id_tabella`, `nome`, `ordine`) VALUES ('18', 'AfS',' at line 1
INSERT INTO `intestazioni` (`id_tabella`, `nome`, `ordine`) VALUES ('18', 'AfS Pulito', '0') ;
INSERT INTO `intestazioni` (`id_tabella`, `nome`, `ordine`) VALUES ('18', 'AfS', '1') ;
INSERT INTO `intestazioni` (`id_tabella`, `nome`, `ordine`) VALUES ('18', 'Denominazione', '2') ;
INSERT INTO `intestazioni` (`id_tabella`, `nome`, `ordine`) VALUES ('18', 'TR di Riferimento', '3') ;
INSERT INTO `intestazioni` (`id_tabella`, `nome`, `ordine`) VALUES ('18', 'Riferimento schematico', '4') ;
INSERT INTO `intestazioni` (`id_tabella`, `nome`, `ordine`) VALUES ('18', 'Campo', '5') ;
INSERT INTO `intestazioni` (`id_tabella`, `nome`, `ordine`) VALUES ('18', 'Applicabilità', '6') ;
INSERT INTO `intestazioni` (`id_tabella`, `nome`, `ordine`) VALUES ('18', 'Evento', '7') ;
INSERT INTO `intestazioni` (`id_tabella`, `nome`, `ordine`) VALUES ('18', '', '8') ;
INSERT INTO `intestazioni` (`id_tabella`, `nome`, `ordine`) VALUES ('18', 'PER', '9') ;
INSERT INTO `intestazioni` (`id_tabella`, `nome`, `ordine`) VALUES ('18', 'ROE', '10') ;
INSERT INTO `intestazioni` (`id_tabella`, `nome`, `ordine`) VALUES ('18', 'Note', '11')

如果我将确切的输出文本(同时删除调试期间添加的<br />)复制到SQL的{​​{1}}字段中,则总查询工作正常。

我无法弄清楚问题是什么......

提前感谢任何建议......

1 个答案:

答案 0 :(得分:0)

  

API函数mysqli_query()和mysqli_real_query()不设置   激活服务器中的多个查询所需的连接标志。   额外的API调用用于多个语句以减少   意外SQL注入攻击的可能性。   http://php.net/manual/en/mysqli.quickstart.multiple-statement.php

对于单个命令中的多个查询,您可以使用例如mysqli :: multi_query。

基本上你可以改变

$matper_connection->query(implode(';',$query)) === FALSE

$matper_connection->multi_query(implode(';',$query)) === FALSE

mysqli :: multi_query的文档可在以下位置找到:http://php.net/manual/en/mysqli.multi-query.php

建议

我建议您修改代码,以便在SQL中允许用户输入时将所有内容插入到一个语句中。例如:

INSERT INTO 
    `intestazioni` (`id_tabella`, `nome`, `ordine`) 
    VALUES 
        ('18', 'AfS Pulito', '0'), 
        ('18', 'AfS', '1'), 
        ('18', 'Denominazione', '2'),
        ...

通过这种方式,您可以使用正常的mysql :: query,而无需担心执行多个查询的SQL注入。 您仍然需要转移用户的输入以保护您的查询。