Как исправить ошибку mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement?

Ссылка скопирована
29 марта 2026 1 ответ

Добрый день. Только недавно разобралась с подготовленными запросами. Возникла проблема с выборкой из БД. При обычном запросе все идеально работает, но стоит сделать подготовленный запрос, то выдает ошибку 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 и сразу получить ответ на свой вопрос.

    Я это не к тому чтобы вас упрекнуть: никто не воспринимает новую информацию целиком с первого раза. А скорее к тому, что вопрос не всегда только в наличии документации.

  • Ипатьев, я не в коем случае не воспринимаю ваши слова в упрек. Благодарю)
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Сергей Миронов Ответ

Ошибка 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();

// Подготовленный запрос с двумя параметрами $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.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно