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

时间:2011-09-04 10:39:17

标签: php pdo prepared-statement

为什么这不起作用:

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;
}

2 个答案:

答案 0 :(得分:2)

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

我建议使用bindValue代替bindParam

答案 1 :(得分:1)

我对PDO并不是非常熟悉,但似乎你无法绑定一个不断变化的变量。请改用bindValue。

另请注意,您不应该以这种方式使用LIKE。请改用=