#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(); } }
Комментариев нет:
Отправить комментарий