php: синглтон для работы с БД

218
07 мая 2018, 22:56

написал вот такой код для работы с БД:

class CConnectionSingleton
{
    private static $_instance = null;
    private static $_db_address     = 'xxx';
    private static $_db_logon       = 'xxx';
    private static $_db_password    = 'xxx';
    private static $_db_goods_db    = 'xxx';
    private $_connection = null;
    public static function getInstance()
    {
        if (self::$_instance != null) {
            return self::$_instance;
        }
        return new self;
    }
    private function __construct () {
        $_connection = new mysqli($_db_address , $_db_logon, $_db_password, $_db_goods_db);
    }
    private function __clone () {}
    private function __wakeup () {}
    // закрыть соединение
    public function closeConnection()
    {
        $_connection->close();
    }
    // получить данные по запросу в БД
    public function sql2data($query)
    {
        // выполнить запрос в БД
        $result = $_connection->query($query);
        // сформировать результат
        $data = $result->fetch_all(MYSQLI_ASSOC);
        // очистить память после выполнения sql запроса
        do{} while($_connection->more_results() && $_connection->next_result());
        // сформировать json строку по результату
        return $data;       
    }
    // перевести результат sql запроса в json
    public function sql2json($query)
    {
        // сформировать json строку по результату
        return json_encode($this->sql2data($query));       
    }
    // выполнить запрос в БД
    public function sql2simple($query)
    {
        // выполнить запрос в БД
        $result = $_connection->query($query);  
    }
}

Вызываю следующим образом:

<html>
    <head>
        <meta charset="UTF-8" />
    </head>
    <body>
<?php
    include ('test.php');
    // установить соединение
    $connection = CConnectionSingleton::getInstance();
    $queryData = $connection->sql2json("SELECT * FROM table;");
?>
<script>
    var data = <?php echo json_encode($queryData, JSON_NUMERIC_CHECK) ?>;
    console.log(JSON.parse(data));
</script>   
    </body>
</html>

PHP ругается на

Fatal error: Call to a member function query() on a non-object in test.php on line 42

line 42 - это

$result = $_connection->query($query);

В чем может быть проблема?

Что-то туплю, ошибка то элементарная

P.S.

Ещё не понятно, если меняю

return json_encode($this->sql2data($query)); 

на

return json_encode(sql2data($query)); 

ловлю на этой строчке ошибку

Fatal error: Call to undefined function sql2data() in test.php on line 58

Вроде же из метода класса обратился к тому же методу, зачем явно указывать это

Answer 1

Нашёл одну ошибку - соединение не устанавливалось, Исправил код:

$_connection = new mysqli(self::$_db_address, self::$_db_logon, self::$_db_password, self::$_db_goods_db);

основную ошибку это не исправило, но теперь устанавливается соединение

проверил внутри функции sql2data - там переменная _connection уже не определена :(

P.S.

ВСЁ, НАШЕЛ И ИСПРАВИЛ ОШИБКУ

Надо было обращаться к $_connection через $this

например,

$this->_connection = new mysqli(self::$_db_address, self::$_db_logon, self::$_db_password, self::$_db_goods_db);

или

$result = $this->_connection->query($query);
Answer 2

Дело в том, что в php нет сокращенного синтаксиса обращения к полям объекта/класса.
Т.е. $this->/self:: нельзя опустить, они обязательны.

В случае их отсутствия, всегда подразумевается обычная локальная переменная.

Итак, $this->_connection = new mysqli..., $this->_connection->close() и т.д.

READ ALSO
Поиск по базе данных на PHP

Поиск по базе данных на PHP

Помогите, пожалуйстаНе получается осуществить поиск по базе данных

182
Получить id с помощью username

Получить id с помощью username

Есть таблица tb_user со столбцами user_id и usernameВ массиве $usernames[] храниться username некоторых пользователей

213
Введение данных в json файл

Введение данных в json файл

У меня есть вопрос по введению данных в json файлВообщем, мне нужно, что бы json файл хранил в себе часть кода, ид видеозаписи, ид пользователя,...

210
Роутинг в Laravel

Роутинг в Laravel

Начал познавать данный фреймворкВозник вопрос

197