Сбой SQL-ПОДОБНОГО запроса - фатальная ошибка в подготовленном операторе
Вопрос
У меня есть следующий код:
$countQuery = "SELECT ARTICLE_NO FROM ? WHERE upper(ARTICLE_NAME) LIKE '% ? %'";
if ($numRecords = $con->prepare($countQuery)) {
$numRecords->bind_param("ss", $table, $brand);
$numRecords->execute();
$data = $con->query($countQuery) or die(print_r($con->error));
$rowcount = mysql_num_rows($data);
$rows = getRowsByArticleSearch($query, $table, $max);
$last = ceil($rowcount/$page_rows);
}
Который должен работать нормально.Однако я получаю сообщение об ошибке, которое :
У вас ошибка в вашем синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом '?ГДЕ верхний (ARTICLE_NAME) НРАВИТСЯ '%?%" в строке 1
Если я поставлю
SELECT ARTICLE_NO FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE '% o %';
Запрос работает нормально.$table определен выше, и запрос получен из GET, и оба являются правильными допустимыми значениями.Почему это не удается?
Редактировать:переход на:
$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE '% ? %'";
if ($numRecords = $con->prepare($countQuery)) {
$numRecords->bind_param("s", $query);
приводит к ошибке:
Предупреждение:mysqli_stmt::bind_param() [mysqli-stmt.bind-param]:Количество переменных не соответствует количеству параметров в подготовленной инструкции в C:\Program Files\EasyPHP 3.0\www\prog\get_records.php в строке 38
Команды не синхронизированы;сейчас вы не можете выполнить эту команду
где как
$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE ?";
if ($numRecords = $con->prepare($countQuery)) {
$numRecords->bind_param("s", "%".$query."%");
приводит к
Фатальная ошибка:Не удается передать параметр 2 по ссылке в C:\Program Files\EasyPHP 3.0\www\prog\get_records.php в строке 38
и, наконец,
$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE ? ";
if ($numRecords = $con->prepare($countQuery)) {
$numRecords->bind_param("s", $query);
даст только:
Команды не синхронизированы;сейчас вы не можете выполнить эту команду
Неужели невозможно использовать параметр для ПОДОБНОГО состояния?
Решение
Для LIKE
предложение, используйте это:
SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE CONCAT('%', ?, '%')
Что касается имени таблицы, то использовать имена таблиц в качестве параметров - крайне плохая практика.
Если по какой-то причине вам все еще нужно это сделать, вам нужно будет встроить это в текст запроса перед подготовкой запроса:
$countQuery = "SELECT ARTICLE_NO FROM $table_name WHERE upper(ARTICLE_NAME) LIKE CONCAT('%', ? ,'%')";
if ($numRecords = $con->prepare($countQuery)) {
$numRecords->bind_param("s", $brand);
$numRecords->execute();
$data = $con->query($countQuery) or die(print_r($con->error));
$rowcount = mysql_num_rows($data);
$rows = getRowsByArticleSearch($query, $table, $max);
$last = ceil($rowcount/$page_rows);
}
Другие советы
Выдали ли вы
mysqli_free_result($result);
после последнего запроса?Это ошибка несинхронизации команды.
Однако это должно сработать
$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE ?";
if ($numRecords = $con->prepare($countQuery)) {
$numRecords->bind_param("s", "%".$query."%");
Интересно, что находится в переменной $query.Попробуйте сделать это вместо этого
$query = '%'.$query.'%';
$numRecords->bind_param("s", $query);
Вместо этого попробуйте следующее:
$countQuery = "SELECT ARTICLE_NO FROM ? WHERE upper(ARTICLE_NAME) LIKE ?";
if ($numRecords = $con->prepare($countQuery)) {
$numRecords->bind_param("ss", $table, "%$brand%");
$numRecords->execute();
$data = $con->query($countQuery) or die(print_r($con->error));
$rowcount = mysql_num_rows($data);
$rows = getRowsByArticleSearch($query, $table, $max);
$last = ceil($rowcount/$page_rows);
}
Afaik, вы не можете использовать заполнители для идентификаторов с помощью инструкций mysqli и prepare.Таким образом, вам придется вручную интерполировать имя таблицы в запрос.