За последние 24 часа нас посетили 22697 программистов и 1253 робота. Сейчас ищут 723 программиста ...

Пытаюсь переписать код под PHP7. Обращение к БД косячит.

Тема в разделе "PHP и базы данных", создана пользователем rexen, 1 апр 2019.

Метки:
  1. rexen

    rexen Новичок

    С нами с:
    1 апр 2019
    Сообщения:
    2
    Симпатии:
    0
    Вообщем досталась мне "в работу" чья-то самописная система анкетирования. Работало много лет на хостинге c "PHP 5.3.29 + Apache 2.4.7 + MySQL 5.6". Сейчас мучаю проект на openServer - удобно оперативно переключать версии модулей.
    За окном 7-я версия, пытаюсь как-то заставить на ней работать эту писанину.
    Сам я системный программист по образованию (ООП, С++), а веб-кодинг - хобби. Вот пытаюсь освоить PHP+MySQL "по ходу пьесы".

    В проекте есть библиотечный инклюд dblib.php (уже с исправленными мной PHP7-вызовами "msqli"):
    Код (Text):
    1. <?
    2. class CDBResult
    3. {
    4.     var $result = 0;
    5.  
    6.     function Fetch()    {
    7.         return @mysqli_fetch_assoc($this->result);    }
    8. //...
    9. }
    10.  
    11.  
    12. class CDatabase
    13. {
    14.     var $connect  = 0;
    15.     var $dbname      = 0;
    16.     var $error      = "";
    17.  
    18. //...
    19.  
    20.     function Query($sql)
    21.     {
    22.         $result = @mysqli_query($this->connect, $sql);
    23.         if($result === false) {$this->error = "Query error: ". "someerror"/*mysql_error()*/; return false;}
    24.         if(gettype($result) == "resource")    {
    25.             $obResult = new CDBResult;
    26.             $obResult->result = $result;
    27.             return $obResult;
    28.         }
    29.         else return $result;
    30.     }
    31.  
    32.     function CreateDB($dbname)    { /*тело функции*/  }
    33.  
    34.     function CreateTable($tablename, $create_definition, $table_options)    { /*тело функции*/  }
    35.  
    36.     function Insert($table_name, $fields)    { /*тело функции*/  }
    37.  
    38.     function sqlSafe($data)    { /*тело функции*/  }
    39.  
    40.     function SelectDB($dbname)    { /*тело функции*/  }
    41.  
    42.     function DBList()    { /*тело функции*/  }
    43.  
    44.     function Disconnect()    { /*тело функции*/  }
    45.  
    46.     function GetInsertID()    { /*тело функции*/  }
    47.  
    48.     function ShowDebugInfo()    { /*тело функции*/  }
    49.  
    50. }
    51.  
    52. ################################################
    53.  
    54. $DB = new CDatabase;
    55. $DB->Query("SET NAMES 'cp1251'");
    56. $DB->Connect($host, $user, $password, $dbname);
    57.  
    58. ?>
    И в рабочем коде обращения к БД происходят через методы этих двух классов.

    Затык у меня произошёл вот в каком коде:
    Код (Text):
    1.     function getQuestionsCount( $survey_id = 0 ) {
    2.         global $DB, $dbname, $tablequestions;
    3.         $survey_id = intval( $survey_id );
    4.         $extendSql = $this->adminMode ? "" : " AND hidden = 'N'";
    5.         if ( empty( $survey_id ) ) $survey_id = $this->survey_id;
    6.         $res = $DB->Query( "SELECT COUNT(id) as count FROM $dbname.$tablequestions WHERE survey_id = $survey_id AND caption != 'Y' AND linked = 'N'". $extendSql );
    7.         if ( $arr = $res->Fetch() ) {
    8.             return intval( $arr[ 'count' ] );
    9.         }
    10.         return 0;
    11.     }
    - на серваке с PHP7 на строчке "if ( $arr = $res->Fetch() " происходит вылет ошибки
    Fatal error: Uncaught Error: Call to undefined method mysqli_result::Fetch()
    И насколько я понял,
    когда происходит запрос к БД, в библиотечном методе Query ,то не срабатывает проверка условия if(gettype($result) == "resource"), поэтому не происходит создание объекта $obResult = new CDBResult; и поэтому метода Fetch() из класса CDBResult просто не появляется. Потому и ошибка, что он Undefined.

    Вопрос в том, почему именно при PHP7 $result не возвращает тип "resource"?

    Может я где-то в переводе со старых функций msql на новые msqli недоглядел?

    Код вроде частично работает - сужу хотябы потому, что в админке перед выдачей списка анкет он спрашивает и принимает логин и пароль. А вот при попытке вывести список из БД - пока облом.
     
    #1 rexen, 1 апр 2019
    Последнее редактирование: 1 апр 2019
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    mysqli не возвращает resource, возвращает экземпляры классов mysqli, mysqli_result и других. Так что замени (чтоб было быстро) проверку на resource на $result instanceof mysqli_result.

    Собак из кода поубирай - затыкать интерпретатор плохая практика.
     
    rexen нравится это.
  3. rexen

    rexen Новичок

    С нами с:
    1 апр 2019
    Сообщения:
    2
    Симпатии:
    0
    @mkramer, премного благодарен. Заработало. Для новичка не столь очевидным оказалось, что вроде бы та же функция (хоть и "на новый лад") возвращает просто другой тип. Про собак читал, но... там по-хорошему весь код бы переписать - ему лет 7 уже, каша из процедурного и ООП.