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