【问题标题】:Parameter binding fails where concatenation works在串联起作用的地方参数绑定失败
【发布时间】:2009-10-26 14:58:22
【问题描述】:

我正在尝试使用 pdo 从 php 执行以下 sql:SELECT * FROM my_table WHERE name=?.

当我这样做时:

$sql = 'SELECT * FROM my__table WHERE name=?' ;  
$stmt = $dbconn->prepare($sql);  
$stmt->bindValue(1, $_POST['name'], PDO::PARAM_STR);  
$stmt->execute();   

我得到一个空的结果集。

当我这样做时:

$sql = 'SELECT * FROM my__table WHERE name=\''.$_POST['name'].'\'' ;  
$stmt = $dbconn->prepare($sql);  
$stmt->execute();  

我得到了我需要的行。

“名称”列是 VARCHAR(32)。这个错误只发生在字符串上。当绑定参数是 sql INTEGER 时,一切都按预期工作。

我在 Ubuntu 的 Apache 下使用 sqlite3, php 5.2.6。

【问题讨论】:

    标签: php sqlite pdo parameterbinding


    【解决方案1】:

    这个怎么样?

    $sql = "SELECT * FROM my__table WHERE name='?'" ;  
    $stmt = $dbconn->prepare($sql);  
    $stmt->bindValue(1, $_POST['name'], PDO::PARAM_STR);  
    $stmt->execute();
    

    【讨论】:

      【解决方案2】:

      这两个都应该工作:

      不使用绑定

      $sql = "SELECT * FROM my__table WHERE name = ?" ;
      $stmt = $dbconn->prepare($sql);
      $stmt->execute(array($_POST['name']));

      使用命名参数

      $sql = "SELECT * FROM my__table WHERE name = :name" ;
      $stmt = $dbconn->prepare($sql);
      $stmt->bindParam(':name', $_POST['name'], PDO::PARAM_STR);
      $stmt->execute(array($_POST['name']));

      【讨论】:

      • 那行得通。但这仍然是一种解决方法:)此时我已经切换到使用整数键(出于不相关的原因。)但我仍然想知道为什么绑定参数会像这样中断。如果有人还在搜索,我发现了一个看起来像我遇到的错误:bugs.php.net/bug.php?id=46803
      猜你喜欢
      • 2017-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-18
      • 2018-04-01
      相关资源
      最近更新 更多