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"));

これは、期待値1で0を出力します。そこで、これを次のように変更しました。

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を出力し、2番目のコードが1を出力する理由を誰かが知っていますか?

(ところで-私はこれをシミュレートするようにしようとしていますmysql_num_rows

4

2 に答える 2

3

列名に変数を使用することはできません。列の値にのみ使用できます。

$haystackこれまでの方法では、の文字​​列値がの文字列値と等しいすべてのレコードを選択しています$needle。これはほとんど真実ではありません。trueの場合、テーブル内のすべての行が返されます。とにかく、それは確かにあなたが意図したものではなく、うまくいけば、それが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 に答える