PHP PDO ::准备查询构建 - mysql函数的问题

时间:2012-11-22 10:46:22

标签: php pdo

相关问题,但对我没有帮助: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'。这不是一个好的,但它确实有效。

3 个答案:

答案 0 :(得分:1)

我这样说:

$bdd->prepare(INSERT INTO `table_name` (`abc`, `def`, `ghi`) VALUES (?, ?, ?))
$bdd->execute(array('abcValue', 'devValue', 'ghiValue'))

答案 1 :(得分:1)

为该方法添加另一个参数:

  • 表名称
  • values(作为关联数组)
  • sql(作为关联数组)

请记住,你不能使用'?'当你想要访问列时,e。 G。在COLUMN1 + 1COLUMN1 + COLUMN2

答案 2 :(得分:0)

您上次查询时出现错误( -- error, incorrect datetime value: 'NOW()') 请尝试格式化您的日期:

DATE_FORMAT(now(), '%Y-%m-%d %H:%i:%s'))