Вообщем досталась мне "в работу" чья-то самописная система анкетирования. Работало много лет на хостинге c "PHP 5.3.29 + Apache 2.4.7 + MySQL 5.6". Сейчас мучаю проект на openServer - удобно оперативно переключать версии модулей. За окном 7-я версия, пытаюсь как-то заставить на ней работать эту писанину. Сам я системный программист по образованию (ООП, С++), а веб-кодинг - хобби. Вот пытаюсь освоить PHP+MySQL "по ходу пьесы". В проекте есть библиотечный инклюд dblib.php (уже с исправленными мной PHP7-вызовами "msqli"): Код (Text): <? class CDBResult { var $result = 0; function Fetch() { return @mysqli_fetch_assoc($this->result); } //... } class CDatabase { var $connect = 0; var $dbname = 0; var $error = ""; //... function Query($sql) { $result = @mysqli_query($this->connect, $sql); if($result === false) {$this->error = "Query error: ". "someerror"/*mysql_error()*/; return false;} if(gettype($result) == "resource") { $obResult = new CDBResult; $obResult->result = $result; return $obResult; } else return $result; } function CreateDB($dbname) { /*тело функции*/ } function CreateTable($tablename, $create_definition, $table_options) { /*тело функции*/ } function Insert($table_name, $fields) { /*тело функции*/ } function sqlSafe($data) { /*тело функции*/ } function SelectDB($dbname) { /*тело функции*/ } function DBList() { /*тело функции*/ } function Disconnect() { /*тело функции*/ } function GetInsertID() { /*тело функции*/ } function ShowDebugInfo() { /*тело функции*/ } } ################################################ $DB = new CDatabase; $DB->Query("SET NAMES 'cp1251'"); $DB->Connect($host, $user, $password, $dbname); ?> И в рабочем коде обращения к БД происходят через методы этих двух классов. Затык у меня произошёл вот в каком коде: Код (Text): function getQuestionsCount( $survey_id = 0 ) { global $DB, $dbname, $tablequestions; $survey_id = intval( $survey_id ); $extendSql = $this->adminMode ? "" : " AND hidden = 'N'"; if ( empty( $survey_id ) ) $survey_id = $this->survey_id; $res = $DB->Query( "SELECT COUNT(id) as count FROM $dbname.$tablequestions WHERE survey_id = $survey_id AND caption != 'Y' AND linked = 'N'". $extendSql ); if ( $arr = $res->Fetch() ) { return intval( $arr[ 'count' ] ); } return 0; } - на серваке с 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 недоглядел? Код вроде частично работает - сужу хотябы потому, что в админке перед выдачей списка анкет он спрашивает и принимает логин и пароль. А вот при попытке вывести список из БД - пока облом.
mysqli не возвращает resource, возвращает экземпляры классов mysqli, mysqli_result и других. Так что замени (чтоб было быстро) проверку на resource на $result instanceof mysqli_result. Собак из кода поубирай - затыкать интерпретатор плохая практика.
@mkramer, премного благодарен. Заработало. Для новичка не столь очевидным оказалось, что вроде бы та же функция (хоть и "на новый лад") возвращает просто другой тип. Про собак читал, но... там по-хорошему весь код бы переписать - ему лет 7 уже, каша из процедурного и ООП.