1

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

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

4

2 回答 2

3

您不能使用变量作为列名。您只能将其用于列值。

按照您的操作方式,您选择的是字符串值$haystack等于 的字符串值的所有记录$needle。这几乎永远不会是真的。如果它是真的,它只会返回表中的所有行。无论如何,这肯定不是您想要的,并希望能解释为什么它返回 0 结果。

于 2012-08-03T02:19:07.017 回答
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.
}
于 2012-08-03T02:31:46.360 回答