2015-11-13 3 views
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)'); 

Если я изменю line to:

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

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

+0

А вы попробуйте запрос, который не работает на стороне клиента, чтобы увидеть, что сервер должен сказать об этом? – Jon

+0

Да, журналы ошибок apache: «PHP Неустранимая ошибка: вызов функции-члена fetch_assoc() для не-объекта», только когда запрос $ resource использует «WHERE MATCH» – PublicDisplayName

+0

Я имею в виду запрос MySql. Если вы запустите его вручную, сервер скажет вам, что именно не так с ним. – Jon

ответ

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() для не-объекта " – PublicDisplayName

+0

Тогда возникла проблема с вызовом' prepare() '. Правильно ли инициализируется соединение с базой данных? На каждом этапе пути должна быть проверка ошибок; Я просто взял ваш код и немного изменил его. Я не очень разбираюсь в непосредственном использовании функций 'mysqli_ *'. – miken32

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

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

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

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

Смежные вопросы