【发布时间】:2012-11-10 18:04:31
【问题描述】:
相关问题,但对我没有帮助:Why cant you pass MYSQL functions into prepared PDO statements?
这是交易:我正在为 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'。这不是一个很好的方法,但它确实有效。
【问题讨论】:
-
PDO 已经是一个抽象。您添加另一层的目标是什么?
-
afaik pdo 没有 ->insert 语句,它有 ->query 和 ->prepare,因此除非您使用其他代码抽象,否则 insert() 应该什么都不做。跨度>
-
@Lucas - insert() 不是来自 PDO,这是我编写的一个函数,它返回一个对象,其中包含仅与 MySQL INSERT 语句相关的方法。 update() 和 select() 也一样。
-
@Olaf - 减少人为错误是原因之一。
-
也许你应该发布你的插入函数。