【问题标题】:Doctrine DBAL prepared queryDoctrine DBAL 准备查询
【发布时间】:2015-11-09 23:29:33
【问题描述】:

我正在使用 PHP 学说 DBAL,我想做的是这样的 get 方法:

function get($attr, $value){
    $conn = DriverManager::getConnection($params, $config);

    $sql = "SELECT * FROM mytable WHERE ? = ?";
    $statement = $conn->executeQuery($sql, array($attrs, $value));
    return $statement->fetchAll();        
}
get("id", 1);

但它不起作用。我想知道是否可以获取列和值的参数化。 这是我正在使用的文档: http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/data-retrieval-and-manipulation.html#executequery

【问题讨论】:

  • 您的查询只是一个字符串,手动操作它以插入您想要的列名?
  • 当然可以,但我还是想知道为什么这不起作用..

标签: php doctrine prepared-statement dbal


【解决方案1】:

不,这是不可能的。您不能动态绑定列名(这不是 doctrine/symfony 限制 - 这就是 DB 的工作方式)。 方式prepare语句works

准备好的语句基本上是这样工作的:

  1. 准备:创建 SQL 语句模板并将其发送到数据库。某些值未指定,称为参数 (标记为“?”)。示例:INSERT INTO MyGuests VALUES(?, ?, ?)
  2. 数据库对SQL语句模板进行解析、编译、查询优化,结果存储不执行
  3. 执行:稍后,应用程序将值绑定到参数,并且数据库执行该语句。应用程序 可以根据需要使用不同的语句多次执行该语句 价值观

因此,如果不知道要“使用”哪些列,则无法执行第 2 步。

替代解决方案: 你想要达到的可以通过先准备sql字符串,然后解析它(准备好的语句)然后绑定values

【讨论】:

    猜你喜欢
    • 2014-10-15
    • 1970-01-01
    • 2013-05-24
    • 2016-04-18
    • 1970-01-01
    • 2018-03-30
    • 2011-07-15
    • 2015-06-04
    • 2017-07-20
    相关资源
    最近更新 更多