Php Slim框架-来自json的多个PDO更新

Php Slim框架-来自json的多个PDO更新,php,pdo,prepared-statement,slim,Php,Pdo,Prepared Statement,Slim,我试图使用Slim框架在json put请求中进行多次插入,但我得到一个奇怪的错误: SQLSTATE[22007]: Invalid datetime format: 1292 Truncated incorrect DOUBLE value: 'Chester' 即使名称是一个VARCHAR。它在$sth->execute行中显示错误。如果我只使用一个条目,它有时会起作用。这里是JSON [{"id":"2240","name":"Cheats","breed": "Maltys"}, {

我试图使用Slim框架在json put请求中进行多次插入,但我得到一个奇怪的错误:

SQLSTATE[22007]: Invalid datetime format: 1292 Truncated incorrect DOUBLE value: 'Chester'
即使名称是一个VARCHAR。它在$sth->execute行中显示错误。如果我只使用一个条目,它有时会起作用。这里是JSON

[{"id":"2240","name":"Cheats","breed": "Maltys"},
{"id":"2241","name":"Chester","breed":"Poodlexx"}]
代码:

DumpParams的输出:

SQL: [67] UPDATE pets p SET name = :name AND breed = :breed  WHERE p.id = :id

Doh,在我脑袋撞了两个小时后,这是一个不正确的SQL语句,应该是逗号而不是:

 foreach ($value as $p_key => &$p_value) {
            if ($p_key !== 'id') { //ignore the id
                $sql .= " $p_key = :$p_key,";
            }
        }
        $sql = preg_replace('/,$/', '', $sql)." WHERE p.id = :id";

这个错误消息来自数据库引擎(MySQL?),而不是PHP,更不用说Slim了。您应该检查
$sql
变量的值。在任何情况下,从安全的角度来看,您的总体方法看起来有点可怕……从安全角度来看,您可以为任何ID设置任何您喜欢的内容。。除此之外,还有什么我应该注意的吗?如果我正确理解了代码,那么作为JSON键提交的任何内容都将成为SQL文本表达式。您可以发送一个精心编制的请求,将其写入任意表中。我很乐意尝试打破它。。你有什么数据示例可以尝试吗?我远不是一个安全专家,但通常的方法是利用SQL注释语法,我想子查询可能会被滥用。很抱歉没有说得更具体,但正如我所说的,这并不是我的专业领域。首先,需要使用preg_替换来构建SQL字符串,这对我来说似乎是更高的缺陷原因。这里的一个轻量级替代方案是在数组中配对,然后内爆()。这将对它的功能更加严格(例如,如果没有匹配的元素)。从技术上讲,preg_replace()在这里起作用,所以就这么说吧。
 foreach ($value as $p_key => &$p_value) {
            if ($p_key !== 'id') { //ignore the id
                $sql .= " $p_key = :$p_key,";
            }
        }
        $sql = preg_replace('/,$/', '', $sql)." WHERE p.id = :id";