相关问题,但对我没有帮助:为什么不能将 MYSQL 函数传递给准备好的 PDO 语句?
这是交易:我正在为 PHP PDO 编写一个抽象层并实现一个查询构建器。
这个确切的问题只发生在 INSERT 语句中。这是我的代码示例:
$db->insert('table_name')
->keys(array('abc', 'def', 'ghi'))
->values(array($var1, $var2, $var3)) // can take a 2D array if you want to insert multiple rows at the same time
->execute();
底层代码使用 ? 而不是值来构建查询字符串。对于此特定示例,查询将导致以下结果:
INSERT INTO `table_name`
(`abc`, `def`, `ghi`)
VALUES
(?, ?, ?)
在调用execute()
时,它将值作为一维数组传递PDOStatement::execute()
(即,与问号关联的所有值都放在一个数组中)。这就是问题开始的地方 -PDOStatement::execute()
不处理 MySQL 函数,而是将它们作为字符串引用,从而中断查询:
INSERT INTO `table_name`
(`abc`, `def`, `ghi`)
VALUES
('123', 456, 'NOW()') -- error, incorrect datetime value: 'NOW()'
问题是 - 我如何在保持相同界面的同时完成这项工作?我知道我可以检查列的值是否是 MySQL 函数并将其直接放入而不是问号,但有很多函数可以在那里使用,这会很糟糕。
编辑:所以目前看来,最简单的选择是简单地将值设置为这样:$var3 => 'noquote'
. 这不是一个很好的方法,但它确实有效。