Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 5
×

Очень много Warning’ов PHP

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

Еще раз всем привет. Я решил одну ошибку PHP, теперь файл login.php и файл регистрации загружаются, но выдают целый рой Warning’ов. И мне так кажется, что большинство из них связанны с выставлением нужных прав на папки и файлы. Но также есть куча других ошибок. Хотя до этого запускал на локалхосте и все было ОК. Почему так происходит?

function countUser() {
        $q = "SELECT count(id) FROM " . TB_PREFIX . "users WHERE id > 5";
        $result = mysqli_query($this->connection, $q);
        $row = mysqli_fetch_row($result);
        return $row[0];
    }

Вот код в котором происходит первая ошибка в обеих файлах. Однако сейчас БД еще пустая и пользователя с id > 5 просто не существует, может из-за этого возникает ошибка?

На главной странице тоже есть три warning’a, такого типа:

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in /var/www/index.php on line 129

Однако если зайти на скрипт testmysql.php, то пишет «Connection OK».

Помогите разобраться. Буду благодарен за любую помощь.

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Вот есть такой кусок PHP кода:

public function getAllianceRank($id) {
                $this->procARankArray();
                while(1) {
                    if(count($this->rankarray) > 1) {
                        $key = key($this->rankarray);
                        if($this->rankarray[$key]["id"] == $id) { // В ЭТОЙ СТРОКЕ ПРОИСХОДИТ ПРЕДУПРЕЖДЕНИЕ
                            return $key;
                            break;
                        } else {
                            if(!next($this->rankarray)) {
                                return false;
                                break;
                            }
                        }
                    } else {
                        return 1;
                    }
                }
            }

А вот и само предупреждение:
Warning: Illegal string offset ’id’ in /var/www/GameEngine/Ranking.php on line 189

Я так понимаю, что там должен быть массив, а там строка, правильно? Как пофиксить это предупреждение?

В догонку.

Якщо хочеться програмувати і не хочеться перевіряти конструкції та читати варнінги, то створіть файл .htaccess і вбийте у ньому таку мантру:
php_flag display_errors off
php_value display_errors off
php_value error_reporting integer

та/або змінні які Ви оголосили і значення яких не присвоєне екрануйте ось таким барашеком — @ (ну або собачкою, як Вам миліше), типу @var = ’’; і т.д.

ІМХО.

Мені здається якось не кошерно навіть у самому мінімальному операційному коді не використовувати навіть самі мінімальні перевірки — це свідчення низької культура виробництва апріорі.

Доброго ранку. Можна оформити код з перевірками щоб уникнути непорозумінь. Я би зроби ось так, навскидку:

function countUser() {

$q = «SELECT count(id) FROM » . TB_PREFIX . «users WHERE id > 5»;
$result = mysqli_query($this->connection, $q) or exit("Помилка БД, типу... «.mysqli_error());
$row = mysqli_fetch_row($result);

if($result) // У Вашому випадку може повернутись false i mysqli_fetch_row залишиться без аргументу
{
$row = mysqli_fetch_row($result);
return $row[0];

} else {

echo «Відсутні дані у таблиці»;

}
}

або try — catch , як Вам подобається...

Поддерживаю,
там Warning-и можно игнорить настройками компилятора или аннотациями в коде.

На сколько я знаю в PHP тоже можно игнорировать Warning’и...

поставьте игнор и проблема решена.

Хочу, чтобы не было ни ошибок, ни предупреждений. Поэтому и заморачиваюсь!

Лучше ничего не игнорировать, но перенаправить вывод всех сообщений об ошибках в лог (на продакшене), пользователь не будет их видеть, но в случае чего можно просмотреть лог и определить в чем косяк.

Геттеры, сеттеры — все как-то сильно замороченно. Это мое ИМХО.

Ясна. Тогда остается читать про функцию error_reporting().

для этого гуглить научиться надо... в php, впрочем, тоже
но причину, уже правда ниже объяснили, с другой стороны, множественные запросы — не такой весомый аргумент, из-за отсутствия поддержки которого имеет смысл отказываться от PDO, и вообще, хранимки рулят в таких случаях, и тем более в игровых бэкэндах, тем более на php

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

foreach()
? Нужно избавиться от кучи вот таких предупреждений — Warning: Invalid argument supplied for foreach(). И что делать если условие попадает на 
else
?

После

$result = mysqli_query($this->connection, $q);
добавить
echo mysql_errno() . «: » . mysql_error();
, выведет ошибку, которую возвращает mysql.

Какие права мне нужно поставить на папку, чтобы с помощью PHP в этой директории создавать файлы?

Вообще-то это зависит от имени какого пользователя выполняется скрипт, но если поставить 777, создадутся точно.

На продакшене предлагаете поставить права 777 на папки???

Не на корень проекта (!), только на /GameEngine/Prevention/, где у вас, как я понял, хранятся текстовые файлы с настройками. Если там только (!) текстовые файлы с настройками, то права на исполнение не нужны, тогда 666. Если ваш скрипт выполняется от имени владельца этой папки, то хватит и 600, но это редкий случай, скорее всего скрипт выполняется от имени веб-сервера, а владелец папки «пользователь ftp-аккаунта», тогда без 666 не обойтись.

Лучше так (будучи root):
chmod u+x %dirname%
chown %username% %dirname%
где %username% — имя пользователя, под которым работает PHP

Поскольку база пустая, здесь

$result = mysqli_query($this->connection, $q);
у вас в result записывается false, отсюда и имеем предупреждения подобные
Warning: mysqli_fetch_row() expects parameter 1 to be mysqli_result, boolean given in /var/www/GameEngine/Database/db_MYSQLi.php on line 2834
заполните таблицу и в подобных случаях делайте проверку, если mysqli_query вернула false, то результат запроса пуст и далее соответствующая логика.
Предупреждения типа
Warning: Invalid argument supplied for foreach() in /var/www/GameEngine/Automation.php on line 4011
это вы, скорее всего, отсутствующий результат в цикле используете, чего тоже быть не должно.
А вот это
Warning: fopen(GameEngine/Prevention/cleardeleting.txt): failed to open stream: Permission denied in /var/www/GameEngine/Automation.php on line 344
уже действительно отсутствие прав.

Спасибо Вам большое за комментарий!

echo $q и выполнить запрос к базе вручную
если отрабатывает нормально- проверить в порядке ли $this->connection — оно вообще где определено?

Как раз сейчас разбираюсь, так как я только рефакторингом занимаюсь, код писали другие люди.

Буду очень благодарен за любую помощь.

Підписатись на коментарі