重用bindParam变量时出现奇怪的PDO行为

时间:2012-12-15 23:14:17

标签: php pdo parameterized-query

我对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) )

但它不会产生那个输出! seond查询不会返回任何,它会显示如下:

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

这是为什么?有人可以解释一下吗?


修改

如果我删除了原始版本和副本中的:numResults参数以及查询中的硬编码10,那么它的效果非常好!

1 个答案:

答案 0 :(得分:0)

好的我觉得我发现了问题。

第一个副本和第二个副本之间的

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

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

所以我修复它的方式不是使用$stmt->bindParam我使用$stmt->bindValue 同样,我不知道机制或发生了什么,但它的工作原理。

如果有人能够解释为什么会出现这种类型的行为,那么为什么变量会从整数变为字符串会很好。