【问题标题】:Weird PDO behavior when reusing variable for bindParam为 bindParam 重用变量时的奇怪 PDO 行为
【发布时间】:2012-12-15 23:14:16
【问题描述】:

我对 pdo 的这种意外行为感到困惑:

考虑一下我写的这个简单的查询:

    $username = "vidhu";
    $numResults = 10;

    $db_vc = new PDO(DB_ADDRESS, DB_USER, DB_PASS);
    $stmt = $db_vc->prepare("SELECT username, email FROM users WHERE username = :username LIMIT :numResults");
    $stmt->bindParam(':username', $username, PDO::PARAM_STR);
    $stmt->bindParam(':numResults', $numResults, PDO::PARAM_INT);
    $stmt->execute();
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    print_r($result);

这给了我预期的输出:

Array ( [0] => Array ( [username] => vidhu [email] => someone@gmail.com) )

现在让我感到困惑的是。当我像这样复制并粘贴查询时

    $username = "vidhu";
    $numResults = 10;       
    $db_vc = new PDO(DB_ADDRESS, DB_USER, DB_PASS);
    $stmt = $db_vc->prepare("SELECT username, email FROM users WHERE username = :username LIMIT :numResults");
    $stmt->bindParam(':username', $username, PDO::PARAM_STR);
    $stmt->bindParam(':numResults', $numResults, PDO::PARAM_INT);
    $stmt->execute();
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    print_r($result);

    echo "<br />";        

    $username = "vidhu";
    $numResults = 10;   
    $db_vc = new PDO(DB_ADDRESS, DB_USER, DB_PASS);
    $stmt = $db_vc->prepare("SELECT username, email FROM users WHERE username = :username LIMIT :numResults");
    $stmt->bindParam(':username', $username, PDO::PARAM_STR);
    $stmt->bindParam(':numResults', $numResults, PDO::PARAM_INT);
    $stmt->execute();
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    print_r($result);

我希望输出也会被复制,对吗?比如:

Array ( [0] => Array ( [username] => vidhu [email] => someone@gmail.com ) )
Array ( [0] => Array ( [username] => vidhu [email] => someone@gmail.com) )

但它不会产生那个输出!。第二个查询不返回任何内容它显示如下:

Array ( [0] => Array ( [username] => vidhu [email] => xx.vidhuxx@gmail.com ) ) 
Array ( )

这是为什么?谁能解释一下?


编辑

如果我删除原始和副本中的 :numResults 参数,并在查询中硬编码 10,它将完美运行!

【问题讨论】:

  • 奇怪。如果删除重新连接会怎样?
  • “如果我删除原始和副本中的 :numResults 参数以及查询中的硬编码 10,它将完美运行” => EMULATE_PREPARES 和 LIMIT 子句的经典案例。让我来个骗子……
  • How do I use pdo's prepared statement for order by and limit clauses? 的可能重复项——特别是,您可能看不到此处抛出的警告...
  • @Charles 假设删除重新连接意味着删除复制参数中的这一行 $db_vc = new PDO(DB_ADDRESS, DB_USER, DB_PASS);。它不起作用。结果相同

标签: php pdo parameterized-query


【解决方案1】:

好吧,我想我找到了问题所在。

在第一个副本和第二个副本之间我添加了var_dump($numResults)。加载页面时显示在执行第一个查询副本后变量已转换为字符串。我真的不知道为什么会这样。

Array ( [0] => Array ( [username] => vidhu [email] => someone@gmail.com ) ) 
string(2) "10" 
Array ( )

所以我修复它的方式不是使用$stmt-&gt;bindParam,而是使用$stmt-&gt;bindValue 同样,我不知道机制或发生了什么,但它有效。

如果有人能解释为什么会发生这种行为会很好,即为什么变量从整数更改为字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 2021-10-27
    相关资源
    最近更新 更多