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

zloy_admin

Разработчик
Заблокирован
Регистрация
15 Авг 2011
Сообщения
186
Реакции
28
  • Автор темы
  • Заблокирован
  • #1
Здравствуйте! Подскажите как решить проблему с выдаваемыми ошибками:

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_HOST, DB_USER, DB_PASSWORD, DB_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;
    }
}
?>
 
кстати
1- То что PHP ругнулся на этот скрипт это не повод считать что ожибка здесь. Ошибка может быть где то в другом месте, а здесь только поймалось исключение.
2- Скорее всего где то закрылось подключение. Где надо смотреть поэтому и сказал что не обязательно здесь. Поэтому желаетльно бы еще узнать что это за система и получить полный исходник который ты пытаешься поставить
3- Модуль mysqli более высокоуровневый- соответсвенно в неправильных руках он может сделать много плохих вещей, как эти исключения. Чем высооуровнее язык тем более правильно необходимо писать. Это не паскаль :D
4- Как уже сказал полный лог и желательно полные исходкини чтобы у себя поднять
 
тут пробовали почитать?
Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся

ещё б интересно было глянуть на ваш пхпинфо, если это и есть тот файл, который выдаёт ошибку, то не совсем понятно с нумерацией строк
например
Warning: mysqli::query() [mysqli.query]: Couldn't fetch mysqli in E:\domains\cpe.loc\engine\install\install.php on line 94

можно вообще для начала создать тестовый скриптец (пару строчек), которые бы осуществил только подключение и исполнение какого-то простого запроса, так будет легче эксперементировать
 

Вложения

  • fetch.jpg
    fetch.jpg
    114,1 KB · Просмотры: 11
  • fetch2.jpg
    fetch2.jpg
    90,4 KB · Просмотры: 9
  • connect.jpg
    connect.jpg
    23,9 KB · Просмотры: 7
я бы просто дал в зубы php.net и вперед :D потому что такие вещи надо уже как то самим учится решать без форумов :]

отчасти верно, отчасти не разумно
на пхп.нет тоже есть информация, но судя по форуму ребята не особо чтят этот ресурс :smmne:

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

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

тут Для просмотра ссылки Войди или Зарегистрируйся в примере идёт проверка и если есть ошибка вернётся код.

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

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

Именно так. Для тру ООП задротов :D

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

ну впринципе да. Теперь осталось только узнать на какой строке. У меня два варианта - либо в первом же запросе из newDB либо в newAdmin потому что до него вызывают сторонние функции $login = Simple::getClearDB($admin[0]); и не понятно вообще что в них творится. Может там коннект случайно и закрывается. А если первый вариант.... нууууу ... я бы тогда переписал на mysql_connect но тогда надо будет весь скрипт переписать потому что он уже на объект mysql привязан.
 
Именно так. Для тру ООП задротов :D
меня мама учила ничего тяжёлого в конструкторе не делать, а тут на тебе, у меня сломан шаблон
ну впринципе да. Теперь осталось только узнать на какой строке. У меня два варианта - либо в первом же запросе из newDB либо в newAdmin потому что до него вызывают сторонние функции $login = Simple::getClearDB($admin[0]); и не понятно вообще что в них творится. Может там коннект случайно и закрывается. А если первый вариант.... нууууу ... я бы тогда переписал на mysql_connect но тогда надо будет весь скрипт переписать потому что он уже на объект mysql привязан.
только сейчас заметил, что переменная $connect имеет паблик доступ? а как же инкапсуляция. тогда точно возможно, что $login = Simple::getClearDB($admin[0]); подсовывает свинью. хотя, не совсем верно, и всё же ты прав, интересно бы было глянуть на всё остальное творчество.
 
  • Автор темы
  • Заблокирован
  • #8
Вот исходники, перезалил
 

Вложения

  • proba.rar
    112,4 KB · Просмотры: 4
Вот исходники, перезалил
ну вот смотри какая штука получается (падает на одном из последних этапов визарда установки), тоесть получается, что на момент создания инстанса неопределены константы DB_HOST, DB_NAME, DB_USER, DB_PASSWORD и @ успешно "прячет" предупреждения, ну а дальше доминошка :smmne:
порадовало сообщение в конце после всех предупреждений и ошибок
Успешная установка :sun:
 

Вложения

  • error.jpg
    error.jpg
    234,3 KB · Просмотры: 16
  • callstack.jpg
    callstack.jpg
    39,1 KB · Просмотры: 7
  • Автор темы
  • Заблокирован
  • #10
ну вот смотри какая штука получается
Ну по идеи константы создаются при попытке установки в файле engine/data/config.db.php

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