Intereting Posts
PHP – редактирование / удаление определенной строки в файле Преобразование всех относительных URL-адресов в Абсолютные URL-адреса при сохранении содержимого Почему рекомендуется избегать вложенных блоков в функции? (PHP) Использование javascript history.back () не работает в Safari .. как мне сделать его кросс-браузер? PHP 7 DomDocument не найден Подходящая библиотека для записи PDF с использованием воспламенителя кода Показывая мою страну на основе моего IP, mysql оптимизирован PHP: чтение конкретной строки из файла как вставлять и извлекать изображения в базу данных и из нее, используя php извлекать данные из контроллера в json-код воспламенителя $ .post не отправлять данные Выбор узлов с использованием xPath с объединениями отправить форму внутри другой формы насколько зрелым является HTML + CSS в отношении создания отчетов для печати? Кнопка отправки формы формы Yii, показывающая ошибку

Сбой запроса SQL LIKE – фатальная ошибка в подготовленном сообщении

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

$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, для правильного синтаксиса для использования рядом с '? WHERE upper (ARTICLE_NAME) LIKE '%?%' 'В строке 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 on line 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 statament?

Для предложения 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 и подготовить заявления. Поэтому вам придется вручную интерполировать имя таблицы в запрос.