Fetch assoc php ошибка

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

Fatal error: Call to a member function fetch_assoc() on a non-object in Z:homeAnastasiyawwwsearch.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()){

задан 6 окт 2015 в 12:42

Anastasiya's user avatar

AnastasiyaAnastasiya

1171 золотой знак2 серебряных знака12 бронзовых знаков

7

  1. Проверьте выполняется ли конечный запрос $query(который выводится после строки echo $query;) через консоль базы данных.
  2. Проверьте доступ к бд:

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

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

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

ответ дан 6 окт 2015 в 13:29

Alex's user avatar

AlexAlex

6,4786 золотых знаков23 серебряных знака31 бронзовый знак

10

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

while ($row = $result_set->fetch_assoc()){

ответ дан 6 окт 2015 в 13:03

Andrew Godin's user avatar

Andrew GodinAndrew Godin

5552 серебряных знака15 бронзовых знаков

5

Как уже ответил 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/, а лучше, учите английский.

ответ дан 6 окт 2015 в 13:07

Konstantin's user avatar

KonstantinKonstantin

1471 золотой знак2 серебряных знака13 бронзовых знаков

11

here is my code for the query in php:

$query3 = mysql_query("SELECT * FROM area_of_work") or die('Invalid query:'. mysql_error());

while($query3 = mysql_fetch_assoc($query3)){
    $flag = true;
    foreach($listOfUserAreas as $obj){
        if($obj->areaId == $query3['id']){
            $flag = false;
            break;
        }  
    }
    if($flag){
        $areaObj = new AreaInfo();
        $areaObj->areaId = $query3['id'];
        $areaObj->areaName = $query3['areaOfWork'];
        $areaObj->areaTableName = $query3['tableName'];
        array_push($listOfUnusedAreas, $areaObj);
    }
}

and i am getting this error:

Warning: mysql_fetch_assoc() expects parameter 1 to be resource, array given in C:xampphtdocsjob-skillsphpfunctionsuser_unused_area_list.php on line 30
[]

can’t see something wrong.
Thanks

Leri's user avatar

Leri

12.3k7 gold badges43 silver badges60 bronze badges

asked Oct 4, 2012 at 11:48

vlio20's user avatar

4

don’t use the same variables.. try like this

$query3 = mysql_query("SELECT * FROM area_of_work") or die('Invalid query:'. mysql_error());

while($result = mysql_fetch_assoc($query3)){
.....//Your code
}

answered Oct 4, 2012 at 11:52

Prasath Albert's user avatar

In this line:

while($query3 = mysql_fetch_assoc($query3))

you are reassigning $query3 with results of mysql_fetch_assoc

Should be something like this:

while($queryRes = mysql_fetch_assoc($query3))

answered Oct 4, 2012 at 11:51

Viktor S.'s user avatar

Viktor S.Viktor S.

12.7k1 gold badge26 silver badges52 bronze badges

Your problem is here:

$query3 = mysql_query("SELECT * FROM area_of_work") or die('Invalid query:'. mysql_error());
while ($query3 = mysql_fetch_assoc($query3)) {

It should be like this:

$q = mysql_query("SELECT * FROM area_of_work") or die('Invalid query:'. mysql_error());
while ($query3 = mysql_fetch_assoc($q)) {

answered Oct 4, 2012 at 11:52

Mehran's user avatar

MehranMehran

15.4k26 gold badges116 silver badges220 bronze badges

Rename variable $query3 to $query or something different from variable used in your while loop.

What you do on line: while($query3 = mysql_fetch_assoc($query3)) is that you assign result of mysql_fetch_assoc to $query3 (it’s resource at this point) on the first iteration and on the second you pass $query3 (an array already) to mysql_fetch_assoc.

Note: mysql_* functions are deprecated. Use PDO or mysqli_*

answered Oct 4, 2012 at 11:51

Leri's user avatar

LeriLeri

12.3k7 gold badges43 silver badges60 bronze badges

Your first loop will work ok, but your second will fail:

while($query3 = mysql_fetch_assoc($query3)){

After the first loop has executed, you are assigning the result array to the resource, effectingly overwriting the resource.

Replace your line like this:

while($listOfUserAreas = mysql_fetch_assoc($query3)){

answered Oct 4, 2012 at 11:51

JvdBerg's user avatar

JvdBergJvdBerg

21.7k8 gold badges36 silver badges55 bronze badges

This is wrong:

while($query3 = mysql_fetch_assoc($query3)){

You are using the same variable to read from, an to assign to.

You can fix it by replacing the aforementioned line, for this one:

$result = &$query3;
while($query3 = mysql_fetch_assoc($result)){

just changing those lines, the rest of your code will work.

answered Oct 4, 2012 at 11:51

Nelson's user avatar

NelsonNelson

48.9k8 gold badges67 silver badges81 bronze badges

You’re trying to assign associate array to resource

while($query3 = mysql_fetch_assoc($query3))

which is wrong… try with different variable
while($Result = mysql_fetch_assoc($query3))

answered Oct 4, 2012 at 11:52

Mohit Mehta's user avatar

Mohit MehtaMohit Mehta

1,28312 silver badges21 bronze badges

while($query4 = mysql_fetch_assoc($query3)){

change name of fetch variable

answered Oct 4, 2012 at 11:55

Man Programmer's user avatar

Man ProgrammerMan Programmer

5,2902 gold badges21 silver badges21 bronze badges

$servername = ‘localhost’;
$username = ‘root’;
$password = »;
$dbname = ‘1’;

$mysqli = new mysqli($servername, $username, $password, $dbname);
$login = $_POST[«login»];
$password = $_POST[«password»];

$nick = $mysqli->query(«SELECT * FROM ‘accounts'»);
$result = $nick->fetch_assoc();
var_dump( $result );
Выдает ошибку: «Fatal error: Uncaught Error: Call to a member function fetch_assoc()»


  • Вопрос задан

    более трёх лет назад

  • 219 просмотров

С тем, что запрос не правильный — » вокруг имени таблицы не на месте. И в итоге у вас вернулся FALSE, а не mysqli_result.

К тому же, лучше использовать PDO.

Пригласить эксперта

query
может вернуть false, у вас нет проверки на это и показ ошибки вот и страдаете, а ошибка скорее всего в том что для название таблиц и полей нужно использовать апострофы (`), а кавычки для текста. У вас же название таблицы в кавычках, т.е. нужно `accounts`

Попробуйте в процедурном стиле для начала


  • Показать ещё
    Загружается…

21 июн. 2023, в 23:43

5000 руб./за проект

21 июн. 2023, в 23:34

10000 руб./за проект

21 июн. 2023, в 22:52

600 руб./за проект

Минуточку внимания

Function fetch_assoc() on a non-object

Одной из самых популярных ошибок, с которой мне и моим ученикам приходится сталкиваться, это «Function fetch_assoc() on a non-object«. Регулярно мне присылают вопросы с этой ошибкой и спрашивают, что делать. Давайте с Вами разберём основные причины возникновения данной ошибки.

В оригинале данная ошибка означает, что мы пытаемся вызвать метод fetch_assoc() у не объекта. Например, она возникнет здесь:

<?php
  $x = false;
  $x->fetch_assoc();
?>

У нас переменная «x» является булевской, поэтому никаких методов у неё нет, о чём и сообщает нам PHP. Но это базовая ошибка, которую вряд ли кто-то допустит. Поэтому чаще всего «Function fetch_assoc() on a non-object» является лишь следствием другой ошибки, на которую PHP не реагирует:

<?php
  $result_set = $mysqli->query("SELECT * FROM WHERE `id`='3'");
  $row = $result_set->fetch_assoc();
?>

У нас возникает всё та же ошибка, но теперь она не очевидна. Данная ошибка нам сообщает, что переменная «result_set» не является объектом. Движемся дальше, а почему она не является объектом, где мы её определили? Поднимаем глаза выше и видим, что в неё мы должны поместить результат выборки. И вот именно в этой строчке и содержится ошибка. Если бы $mysqli был не объектом, или мы бы ошиблись с написанием метода query(), нам бы PHP об этом сразу сообщил.

Следовательно, вся проблема в строковой переменной с запросом. Разумеется, на содержимое строки PHP никак не реагирует, но в этом запросе содержится ошибка. Внимательно к нему приглядевшись, можно заметить, что там не хватает названия таблицы.

Исправив запрос, ошибка «Function fetch_assoc() on a non-object» исчезнет. Как видите, в большинстве случаев данная ошибка возникает именно из-за неправильного запроса.

Цель данной статьи была не только рассказать об этой ошибке, но и показать, что не надо зацикливаться на той строке, где, как показывает PHP, содержится ошибка.

  • Создано 14.01.2013 10:54:00


  • Михаил Русаков

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Вам же написали что в объекте нет данных, вернулось 0 строк, ничего нельзя сфетчить. Перед фетчами надо проверять количество. В циклах типа while($res=$result->fetch_arr()){} это делается неявно, но именно благодаря облому с чтением следующей строки можно выйти из такого цикла. У вас сразу строк 0. То есть запрос вернул 0 строк. Скорее всего потому что локальная база не такая же как на сервере. Нет некоторых записей к которым вы привыкли.

Походу критика. На этом форуме запрещена ссылка на пщмтщсщв.ру? Я бы послал.

Логика непостижима. Коннект это всего лишь function __construct($options) инстанси объекта которую вы можете назвать хоть mysqli, хоть yoursqli и наделать их сколько требуется. Допустим работать с несколькими бд условно одновременно.

Из записи

PHP
1
2
global $mysqli;
connectDB();

Вытекает что инстансь уже сделана и передана в функцию глобально. Можно юзать. Что в таком случае делает функция connectDB() и что делает closeDB()?

Зацените фишку:

PHP
1
2
3
4
5
6
7
function articles($mysqli) {
 
  if(!$result = $mysqli->query("SELECT * FROM `'.  __FUNCTION__  .'`")) die('bad query');
  if($result->num_rows < 1) return array(); // 
  return $result->fetch_all();
 
}

Размножив такой код вы увидите что отличия только в названии функций. Так не делают. Делают хотя бы так:

PHP
1
2
3
4
5
6
7
8
9
10
11
function query2arr($mysqli, $table_name) {
 
  if(!$result = $mysqli->query("SELECT * FROM `'.  $table_name .'`")) die('bad query');
  if($result->num_rows < 1) return 0; // или как выше
  return $result->fetch_all();
 
}
 
// и где-то после вызова проверяете
 
if(!query2arr($mysqli, $query_text)) ...// куда-то послать скрипт

Добавлено через 44 минуты
Но самая косточка в отсутствии смысла такого рода функций. Если они у вас есть, значит что-то неправильно в идее скрипта. Потому что множество простых запросов очень легко написать и тут же получить результ, сложных запросов много быть не должно и написать под них правильный компилятор задача не из легких.

Что проверяет и что возвращает функция в цитате? Сравните инлайновое решение

if(!$result = $mysqli->query(«SELECT * FROM `articles`»)) die(‘bad query’);
if($result->num_rows > 1) {
// сразу работаем с результом
}

Скажете в чем прикол? В том что не надо передавать аргументы особенно в условиях когда контекст заранее известен. Вызов же функции и возврат могучего результа в массиве поедает ресурсы и все такое.

Если никак без засасывания результа в массив нельзя обойтись, то вполне логично засунуть эту функцию прямо в запрос. Расширить класс result.

  • Festool ka 65 ошибка 9
  • Ferrum tm 8420a ошибка е01
  • Ferroli ошибка а01 а 01 на газовом котле
  • Ferroli ошибка f35 как исправить
  • Ferroli котел ошибка а06