class Users {
function count_matched_rows($needle, $haystack){
global $userdb;
$query = $userdb->prepare("SELECT COUNT(*) FROM `users` WHERE ? = ?");
$query->execute(array($haystack, $needle));
return $query->fetchColumn();
}
}
$users = new Users();
print_r($users->count_matched_rows("jeremyfifty9", "username"));
其中打印0的预期值为1.所以我将其更改为:
class Users {
function count_matched_rows($needle, $haystack){
global $userdb;
$query = $userdb->prepare("SELECT COUNT(*) FROM `users` WHERE `username` = 'jeremyfifty9'");
$query->execute(array($haystack, $needle));
return $query->fetchColumn();
}
}
$users = new Users();
print_r($users->count_matched_rows("jeremyfifty9", "username"));
按预期打印1。有人知道为什么第一个代码打印0但第二个代码打印1?
(顺便说一句 - 我试图让它来模拟mysql_num_rows
)
答案 0 :(得分:3)
您不能将变量用于列名。您只能将其用于列值。
您完成此操作后,您将选择字符串值$haystack
等于字符串值$needle
的所有记录。这几乎永远不会成真。如果它是真的,它将只返回表中的所有行。无论如何,它肯定不是你想要的,并希望解释为什么它返回0结果。
答案 1 :(得分:2)
您不能将占位符/变量用于变量名称,仅用于值。
您可以在查询中发送变量名称和硬编码用户名。
另一种方法是根据白名单检查变量名称,并在查询中直接使用有效名称作为变量:
$whitelist = array('username', ....); // add all valid column names
// check for variable in whitelist
if (in_array($haystack, $whitelist))
{
$query = $userdb->prepare("SELECT COUNT(*) FROM `users` WHERE `$haystack` = ?");
$query->execute(array($needle));
// etc.
}