Warning: mysqli::query() [mysqli.query]: Couldn't fetch mysqli in

Тема в разделе "PHP", создана пользователем zloy_admin, 7 дек 2012.

Модераторы: latteo
  1. zloy_admin

    zloy_admin Разработчик

    Заблокирован
    Регистр.:
    15 авг 2011
    Сообщения:
    184
    Симпатии:
    27
    Здравствуйте! Подскажите как решить проблему с выдаваемыми ошибками:

    Warning: mysqli::query() [mysqli.query]: Couldn't fetch mysqli in E:\domains\cpe.loc\engine\install\install.php on line 94

    Warning: mysqli::query() [mysqli.query]: Couldn't fetch mysqli in E:\domains\cpe.loc\engine\install\install.php on line 118

    Warning: mysqli::query() [mysqli.query]: Couldn't fetch mysqli in E:\domains\cpe.loc\engine\install\install.php on line 119

    Warning: mysqli::query() [mysqli.query]: Couldn't fetch mysqli in E:\domains\cpe.loc\engine\install\install.php on line 120

    Warning: mysqli::query() [mysqli.query]: Couldn't fetch mysqli in E:\domains\cpe.loc\engine\install\install.php on line 121

    Warning: mysqli::query() [mysqli.query]: Couldn't fetch mysqli in E:\domains\cpe.loc\engine\install\install.php on line 123

    Warning: mysqli::query() [mysqli.query]: Couldn't fetch mysqli in E:\domains\cpe.loc\engine\install\install.php on line 136

    Warning: mysqli::query() [mysqli.query]: Couldn't fetch mysqli in E:\domains\cpe.loc\engine\install\install.php on line 158

    Warning: mysqli::query() [mysqli.query]: Couldn't fetch mysqli in E:\domains\cpe.loc\engine\install\install.php on line 176

    Warning: mysqli::query() [mysqli.query]: Couldn't fetch mysqli in E:\domains\cpe.loc\engine\install\install.php on line 189

    Warning: mysqli::query() [mysqli.query]: Couldn't fetch mysqli in E:\domains\cpe.loc\engine\install\install.php on line 208

    Warning: mysqli::query() [mysqli.query]: Couldn't fetch mysqli in E:\domains\cpe.loc\engine\install\install.php on line 221

    Warning: mysqli::query() [mysqli.query]: Couldn't fetch mysqli in E:\domains\cpe.loc\engine\install\install.php on line 233

    Warning: mysqli::query() [mysqli.query]: Couldn't fetch mysqli in E:\domains\cpe.loc\engine\install\install.php on line 235

    Warning: mysqli::query() [mysqli.query]: Couldn't fetch mysqli in E:\domains\cpe.loc\engine\install\install.php on line 236

    Warning: mysqli::query() [mysqli.query]: Couldn't fetch mysqli in E:\domains\cpe.loc\engine\install\install.php on line 237


    PHP:
    <?php
    /*
    ==================================================
     
    --------------------------------------------------
     
    --------------------------------------------------
     
    ==================================================
     
    ==================================================
    Файл: install.php
    --------------------------------------------------
    Назначение: Класс установки
    ==================================================
    */
     
    //Подключение нужных файлов
    require_once $_SERVER['DOCUMENT_ROOT'].'/engine/config.php';
    require_once 
    $_SERVER['DOCUMENT_ROOT'].'/engine/data/connect.php';
    require_once 
    DIR_ENGINE 'simple.php';
    require_once 
    DIR_ENGINE 'errors/global.php';
     
    class 
    install
    {
        public 
    $connect;
        public function 
    __construct()
        {
            
    $this->connect = @new mysqli(DB_HOSTDB_USERDB_PASSWORDDB_DATABASE)
                                or die(
    mysqli_connect_error());
        }
        public function 
    show()
        {
            if (
    file_exists(DIR_ENGINE 'data/config.cpe.php'))
                return 
    false;
     
            include_once 
    DIR_ENGINE 'install/header.php';
            include_once 
    DIR_ENGINE 'install/ok.php';
            include_once 
    DIR_ENGINE 'install/footer.php';
        }
        
    //Создание файла конфигурации БД
        
    public function createFile($database$user$password$host)
        {
            try {
                
    $result "
            <?php
              define('DB_HOST','
    $host');\n
              define('DB_USER','
    $user');\n
              define('DB_PASSWORD','
    $password');\n
              define('DB_DATABASE','
    $database');\n
              ?>"
    ;
                if (!
    file_exists(DIR_ENGINE 'data/config.db.php')) {
                    if (!@
    file_put_contents(DIR_ENGINE 'data/config.db.php'$result))
                        throw new 
    Exception(Errors::installError('errorFiles'));
                }
                return 
    true;
            }
            catch (
    exception $e) {
                return 
    $e->getMessage();
            }
        }
        public function 
    start($adminemail$admin)
        {
            try {
                
    //Устанавливаем БД
                
    if (!$this->newDB())
                    throw new 
    Exception(Errors::installError('errorDB') . $this->newDB());
                
    //Заливаем таблицы
                
    if (!$this->TableCityPortalEngine())
                    throw new 
    Exception(Errors::installError('errorTableDB'));
                
    //Создаем администратора
                
    $login Simple::getClearDB($admin[0]);
                
    $email Simple::getClearDB($admin[1]);
                
    $password $admin[2];
                if (!
    $this->newAdmin($login$email$password))
                    throw new 
    Exception(Errors::installError('errorUsers'));
     
                
    //Создаем файл конфигурации админа
                
    if (!file_exists(DIR_ENGINE 'data/config.cpe.php')) {
                    
    $filesarray = array("<?php\n define('ADMINEMAIL','$adminemail');\n?>");
                    
    $file = @file_put_contents(DIR_ENGINE 'data/config.cpe.php'$filesarray);
                    if (!
    $file)
                        throw new 
    Exception(Errors::installError('errorFiles'));
     
                    return 
    true;
                }
            }
            catch (
    exception $e) {
                return 
    $e->getMessage();
            }
     
        }
        private function 
    newDB()
        {
            
    //Проверяем существует ли БД
            
    $db $this->connect->query("SHOW DATABASE LIKE" DB_DATABSE "");
            
    //Если БД нет, то создаем
            
    if (!empty($db)) {
                if (
    $this->connect->query("CREATE DATABASE IF NOT EXISTS " DB_DATABASE "")) {
                    echo 
    "Пожалуйста измените файл config.db.php и замените строку
                      define('DB_DATABASE', ''); на
                      define ('DB_DATABASE',DB_DATABASE)"
    ;
                    exit;
                } else {
                    
    //Записываем данные об ошибке
                    
    if (@file_put_contents(DIR_ENGINE 'install/errors/errors.dat'$this->connect->
                        
    error __file__ __line__ "\n"))
                        die(
    Errors::installError('errorsFileDB'));
     
     
                }
     
            }
            return 
    true;
        }
        public function 
    TableCityPortalEngine()
        {
            
    //Если БД существует, создаем таблицы
            
    $sql $this->connect;
            
    $sql->query('set names utf8');
            
    $sql->query(" SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 ");
            
    $sql->query(" SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; ");
            
    $sql->query(" SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL' ");
            
    $sql->query(" CREATE SCHEMA IF NOT EXISTS" DB_DATABASE .
                
    "DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ");
     
            
    $users $sql->query("
    CREATE  TABLE IF NOT EXISTS " 
    DB_DATABASE ".`users` (
    `idusers` INT NOT NULL AUTO_INCREMENT COMMENT 'id - Зарегистрированного' ,
    `login` VARCHAR(85) NOT NULL COMMENT 'Логин юзера, должен быть уникальный и состоять только из латинских букв и цифр , так же должен быть не более 20 символов' ,
    `email` VARCHAR(85) NOT NULL COMMENT 'На него приходит уведомление о регистрации, так же нужен для авторизации, должен быть уникальным и реально существующим. не более 25 символов' ,
    `password` VARCHAR(45) NOT NULL COMMENT 'Пароль пользователя, должен содержать не менее 7 символов и не более 20. Должен быть закодирован в мд5+соль. При потере, генерация нового пароля и перезаписывание старого' ,
    `role` TINYINT NOT NULL DEFAULT 0 COMMENT '(роль пользователя 0 - Просто гость, 1 - Авторированный юзер, 2 - Автор, 3 Админ)\nПо умалчанию после авторизации, записуется 1, дефолт = 0, первому юзеру, авторизированному при инсталяции  по умолчанию записывается 3 ' ,
    PRIMARY KEY (`idusers`) )
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = utf8
    COLLATE = utf8_general_ci
    "
    );
            
    $articles $sql->query("
    CREATE  TABLE IF NOT EXISTS " 
    DB_DATABASE ".`articles` (
    `idarticles` INT NOT NULL AUTO_INCREMENT COMMENT 'id - Уникальный (для статей)' ,
    `title` VARCHAR(45) NOT NULL COMMENT 'Заголовок статьи' ,
    `description` VARCHAR(85) NOT NULL COMMENT 'Описание статьи' ,
    `keywords` VARCHAR(85) NOT NULL COMMENT 'Ключевые слова статьи' ,
    `text` TEXT NOT NULL COMMENT 'Текст статьи' ,
    `state` TINYINT NOT NULL COMMENT '0-черновик,1-опубликованна' ,
    `date_create` VARCHAR(45) NOT NULL COMMENT 'Дата создания' ,
    `date_edit` VARCHAR(45) NULL COMMENT 'Дата последнего изминения' ,
    `users_idusers` INT NOT NULL ,
    PRIMARY KEY (`idarticles`) ,
    INDEX `fk_articles_users1` (`users_idusers` ASC) ,
    CONSTRAINT `fk_articles_users1`
    FOREIGN KEY (`users_idusers` )
    REFERENCES " 
    DB_DATABASE ".`users` (`idusers` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = utf8
    COLLATE = utf8_general_ci
    "
    );
     
            
    $rols $sql->query("
    CREATE  TABLE IF NOT EXISTS " 
    DB_DATABASE ".`rols` (
    `idrols` INT NOT NULL AUTO_INCREMENT ,
    `roleid` INT NOT NULL COMMENT '(роль юзера 0,1,2,3) ' ,
    `textrole` VARCHAR(45) NOT NULL DEFAULT 'Гость' COMMENT 'В зависимости от роли пользователя: (0- Гость,1-Участник,2-Автор,3-Админ)' ,
    `users_idusers` INT NOT NULL ,
    PRIMARY KEY (`idrols`, `users_idusers`) ,
    INDEX `fk_rols_users` (`users_idusers` ASC) ,
    CONSTRAINT `fk_rols_users`
    FOREIGN KEY (`users_idusers` )
    REFERENCES " 
    DB_DATABASE ".`users` (`idusers` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = utf8
    COLLATE = utf8_general_ci
    "
    );
     
            
    $settings $sql->query("
    CREATE  TABLE IF NOT EXISTS " 
    DB_DATABASE ".`settings` (
    `idsettings` INT NOT NULL ,
    `access` TINYINT NOT NULL COMMENT '( 0 Запрещать, 1 разрешать, 2 запрещать гостям =>  просмотр раздела)' ,
    `offline` TINYINT NOT NULL DEFAULT 1 COMMENT 'Сайт (0 - закрыт, 1 -открыт)' ,
    `editor` TINYINT NOT NULL DEFAULT 1 COMMENT 'Добавление статей (0- без редактора, 1 - с редактором) ' ,
    `modules` TINYINT NOT NULL DEFAULT 1 COMMENT 'Модули (0 - не использовать, 1 использовать)' ,
    PRIMARY KEY (`idsettings`) )
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = utf8
    COLLATE = utf8_general_ci
    "
    );
     
            
    $files $sql->query("
    CREATE  TABLE IF NOT EXISTS " 
    DB_DATABASE ".`files` (
    `idfiles` INT NOT NULL AUTO_INCREMENT ,
    `path` VARCHAR(45) NOT NULL COMMENT 'Путь к файлу' ,
    `extension` VARCHAR(45) NULL COMMENT 'Расширение файла, например .gif или .jpg' ,
    `type` VARCHAR(45) NOT NULL COMMENT 'mime тип файла, например image/gif или text/html' ,
    `users_idusers` INT NOT NULL ,
    PRIMARY KEY (`idfiles`) ,
    INDEX `fk_files_users1` (`users_idusers` ASC) ,
    CONSTRAINT `fk_files_users1`
    FOREIGN KEY (`users_idusers` )
    REFERENCES " 
    DB_DATABASE ".`users` (`idusers` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = utf8
    COLLATE = utf8_general_ci
    "
    );
     
     
            
    $widgets $sql->query("
    CREATE  TABLE IF NOT EXISTS " 
    DB_DATABASE ".`widgets` (
    `idwidgets` INT NOT NULL AUTO_INCREMENT ,
    `name` VARCHAR(55) NOT NULL COMMENT 'Имя модуля' ,
    `head` VARCHAR(255) NOT NULL COMMENT 'Заголовок модуля' ,
    `template` VARCHAR(105) NOT NULL COMMENT '(имя шаблона или путь к нему) пример admin_autorization.php' ,
    PRIMARY KEY (`idwidgets`) )
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = utf8
    COLLATE = utf8_general_ci
    "
    );
     
     
            
    $errors $sql->query("
    CREATE  TABLE IF NOT EXISTS " 
    DB_DATABASE ".`errors` (
    `iderrors` INT NOT NULL AUTO_INCREMENT ,
    `module` VARCHAR(45) NOT NULL COMMENT 'Модуль(виджет) в котором произошла ошибка' ,
    `message` TEXT NOT NULL COMMENT 'Текст ошибки сообщения' ,
    PRIMARY KEY (`iderrors`) )
    ENGINE = InnoDB
    DEFAULT CHARACTER SET = utf8
    COLLATE = utf8_general_ci
    "
    );
     
            
    $sql->query(" SET SQL_MODE=@OLD_SQL_MODE ");
            
    $sql->query(" SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS ");
            
    $sql->query(" SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS ");
     
            if (!
    $users)
                return 
    false;
            if (!
    $articles)
                return 
    false;
            if (!
    $rols)
                return 
    false;
            if (!
    $settings)
                return 
    false;
            if (!
    $files)
                return 
    false;
            if (!
    $widgets)
                return 
    false;
            if (!
    $errors)
                return 
    false;
     
            return 
    true;
        }
        
    //Добавление администратора
        
    private function newAdmin($login$email$password)
        {
            
    $db $this->connect;
            
    $insert_admin "INSERT INTO users (login,email,password,role)
                            VALUES ('
    $login','$email','$password',3)";
            
    $result $db->query($insert_admin);
            if (!
    $result)
                return 
    false;
     
     
            return 
    true;
        }
    }
    ?>
     
  2. ptuchster

    ptuchster Создатель

    Регистр.:
    21 ноя 2007
    Сообщения:
    41
    Симпатии:
    28
    кстати
    1- То что PHP ругнулся на этот скрипт это не повод считать что ожибка здесь. Ошибка может быть где то в другом месте, а здесь только поймалось исключение.
    2- Скорее всего где то закрылось подключение. Где надо смотреть поэтому и сказал что не обязательно здесь. Поэтому желаетльно бы еще узнать что это за система и получить полный исходник который ты пытаешься поставить
    3- Модуль mysqli более высокоуровневый- соответсвенно в неправильных руках он может сделать много плохих вещей, как эти исключения. Чем высооуровнее язык тем более правильно необходимо писать. Это не паскаль :D
    4- Как уже сказал полный лог и желательно полные исходкини чтобы у себя поднять
     
    vhome нравится это.
  3. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.724
    Симпатии:
    2.100
    ещё б интересно было глянуть на ваш пхпинфо, если это и есть тот файл, который выдаёт ошибку, то не совсем понятно с нумерацией строк
    например
    можно вообще для начала создать тестовый скриптец (пару строчек), которые бы осуществил только подключение и исполнение какого-то простого запроса, так будет легче эксперементировать
     

    Вложения:

    • fetch.jpg
      fetch.jpg
      Размер файла:
      114,1 КБ
      Просмотров:
      10
    • fetch2.jpg
      fetch2.jpg
      Размер файла:
      90,4 КБ
      Просмотров:
      9
    • connect.jpg
      connect.jpg
      Размер файла:
      23,9 КБ
      Просмотров:
      7
    vhome нравится это.
  4. ptuchster

    ptuchster Создатель

    Регистр.:
    21 ноя 2007
    Сообщения:
    41
    Симпатии:
    28
    я бы просто дал в зубы php.net и вперед :D потому что такие вещи надо уже как то самим учится решать без форумов :]
     
  5. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.724
    Симпатии:
    2.100
    отчасти верно, отчасти не разумно
    на пхп.нет тоже есть информация, но судя по форуму ребята не особо чтят этот ресурс :smmne:

    я чёт не понял, а конструкция

    $mysqli = new mysqli("localhost", "my_user", "my_password", "world");
    сразу открывает соединение?

    тут http://dev.mysql.com/doc/refman/5.0/en/apis-php-class.mysqli.html в примере идёт проверка и если есть ошибка вернётся код.

    последовательность такая?
    1. создаётся инстанс класса install (классная шняга с @ :crazy:, ничего не знаю, ничего не видел)
    2. вызывается метод start
    ну и дальше возникает ошибка
     
    vhome нравится это.
  6. ptuchster

    ptuchster Создатель

    Регистр.:
    21 ноя 2007
    Сообщения:
    41
    Симпатии:
    28
    Именно так. Для тру ООП задротов :D

    ну впринципе да. Теперь осталось только узнать на какой строке. У меня два варианта - либо в первом же запросе из newDB либо в newAdmin потому что до него вызывают сторонние функции $login = Simple::getClearDB($admin[0]); и не понятно вообще что в них творится. Может там коннект случайно и закрывается. А если первый вариант.... нууууу ... я бы тогда переписал на mysql_connect но тогда надо будет весь скрипт переписать потому что он уже на объект mysql привязан.
     
    vhome нравится это.
  7. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.724
    Симпатии:
    2.100
    меня мама учила ничего тяжёлого в конструкторе не делать, а тут на тебе, у меня сломан шаблон
    только сейчас заметил, что переменная $connect имеет паблик доступ? а как же инкапсуляция. тогда точно возможно, что $login = Simple::getClearDB($admin[0]); подсовывает свинью. хотя, не совсем верно, и всё же ты прав, интересно бы было глянуть на всё остальное творчество.
     
    vhome нравится это.
  8. zloy_admin

    zloy_admin Разработчик

    Заблокирован
    Регистр.:
    15 авг 2011
    Сообщения:
    184
    Симпатии:
    27
    Вот исходники, перезалил
     

    Вложения:

    • proba.rar
      Размер файла:
      112,4 КБ
      Просмотров:
      4
  9. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.724
    Симпатии:
    2.100
    ну вот смотри какая штука получается (падает на одном из последних этапов визарда установки), тоесть получается, что на момент создания инстанса неопределены константы DB_HOST, DB_NAME, DB_USER, DB_PASSWORD и @ успешно "прячет" предупреждения, ну а дальше доминошка :smmne:
    порадовало сообщение в конце после всех предупреждений и ошибок
     

    Вложения:

    • error.jpg
      error.jpg
      Размер файла:
      234,3 КБ
      Просмотров:
      16
    • callstack.jpg
      callstack.jpg
      Размер файла:
      39,1 КБ
      Просмотров:
      7
    vhome нравится это.
  10. zloy_admin

    zloy_admin Разработчик

    Заблокирован
    Регистр.:
    15 авг 2011
    Сообщения:
    184
    Симпатии:
    27
    Ну по идеи константы создаются при попытке установки в файле engine/data/config.db.php

    И в install.php изменил немного вот так
    Код:
     public function __construct()
        {
            $this->connect = @new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_DATABASE);
        }