1

相关问题,但对我没有帮助:为什么不能将 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'. 这不是一个很好的方法,但它确实有效。

4

3 回答 3

1

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

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

请记住,您不能使用“?” 当您想要访问列时,例如 inCOLUMN1 + 1COLUMN1 + COLUMN2.

于 2012-11-22T10:53:53.963 回答
1

我是这样进行的:

$bdd->prepare(INSERT INTO `table_name` (`abc`, `def`, `ghi`) VALUES (?, ?, ?))
$bdd->execute(array('abcValue', 'devValue', 'ghiValue'))
于 2012-11-22T10:49:58.603 回答
0

您的最后一个查询出现错误( -- error, incorrect datetime value: 'NOW()') 尝试像这样格式化您的日期:

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

于 2012-11-22T11:01:33.713 回答