问题如下:我在php数组中打包了一系列INSERT
查询。通过implode
函数,我将总查询发送到数据库引擎(使用mysqli
类)。
$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}}字段中,则总查询工作正常。
我无法弄清楚问题是什么......
提前感谢任何建议......
答案 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注入。 您仍然需要转移用户的输入以保护您的查询。