Как исправить ошибку mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement?
Добрый день. Только недавно разобралась с подготовленными запросами. Возникла проблема с выборкой из БД. При обычном запросе все идеально работает, но стоит сделать подготовленный запрос, то выдает ошибку mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement . Не понимаю в чем причина. Помогите, пожалуйста, разобраться.
$inputSearch = $_POST['search']; $inputSearch = trim($inputSearch); $inputSearch = mysqli_real_escape_string($conn, $inputSearch); $inputSearch = htmlspecialchars($inputSearch); $sql = $conn->prepare("select * from post_comment where body like '%?%'"); $sql->bind_param("s", $inputSearch); $sql->execute(); $result = $sql->get_result(); $itog = mysqli_fetch_assoc($result); |
$inputSearch = $_POST['search']; $inputSearch = trim($inputSearch); $inputSearch = mysqli_real_escape_string($conn, $inputSearch); $inputSearch = htmlspecialchars($inputSearch); $sql = $conn->prepare("select * from post_comment where body like '%?%'"); $sql->bind_param("s", $inputSearch); $sql->execute(); $result = $sql->get_result(); $itog = mysqli_fetch_assoc($result);
Ругается на $sql->bind_param("s", $inputSearch);
Дополнительно:
вот только mysqli_real_escape_string надо убрать, эта функция вообще никогда не нужна.
а htmlspecialchars надо применять только при выводе в HTML, а здесь её быть не должно.
И непонятно, почему вы используете fetch_assoc а не fetch_all. Ведь запрос с like может вернуть и больше одной строки
И поиск делается методом GET, а не POST
Плейсхолдером можно подставить только параметр, вы же пытаетесь использовать его как подстановку содержимого строки.
- $sql = $conn->prepare("select * from post_comment where body like '%?%'"); + $sql = $conn->prepare("select * from post_comment where body like CONCAT('%', ?, '%')"); |
- $sql = $conn->prepare("select * from post_comment where body like '%?%'"); + $sql = $conn->prepare("select * from post_comment where body like CONCAT('%', ?, '%')");
- Спасибо, огромное, а есть документация, где есть больше информации про подготовленные запросы или может книга какая-то? Я бы с удовольствием ознакомилась.
- Lion97icvc, ну вообще, по ссылке, которую вам давали, именно это и написано:
ВАЖНО: нельзя добавлять к знакам вопроса кавычки — вы добавляете плейсхолдеры, а не строки.
Дальше, озаботившись невозможностью добавить знаки процента, можно набрать в браузере mysqli prepare like и сразу получить ответ на свой вопрос.
Я это не к тому чтобы вас упрекнуть: никто не воспринимает новую информацию целиком с первого раза. А скорее к тому, что вопрос не всегда только в наличии документации.
- Ипатьев, я не в коем случае не воспринимаю ваши слова в упрек. Благодарю)
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Ошибка mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement возникает, когда количество переменных, переданных в метод bind_param не соответствует количеству параметров в подготовленном запросе.
Для исправления этой ошибки необходимо убедиться, что количество переменных, передаваемых в метод bind_param, соответствует количеству параметров в запросе.
Пример кода на PHP, демонстрирующий правильное использование метода bind_param:
// Подготовленный запрос с двумя параметрами $query = "SELECT * FROM users WHERE id = ? AND name = ?"; $stmt = $mysqli->prepare($query); // Привязываем переменные к параметрам запроса $id = 1; $name = "John"; $stmt->bind_param("is", $id, $name); // Выполняем запрос $stmt->execute();
В данном примере мы имеем подготовленный запрос с двумя параметрами - id и name. Метод bind_param привязывает переменные $id и $name к соответствующим параметрам запроса. Обратите внимание, что первый параметр метода bind_param - строка с типами данных переменных (в данном случае "is" для целого числа и строки), а затем идут сами переменные.
Таким образом, следует убедиться, что количество переменных и их типы соответствуют количеству параметров и их типам в подготовленном запросе, чтобы избежать ошибки mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement.