Страницы

Поиск по вопросам

воскресенье, 8 марта 2020 г.

PDO - исполнение запроса с избыточным массивом параметров

#php #pdo


Tакой код работает

    $info = array();
    $info[':nik'] = trim($_POST['nik']);
    $info[':phone'] = trim($_POST['phone']);
    $info[':FIO'] = trim($_POST['FIO']);
    $info[':email'] = trim($_POST['email']);

    $sql = "select count(*) from `punbb_users` where `email` = :email limit 1";
    $count = $DB->getOne($sql, array(':email' => $info[':email']));


Но если заменить последнюю строку: 

 $count = $DB->getOne($sql, $info);


То уже ничего не работает.

Сама функция $DB->getOne() подготавливает и исполняет запрос через pdo 

public function getOne($sql, $params = NULL) {
    if (is_null($params)) {
        return $this->pdo->query($sql)->fetchColumn();
    }
    else {
        $stmt = $this->prepare($sql);
        $stmt->execute($params);
        return $stmt->fetchColumn();
    }
}

public function prepare($sql) {
    return $this->pdo->prepare($sql);
}


Это происходит от того, что нельзя передавать массив с другими параметрами, когда
нужен лишь один, или я что-то не так делаю? 

Желательна еще и ссылка на документацию, если так делать нельзя.
    


Ответы

Ответ 1



Да, количество параметров в запросе и в массиве, который передается методу prepare() должно совпадать, в противном случае, вам должна возвращаться следующая ошибка SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

Ответ 2



Если идентификатор параметра запроса всегда совпадает с ключом массива $params, то можно было бы немного изменить метод getOne(), используя метод PDOStatement::bindValue в цикле: public function getOne($sql, $params = NULL) { if (is_null($params)) { return $this->pdo->query($sql)->fetchColumn(); } else { $stmt = $this->prepare($sql); foreach ($params as $key => $param) { $placeholder = ':'.$key; if (strpos($sql, $placeholder) !== false) { $stmt->bindValue($placeholder, $param, PDO::PARAM_STR); } } $stmt->execute(); return $stmt->fetchColumn(); } }

Комментариев нет:

Отправить комментарий