eprivalov
@eprivalov
Учусь

Дебаг приложения на PHP. Как улучшить код и избавиться от предупреждений?

Доброй ночи, поздравляю всех с новым 2014 годом!

Я уже не один раз задавал вопросы о проекте, который мне доверили - тут, тут, тут и вот здесь.

Обрисую проблему - когда заходим на login.php или на страницу регистрации, то видим одинаковые предупреждения:

Warning: mysqli_fetch_row() expects parameter 1 to be mysqli_result, boolean given in /var/www/GameEngine/Database/db_MYSQLi.php on line 2834

Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in /var/www/GameEngine/Automation.php on line 905

Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in /var/www/GameEngine/Automation.php on line 4006

Warning: Invalid argument supplied for foreach() in /var/www/GameEngine/Automation.php on line 4196

Warning: Invalid argument supplied for foreach() in /var/www/GameEngine/Automation.php on line 1042

Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in /var/www/GameEngine/Automation.php on line 4006


Но если попытаться зайти в игру, то увидим такие ошибки:

Warning: mysqli_fetch_row() expects parameter 1 to be mysqli_result, boolean given in /var/www/GameEngine/Database/db_MYSQLi.php on line 2834

Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in /var/www/GameEngine/Automation.php on line 905

Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in /var/www/GameEngine/Automation.php on line 4006

Warning: Invalid argument supplied for foreach() in /var/www/GameEngine/Automation.php on line 4196

Warning: Invalid argument supplied for foreach() in /var/www/GameEngine/Automation.php on line 1042

Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in /var/www/GameEngine/Automation.php on line 4006

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in /var/www/GameEngine/Database/db_MYSQLi.php on line 76

Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in /var/www/GameEngine/Database/db_MYSQLi.php on line 206

Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in /var/www/GameEngine/Database/db_MYSQLi.php on line 225
Connect Error (0)


Вот так начинается код класса:
class MYSQLi_DB {

	var $connection;

	function MYSQL_DB() {		
		$this->connection = mysqli_connect(SQL_SERVER, SQL_USER, SQL_PASS, SQL_DB) or die('Connect Error (' . mysqli_connect_errno() . ') '. mysqli_connect_error());
	}


Вот кусок кода, где происходит ошибка Connect Error (0):
function sitterLogin($username, $password) {
		$q = "SELECT sit1,sit2 FROM " . TB_PREFIX . "users WHERE username = '$username' AND access != " . BANNED;
		$result = mysqli_query($this->connection, $q);
		$dbarray = mysqli_fetch_array($result, MYSQLI_BOTH); //ОШИБКА ЗДЕСЬ
		if($dbarray['sit1'] != 0) {
			$q2 = "SELECT password FROM " . TB_PREFIX . "users WHERE id = " . $dbarray['sit1'] . " AND access != " . BANNED;
			$result2 = mysqli_query($this->connection, $q2);
			$dbarray2 = mysqli_fetch_array($result2, MYSQLI_BOTH);
		}
		if($dbarray['sit2'] != 0) {
				$q3 = "SELECT password FROM " . TB_PREFIX . "users WHERE id = " . $dbarray['sit2'] . " AND access != " . BANNED;
				$result3 = mysqli_query($this->connection, $q3);
				$dbarray3 = mysqli_fetch_array($result3, MYSQLI_BOTH);
		}
		if($dbarray['sit1'] != 0 || $dbarray['sit2'] != 0) {
			if($dbarray2['password'] == md5($password) || $dbarray3['password'] == md5($password)) {
				return true;
			} else {
				return false;
			}
		} else {
			return false;
		}
	}


Как улучшить код? Как избавиться от предупреждений?
  • Вопрос задан
  • 11449 просмотров
Решения вопроса 2
@VeMax
Смотришь первую ошибку и начинаешь исправлять. И так далее пока не останется ошибок. Хотите нормально программировать, начинайте разбираться в том что вы делаете.
Ответ написан
Комментировать
ошибка не тут:
$dbarray = mysqli_fetch_array($result, MYSQLI_BOTH); //ОШИБКА ЗДЕСЬ

а строкой выше:
$result = mysqli_query($this->connection, $q);
подпишите снизу:
var_dump($result); //  должно быть object(mysqli_result)#2

а у вас вернет false.
что нужно проверить:
1. запрос написан верно, при условии, что константа BANNED числовая.
2. проверяйте соответствия имен колонок и таблицы в запросе и в базе.
например, впишите для проверки не TB_PREFIX . "users , а имя таблицы напрямую.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
Sild
@Sild
как начать гуглить и перестать спрашивать одно и то же?
напиши в начале инициализирующего скрипта
error_reporting(~E_ALL & ~E_WARNING & ~E_NOTICE & ~E_DEPRECATED);

это избавит тебя от всех ошибок.

Warning: Invalid argument supplied for foreach() in - про это тебе уже писали (я лично писал)
Warning: mysqli_fetch_row() expects parameter 1 to be mysqli_result, boolean given in - про это тоже говорили, что проблема в запросах которые ничего не возвращают

ты весь проект так хочешь проспрашивать? Лучше напиши строчку, которую я указал в самом начале. Это будет достаточно грамотный подход, по сравнению с текущими успехами.
Ответ написан
@eprivalov изучай основы, потом возвращайся к этому готовому проекту, который ты не можешь установить на свой сервер.
Ответ написан
Комментировать
FacedSID
@FacedSID
Недавно слава богу перевелся на PDO. Жизнь стала легче и прекрасней :)
А вообще для отлова ошибок подобного плана можно использовать обработчик ошибок, который будет выводить весь стек вызова и тогда уже можно будет наверняка отследить откуда пошли неверные данные. Почитайте про www.php.net/manual/ru/function.set-error-handler.php и www.php.net/manual/ru/function.set-exception-handl...

Я себе написал класс, который даже ошибочный кусок кода под стеком вызова выводит, для того, что бы так сказать "не отходя от кассы" разобраться в чем проблема.
Ответ написан
Комментировать
Lordu
@Lordu
sadasdsa
Всем привет. помогите пожалуйста устранить ошибку
Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in Z:\home\test1.ru\www\admin\field.php on line 370

if($rr['field'])
$titl="Редактирование поля: ".$rr['field'];
else
$titl="Добавления поля";
 
require ('top.php');
 
 
if($_REQUEST['add'])
    {
    echo '<h3>СПРАВКА</h3>';
 
    $m = mysqli_query($connect, "SHOW COLUMNS FROM ".$database.".board");
    while($mm = mysqli_fetch_array($m))                                    370 строчка
        {
        $b = explode($arr_typ_field[$field_typ][3], $mm[0]);
        if(count($b)>1)
            {
            $arr_field[] = $mm[0];
            $arr_num[] = $b[1];
            }
        }
 
 
    if($arr_num)
        {
        $max=max($arr_num);
        $field_after = $arr_typ_field[$field_typ][3].$max;
        $field_new = $arr_typ_field[$field_typ][3].($max+1);
        }
    else
        {
        $field_after = 'id_catalog';
        if($arr_typ_field[$field_typ][5]=='sp' || $arr_typ_field[$field_typ][5]=='dp')
        $field_new = $arr_typ_field[$field_typ][3];
        else
        $field_new = $arr_typ_field[$field_typ][3].'1';
        }
 
    echo 'Доступные поля для типа <font color='.$arr_typ_field[$field_typ][1].'>'.$arr_typ_field[$field_typ][0].'</font> в таблице '.$catalog_typ.': <br>';  
 
    if(!$arr_field)
    echo '<font color=red>Нет доступных полей</font><br>';
 
    else
        {
        foreach($arr_field as $af)  
            {
            echo '<font color=green>'.$af."</font><br>";
            }
 
 
        echo 'Занятые поля для данного типа в текущем каталоге: <br>';  
 
        $q="SELECT * FROM field WHERE (field_field  REGEXP '[[:<:]]".$arr_typ_field[$field_typ][3]."' OR field_field_two  REGEXP '[[:<:]]".$arr_typ_field[$field_typ][3]."') AND id_catalog='".$id_catalog."'";
        $r1=mysqli_query($connect, $q);
 
 
        while ($rr1=mysqli_fetch_array($r1))
            {
            if($rr1['field_field'])
            $arr_tab[] = $rr1['field_field'];
            if($rr1['field_field_two'])
            $arr_tab[] = $rr1['field_field_two'];
            }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы