Ошибка SQL LIKE - фатальная ошибка в подготовленном операторе - PullRequest
1 голос
/ 02 марта 2009

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

$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 %';

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

Ответы [ 4 ]

7 голосов
/ 03 марта 2009

Для предложения 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);
}
2 голосов
/ 03 марта 2009

Вы уже выдали

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);
0 голосов
/ 02 марта 2009

Afaik, вы не можете использовать заполнители для идентификаторов с mysqli и подготовить операторы. Поэтому вам придется вручную интерполировать имя таблицы в запрос.

0 голосов
/ 02 марта 2009

Попробуйте вместо этого:

$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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...