php pdo подготовил операторы: bindParam не работает - PullRequest
0 голосов
/ 04 сентября 2011

почему это не работает:

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 ]

2 голосов
/ 04 сентября 2011

Причина в том, что bindParam связывает переменную (а не ее значение) с параметром. Однако значение $v меняется с каждой итерацией цикла for, поэтому каждый из параметров вашего запроса будет иметь последний элемент в массиве в качестве значения (не то, что вы хотите, я уверен).

Я бы предложил использовать bindValue вместо bindParam

1 голос
/ 04 сентября 2011

Я не очень хорошо знаком с PDO, но, похоже, вы не можете связать переменную, которая постоянно меняется.Вместо этого используйте bindValue.

Также обратите внимание, что вы не должны использовать LIKE таким образом.Используйте = вместо

...