功能不适用于更多参数

时间:2014-09-17 17:32:10

标签: php pdo count prepared-statement

这是我的功能:

    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。

2 个答案:

答案 0 :(得分:0)

您的参数应该看起来像数组

$parameters = [
 "key"   =>  "parameter",
 "key2 " =>  "parameter2"
];

然后你错过了密码

$db = new PDO("mysql:host=localhost;dbname=cms","root","your_password");

我的想法看看PDOStatement::bindParam Docs

答案 1 :(得分: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()