Сбой SQL-ПОДОБНОГО запроса - фатальная ошибка в подготовленном операторе

StackOverflow https://stackoverflow.com/questions/601992

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня есть следующий код:

$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.Таким образом, вам придется вручную интерполировать имя таблицы в запрос.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top