php pdo预处理语句:bindParam不起作用


php pdo prepared statements: bindParam doesn't work

为什么不工作:

public function query($query, $vars = array())
{
    $link = $this->getLink();
    if($link)
    {
        $stmt = $link->prepare($query);
        if($stmt)
        {
            if(count($vars)>0)
            {
                $count = 1;
                foreach($vars as $v)
                {
                    $stmt->bindParam($count, $v);
                    $count++;
                }
            }
            if($stmt->execute())
                return $stmt->fetch(PDO::FETCH_ASSOC);
        }
    }
    return false;
}

和这个工作:

public function query($query, $vars = array())
{
    $link = $this->getLink();
    if($link)
    {
        $stmt = $link->prepare($query);
        if($stmt)
        {
            if($stmt->execute($vars))
                return $stmt->fetch(PDO::FETCH_ASSOC);
        }
    }
    return false;
}
调用:

$result = $db->query('select * from users where user like ? and email like ?',array('my_user', 'myemail@domain.com'));

编辑最终代码:

public function query($query, $vars = array())
{
    $link = $this->getLink();
    if($link)
    {
        $stmt = $link->prepare($query);
        if($stmt)
        {
            if(count($vars)>0)
            {
                $count = 1;
                foreach($vars as $v)
                {
                    $stmt->bindValue($count, $v);
                    $count++;
                }
            }
            if($stmt->execute())
                return $stmt->fetch(PDO::FETCH_ASSOC);
        }
    }
    return false;
}

原因是bindParam绑定了一个变量(而不是它的值)到一个参数。然而,$v的值随着for循环的每次迭代而变化,因此您查询的每个参数都将数组中的最后一项作为其值(我确定不是您想要的)。

我建议使用bindValue而不是bindParam

我不是非常熟悉PDO,但似乎你不能绑定一个不断变化的变量。请使用bindValue。

还要注意,你不应该这样使用LIKE。使用=代替