Вызов функции-члена fetch_assoc () MySQLi - WHERE MATCH $ term

1

Я пытаюсь запросить мою базу данных, используя Sphinx Search, используя MySQLi.

То, что я пытаюсь достичь, заключается в том, что пользователь вводит термин, который затем используется для запроса моей базы данных и возвращает значения. Однако я получаю ошибку:

"Вызовите функцию-член fetch_assoc() для не-объекта"

$conn = new mysqli('127.0.0.1', 'null', 'null', 'null', 9306); 
if ($conn->connect_error) {
throw new Exception('Connection Error: ['.$conn->connect_errno.'] '.$conn->connect_error, $conn->connect_errno);
}

$term = $_GET['q'];

echo "$term";  


$resource = $conn->query('SELECT * FROM test1 WHERE MATCH (title, description) AGAINST ($term)');
$results = array();
while ($row = $resource->fetch_assoc()) {
$results[] = $row;
}
$resource->free_result(); 

var_dump($results);

Оскорбительная строка выглядит следующим образом:

$resource = $conn->query('SELECT * FROM test1 WHERE MATCH (title, description) AGAINST ($term)');

Если я изменил строку на:

$resource = $conn->query('SELECT * FROM test1')

Запрос выполняется нормально, однако мне нужен запрос для соответствия $ term, но у меня возникают проблемы, и я не понимаю, почему.

  • 0
    И вы пробовали запрос, который не работает на клиенте, чтобы увидеть, что сервер говорит об этом?
  • 0
    Да, журналы ошибок apache читают: «Неустранимая ошибка PHP: вызов функции-члена fetch_assoc () для необъекта», только когда запрос $ resource использует «WHERE MATCH»
Показать ещё 4 комментария
Теги:
mysqli
sphinx

2 ответа

1

Вы не цитируете материал, который вы вкладываете в свой запрос.

И даже если бы вы были, это могло бы не сработать. Или это может просто удалить весь набор данных! Если вы вводите введенные пользователем данные в базу данных, вы должны быть осторожны. Используйте подготовленный запрос; если вы хотите мой совет, сбросьте API mysqli и перейдите на более высокий уровень, например PDO.

$conn = new mysqli('127.0.0.1', 'null', 'null', 'null', 9306); 
if ($conn->connect_error) {
    throw new Exception('Connection Error: ['.$conn->connect_errno.'] '.$conn->connect_error, $conn->connect_errno);
}

$term = $_GET['q'];

echo "$term";  

$statement = $conn->prepare('SELECT * FROM test1 WHERE MATCH (title, description) AGAINST (?)');
$statement->bind_param("s", $term);
$statement->execute();
$result = $statement->get_result();
while ($row = $result->fetch_array(MYSQLI_NUM)) {
    $results[] = $row;
}
var_dump($results);
  • 0
    Хорошо, я понял. Я думаю, что подготовленный запрос с использованием PDO был бы подходящим вариантом - однако при использовании вашего примера в строке 10, где он читает «AGAINST ($ term)», я получаю сообщение об ошибке «Вызов функции-члена bind_param () для необъекта» "
  • 0
    Тогда должна быть проблема с вызовом prepare() . Правильно ли инициализируется подключение к вашей базе данных? Должна быть проверка ошибок на каждом этапе пути; Я просто взял твой код и немного его изменил. Я не mysqli_* использовании mysqli_* функций напрямую.
0
$resource = $conn->query('SELECT * FROM test1 WHERE MATCH (title, description) AGAINST ($term)');

Это запрос MySQL. То, что MySQL использует для выполнения полнотекстового запроса.

Вы подключаетесь к Sphinx (порт 9306 отдает его), поэтому должен быть запущен SphinxQL.

Поиск синтаксиса SphinxQL SELECT... http://sphinxsearch.com/docs/current.html#sphinxql-select

Ещё вопросы

Сообщество Overcoder
Наверх
Меню