相关问题,但对我没有帮助: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'
。这不是一个好的,但它确实有效。
答案 0 :(得分:1)
我这样说:
$bdd->prepare(INSERT INTO `table_name` (`abc`, `def`, `ghi`) VALUES (?, ?, ?))
$bdd->execute(array('abcValue', 'devValue', 'ghiValue'))
答案 1 :(得分:1)
为该方法添加另一个参数:
请记住,你不能使用'?'当你想要访问列时,e。 G。在COLUMN1 + 1
或COLUMN1 + COLUMN2
。
答案 2 :(得分:0)
您上次查询时出现错误( -- error, incorrect datetime value: 'NOW()')
请尝试格式化您的日期:
DATE_FORMAT(now(), '%Y-%m-%d %H:%i:%s'))