-2

Почему выскакивает такая ошибка?

Fatal error: Call to a member function fetch_assoc() on a non-object in Z:\home\Anastasiya\www\search.php on line 22

Хочу сделать поиск по сайту, с помощью БД. Создала БД "anastasiya" (в которой и буду совершать поиск) с таблицей "content".

Вот код:

    $areaywords = explode(" ", $words);
    print_r($areaywords);
    foreach ($areaywords as $key => $value){
        if (isset($areaywords[$key - 1]))
        $query_search .= ' OR ';
        $query_search .='`title` LIKE "%'.$value.'%" OR `text_article` LIKE "%'.$value.'%"';
    }

    $query = "SELECT * FROM content WHERE $query_search";
    echo $query;
    $mysqli = new mysqli("localhost", "root", "", "anastasiya");
    $result_set = $mysqli->query($query);
    $mysqli -> close();

    $i = 0;
    while ($row = $result_set->fetch_assoc()){
        $results[$i] = $row;
        $i++;
    }
    return $results;

}
if (isset ($_POST['bcearch'])){
    $words = $_POST['words'];
    $results = search($words);
}

Ругается на строку:

while ($row = $result_set->fetch_assoc()){
  • Интерпретатор PHP недвусмысленно дает вам понять, что функция $result_set->fetch_assoc должна вызываться без параметров. – Dmitriy Simushev Oct 06 '15 at 12:44
  • @Anastasiya, а зачем вы закрыли подключение к базе до выборки результатов из запроса? вы на этот мой вопрос ноль внимания обратили. – Visman Oct 06 '15 at 14:12
  • Вы не правы, я обратила внимание и приняла меры – Anastasiya Oct 06 '15 at 14:14
  • $mysqli = new mysqli("localhost", "root", "", "anastasiya"); $result_set = $mysqli->query($query); var_dump($result_set);exit;

    if ($mysqli->connect_errno) { die('Ошибка соединения: ' . $mysqli->connect_error); } else{echo 'Connect true';} $i = 0; while ($row = $result_set->fetch_assoc()){ $results[$i] = $row; $i++; } $mysqli -> close();

    return $results;

    – Anastasiya Oct 06 '15 at 14:14
  • Но это ничего не дало. – Anastasiya Oct 06 '15 at 14:15
  • Теперь этот постоянно меняющийся вопрос является дубликатом http://ru.stackoverflow.com/questions/423439/mysql-fetch-array-expects-parameter-1-to-be-resource-or-mysqli-result-boole – Ипатьев Oct 06 '15 at 14:17
  • Причем здесь одно к другому??? – Anastasiya Oct 06 '15 at 14:20

3 Answers3

0

У метода fetch_assoc() в скобочках ничего быть не должно.

while ($row = $result_set->fetch_assoc()){
  • Дело в том что когда я пишу так как вы сказали. У меня появляется ошибка "Call to a member function fetch_assoc() on a non-object in" – Anastasiya Oct 06 '15 at 13:12
  • @Anastasiya, а зачем вы закрыли подключение к базе до выборки результатов из запроса? – Visman Oct 06 '15 at 13:37
  • @AndrewGodin, почему там ни чего не должно быть? Вот тут http://php.net/manual/ru/mysqli-result.fetch-assoc.php явно написано array mysqli_fetch_assoc ( mysqli_result $result )? – Visman Oct 06 '15 at 13:38
  • Да. Спасибо. Это понятно. Только вот почему оно все равно не работает. – Anastasiya Oct 06 '15 at 13:45
  • 1
    @Anastasiya, кто кроме вас знает это? :) Лучше, наверное, вам зайти в правку вопроса и дополнить его текущим вариантом вашего кода и текущей ошибкой. А то в ответах и комментариях к ним много уже написано всего, что и не поймешь текущее состояние. – Visman Oct 06 '15 at 14:03
0
  1. Проверьте выполняется ли конечный запрос $query(который выводится после строки echo $query;) через консоль базы данных.
  2. Проверьте доступ к бд:

    if ($mysqli->connect_errno) { die('Ошибка соединения: ' . $mysqli->connect_error); }else{echo 'Connect true';}

  3. выполните var_dump($result_set); что показывает выполнение?

P.S.: зачастую проблема либо в некорректном запросе либо в настройке доступа к бд.

Alex
  • 6,488
  • echo $query; - выполняется отлично. Может что-то и правда с доступом к БД. Но как это отследить? Выполнила var_dump($result_set); - вывело bool(false) – Anastasiya Oct 06 '15 at 13:38
  • Показывает "Connect true". – Anastasiya Oct 06 '15 at 13:43
  • У меня есть БД "anastasiya" в ней создана таблица "content". А в таблице такие поля "id", "title" и "text_article". В таблице я создала 2 строки 1." title" - Ландшафтный дизайн; "text_article" -Занимаясь процессом обустройства альпинария, буква... – Anastasiya Oct 06 '15 at 13:56
  • Вот все что у меня выводится Array ( [0] => Ландшафтный [1] => дизайн ) SELECT * FROM content WHERE title LIKE "%Ландшафтный%" OR text_article LIKE "%Ландшафтный%" OR title LIKE "%дизайн%" OR text_article LIKE "%дизайн%" Fatal error: Call to a member function fetch_assoc() on a non-object in Z:\home\Anastasiya\www\search.php on line 22 – Anastasiya Oct 06 '15 at 13:57
  • Вот мой код http://pastebin.com/ZjJDc44C – Anastasiya Oct 06 '15 at 17:55
  • На данный момент ошибки нету, но результат поиска не выводит. Вот что выводит Array ( [0] => Ландшафтный [1] => дизайн [2] => ) SELECT * FROM contentConnect true – Anastasiya Oct 06 '15 at 17:58
  • @Anastasiya, пример самого просто вывода в Вашем случае http://pastebin.com/hB5xzdji строки 24-34. Попробуйте пример и напишите получилось ли вывести данные? – Alex Oct 06 '15 at 20:16
  • Спасибо. Что-то вывелось, только иероглифами. Вот: Array ( [0] => Ландшафтный [1] => дизайн ) SELECT * FROM contentConnect trueВсего найдено2 строк: id =1 title =Ландшафтный дизайн text_article =Занимаясь процессом обустройства альпинария, буквально ЋС‚ чудесно РїРѕРґРѕР – Anastasiya Oct 07 '15 at 08:51
  • Пробовала поменять кодировку на UTF-8 без ВОМ, не помогло. – Anastasiya Oct 07 '15 at 08:52
  • Вот что получилось: Array ( [0] => Ландшафтный [1] => дизайн ) SELECT * FROM contentConnect trueВсего найдено строк:

    Fatal error: Call to a member function fetch_assoc() on a non-object in Z:\home\Anastasiya\www\search.php on line 29

    – Anastasiya Oct 07 '15 at 09:09
-1

Как уже ответил Dmitriy Simushev, ответ на вопрос написан в Warning. Если перевести, то получится Warning: mysqli_result::fetch_assoc() ожидает только 0 параметров, дан 1. Об mysqli_fetch_assoc можно почитать тут http://php.net/manual/ru/mysqli-result.fetch-assoc.php

Вместо

$i = 0;
    while ($row = $result_set->fetch_assoc($result_set)){
        $results[$i] = $row;
        $i++;
    }

Попробуйте так

while ($row = $result_set->fetch_assoc()) {
        $results[] = array [$row['название_первого_поля'], $row['название_второго_поля'], и т.д.]
    }

И не стесняйтесь пользоваться https://translate.google.com/, а лучше, учите английский.

  • Скорее всего не удалось соединиться с БД. Попробуйте после $mysqli = new mysqli("localhost", "root", "", "anastasiya");поставить проверку if ($mysqli->connect_errno) { printf("Соединение не удалось: %s\n", $mysqli->connect_error); exit(); } – Konstantin Oct 06 '15 at 13:23
  • Я написала if ($mysqli->connect_errno) { die('Ошибка соединения: ' . $mysqli->connect_error); } else{echo 'Connect true';} И мне вывело -"Connect true" – Anastasiya Oct 06 '15 at 13:47
  • Хорошо, попробуйте после $result_set = $mysqli->query($query); поставить var_dump($result_set);exit; Если в $result_set что-то будет, тогда попробуйте $mysqli -> close(); перенести ниже и поставить перед return $results; – Konstantin Oct 06 '15 at 13:56
  • Что нужно написать после $result_set = $mysqli->query($query);? – Anastasiya Oct 06 '15 at 14:00
  • var_dump($result_set);exit; – Konstantin Oct 06 '15 at 14:01
  • Теперь оно не ругается. Но и не выдает результат(( – Anastasiya Oct 06 '15 at 14:05
  • Вот что пишет Array ( [0] => Ландшафтный [1] => дизайн ) SELECT * FROM content WHERE title LIKE "%Ландшафтный%" OR text_article LIKE "%Ландшафтный%" OR title LIKE "%дизайн%" OR text_article LIKE "%дизайн%"bool(false) – Anastasiya Oct 06 '15 at 14:05
  • видите, в конце написано bool(false), это значит, что что-то не срабатывает в запросе. Для SELECT должен возвращаться объект. Очень может быть что не найдено результата по такому запросу. Удалите var_dump($result_set);exit; и попробуйте $query = "SELECT * FROM content WHERE $query_search"; заменить на $query = "SELECT * FROM content. Если заработает, то или ошибка в запросе или нет искомого результата в таблице – Konstantin Oct 06 '15 at 14:15
  • Неа, ничего не получилось( Вот что пишет Array ( [0] => Ландшафтный [1] => дизайн ) SELECT * FROM contentobject(mysqli_result)#2 (5) { ["current_field"]=> int(0) ["field_count"]=> int(3) ["lengths"]=> NULL ["num_rows"]=> int(2) ["type"]=> int(0) } – Anastasiya Oct 06 '15 at 14:18
  • Вы не удалили строчку var_dump($result_set);exit; Удалите и попробуйте – Konstantin Oct 06 '15 at 14:22
  • Удалила. Спасибо, ошибки нету пишет tConnect true. Но результат поиска не выводит. Вот что выводит Array ( [0] => Ландшафтный [1] => дизайн [2] => ) SELECT * FROM contentConnect true – Anastasiya Oct 06 '15 at 17:52