我对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,那么它的效果非常好!
答案 0 :(得分:0)
好的我觉得我发现了问题。
第一个副本和第二个副本之间的我添加了var_dump($numResults)
。加载页面时显示在执行查询的第一个副本后变量已转换为字符串。我真的不知道为什么会这样。
Array ( [0] => Array ( [username] => vidhu [email] => someone@gmail.com ) )
string(2) "10"
Array ( )
所以我修复它的方式不是使用$stmt->bindParam
我使用$stmt->bindValue
同样,我不知道机制或发生了什么,但它的工作原理。
如果有人能够解释为什么会出现这种类型的行为,那么为什么变量会从整数变为字符串会很好。