【问题标题】:PHP PDO::prepare query building - problems with mysql functionsPHP PDO::prepare 查询构建 - mysql 函数的问题
【发布时间】: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 - 减少人为错误是原因之一。
  • 也许你应该发布你的插入函数。

标签: php pdo


【解决方案1】:

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

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

【讨论】:

  • 错了,之所以这么说是因为该值是带引号的字符串,并且 MySQL 函数必须不带引号。 IE。它必须是INSERT INTO .. VALUES ('abc', NOW()),而不是INSERT INTO .. VALUES ('abc', 'NOW()')
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    我是这样处理的:

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

    【讨论】:

    • 如果我只插入一行(不能以这种方式自动执行多行),它将需要我手动指定 col1/col2 是变量,而 col3 是 MySQL 函数.所以,是的,并没有真正的帮助。
    猜你喜欢
    • 1970-01-01
    • 2014-01-20
    • 2016-12-20
    • 2011-09-20
    • 2013-07-23
    • 1970-01-01
    • 2015-03-17
    • 2011-06-04
    • 2015-12-08
    相关资源
    最近更新 更多