PHP PDO查询无法使用Vars?

时间:2012-08-03 02:14:35

标签: php mysql pdo

我在这里有点困惑。我有以下代码:

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

2 个答案:

答案 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.
}