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