Почему выскакивает такая ошибка?
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
AnastasiyaAnastasiya
1171 золотой знак2 серебряных знака12 бронзовых знаков
7
- Проверьте выполняется ли конечный запрос $query(который выводится после строки
echo $query;
) через консоль базы данных. -
Проверьте доступ к бд:
if ($mysqli->connect_errno) {
die(‘Ошибка соединения: ‘ . $mysqli->connect_error);
}else{echo ‘Connect true’;} -
выполните
var_dump($result_set);
что показывает выполнение?
P.S.: зачастую проблема либо в некорректном запросе либо в настройке доступа к бд.
ответ дан 6 окт 2015 в 13:29
AlexAlex
6,4786 золотых знаков23 серебряных знака31 бронзовый знак
10
У метода fetch_assoc() в скобочках ничего быть не должно.
while ($row = $result_set->fetch_assoc()){
ответ дан 6 окт 2015 в 13:03
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
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
12.3k7 gold badges43 silver badges60 bronze badges
asked Oct 4, 2012 at 11:48
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
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.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
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
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
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
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 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 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«. Регулярно мне присылают вопросы с этой ошибкой и спрашивают, что делать. Давайте с Вами разберём основные причины возникновения данной ошибки.
В оригинале данная ошибка означает, что мы пытаемся вызвать метод 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.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
-
Кнопка:
Она выглядит вот так:
-
Текстовая ссылка:
Она выглядит вот так: Как создать свой сайт
- BB-код ссылки для форумов (например, можете поставить её в подписи):
Вам же написали что в объекте нет данных, вернулось 0 строк, ничего нельзя сфетчить. Перед фетчами надо проверять количество. В циклах типа while($res=$result->fetch_arr()){} это делается неявно, но именно благодаря облому с чтением следующей строки можно выйти из такого цикла. У вас сразу строк 0. То есть запрос вернул 0 строк. Скорее всего потому что локальная база не такая же как на сервере. Нет некоторых записей к которым вы привыкли.
Походу критика. На этом форуме запрещена ссылка на пщмтщсщв.ру? Я бы послал.
Логика непостижима. Коннект это всего лишь function __construct($options) инстанси объекта которую вы можете назвать хоть mysqli, хоть yoursqli и наделать их сколько требуется. Допустим работать с несколькими бд условно одновременно.
Из записи
PHP | ||
|
Вытекает что инстансь уже сделана и передана в функцию глобально. Можно юзать. Что в таком случае делает функция connectDB() и что делает closeDB()?
Зацените фишку:
PHP | ||
|
Размножив такой код вы увидите что отличия только в названии функций. Так не делают. Делают хотя бы так:
PHP | ||
|
Добавлено через 44 минуты
Но самая косточка в отсутствии смысла такого рода функций. Если они у вас есть, значит что-то неправильно в идее скрипта. Потому что множество простых запросов очень легко написать и тут же получить результ, сложных запросов много быть не должно и написать под них правильный компилятор задача не из легких.
Что проверяет и что возвращает функция в цитате? Сравните инлайновое решение
if(!$result = $mysqli->query(«SELECT * FROM `articles`»)) die(‘bad query’);
if($result->num_rows > 1) {
// сразу работаем с результом
}
Скажете в чем прикол? В том что не надо передавать аргументы особенно в условиях когда контекст заранее известен. Вызов же функции и возврат могучего результа в массиве поедает ресурсы и все такое.
Если никак без засасывания результа в массив нельзя обойтись, то вполне логично засунуть эту функцию прямо в запрос. Расширить класс result.