这是我的函数:
function countRows($sql, $parameters){
$db = new PDO("mysql:host=localhost;dbname=cms","root");
$result = $db->prepare($sql);
foreach ($parameters as $key => $parameter) {
$result->bindParam($key, $parameter);
}
$result->execute();
$number_of_rows = $result->fetchAll();
return count($number_of_rows);
}
像这样的$parameters数组工作得很好:
$parameters=array("key"=>"parameter");
但当数组有更多的键和变量时,它只会给出0 的结果
例如,对于这样的数组,它给了我0行,而它应该是3
$parameters=array("key"=>"parameter", "key2"=>"parameter2");
编辑:
查询示例:
"SELECT * FROM users WHERE username=:username AND password=:password"
此查询的$参数示例:
$parameters = array(":username"=>$username, ":password"=>$password);
当我用一列(比如只有用户名或只有密码)运行它时,它运行得很好,两者都返回0。
问题是,您将bindParam()
用于更改其值的变量:
foreach ($parameters as $key => $parameter) {
$result->bindParam($key, $parameter);
}
您必须理解bindParam()
通过引用绑定变量,而不是绑定时变量的值。
您正在将变量$parameter
绑定到查询中的两个参数。在调用execute()
之前,不会发送该值。因此,它在循环结束后发送变量的值,即密码。
我通过在MySQL服务器上启用通用查询日志来测试这一点,并观察记录的内容:
140905 10:09:45 49 Connect root@192.168.56.1 on test
49 Prepare SELECT * FROM users WHERE username=? AND password=?
49 Execute SELECT * FROM users WHERE username='password' AND password='password'
49 Close stmt
49 Quit
您可以通过以下两种方式解决此问题:
使用
bindValue()
而不是bindParam()
。这将在执行绑定时复制$parameter
的值。或者,您不需要一次一个地对绑定参数进行循环,只需将数组传递给
execute()
:$result->execute($parameters);
我不知道为什么这么多开发人员认为他们需要编写代码来一次绑定一个参数。将参数数组直接传递给execute()
更容易。
您的参数应该看起来像数组
$parameters = [
"key" => "parameter",
"key2 " => "parameter2"
];
然后你错过了密码
$db = new PDO("mysql:host=localhost;dbname=cms","root","your_password");
我的想法是看看PDOStatement::bindParam Docs