A
A
Anton Babilya2015-08-29 13:32:16
PHP
Anton Babilya, 2015-08-29 13:32:16

How can the class be improved to work with PDO?

Good day, some time ago I wrote a class for working with PDO.
I ask you to evaluate the experts, I would like adequate criticism, why it's bad, and how to fix it.
Perhaps somewhere there is extra code that can be replaced with one line, etc.

<?php
 
/**
 * @GetConnectionStatus Возвращает состояние подключения (TRUE либо FALSE)
 * @GetConnectionError Возвращает ошибку подключения, в случае ее наличия (Возвращает строку либо NULL)
 * @getInstance  Метод паттерна singleton, проверающий создан ли обьект класса (Инициализируем класс с его помощью)
 * @exec Запускает SQL запрос на выполнение и возвращает количество строк, задействованых в ходе его выполнения.
 * @query  выполняет SQL запрос без подготовки и возвращает результирующий набор (если есть) в виде объекта PDOStatement.
 * @insert  Добавляет строку в указанную таблицу, входящие данные название таблицы, и массив с данными, на выходе BOOLEAN
 * @update Обновление строки, входящие данные название таблицы, массив с данными для WHERE, и массив с данными для изминения
 * @select Функция получения данных из таблицы в форме массива, на входе таблица, столбцы для получения (через запятую), и массив с WHERE данными
 * @delete функция удаления строки из таблицы, первый параметр это таблица, второй WHERE массив
 * @count Функция выдающее количество строк по указанному SQL запросу
 * @addslashes экранирование
 */
 
Class PdoDatabase
{
 
    protected static $_instance = NULL;
    protected static $db = NULL;
    protected static $connection_status = TRUE;
    protected static $error_text = NULL;
 
    private function __construct($db_host, $db_name, $db_user, $db_password) {
        try {
        self::$db = new PDO('mysql:host='.$db_host.';dbname='.$db_name.'', $db_user, $db_password, array(PDO::ATTR_PERSISTENT => true));
        self::$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        self::$db->exec('SET names utf8');
        } catch(PDOException $e) {
            self::$connection_status = FALSE;
            self::$error_text = $e->getMessage();
        }
    }
 
    public static function GetConnectionStatus() {
        return self::$connection_status;
    }
 
    public static function GetConnectionError() {
        return self::$error_text;
    }
 
    public static function getInstance($db_host, $db_name, $db_user, $db_password) {
        if (!(self::$_instance instanceof self)) {
            self::$_instance = new self($db_host, $db_name, $db_user, $db_password);
        }
        return self::$_instance;
    }
 
    public static function exec($query) {
        return self::$db->exec($query);
    }
 
    public static function query($query) {
        return self::$db->query($query);
    }
 
    public static function insert($table, $params) {
        foreach($params as $key => $value) {
            $keys[] = $key;
            $statemans[] = ":$key";
        }
        $result = self::$db->prepare("INSERT INTO `".$table."` (".implode(', ', $keys).") VALUES (".implode(', ', $statemans).");");
        return $result->execute($params);
    }
 
    public static function update($table, $updating, $where) {
        $i = 0;
        $list = '';
        foreach($updating as $key => $value) {
            $i++;
            if ($i < count($updating)) {
                $list .= "$key=:$key, ";
            } else {
                $list .= "$key=:$key";
            }
        }
 
        $i = 0;
        $where_list = '';
 
        foreach($where as $key => $value) {
            $i++;
            if ($i < count($where)) {
                $where_list .= "$key=:$key AND ";
            } else {
                $where_list .= "$key=:$key";
            }
        }
        $sql = "UPDATE `".$table."` SET ".$list."  WHERE ".$where_list."";
        $result = self::$db->prepare($sql);
        foreach($updating as $key => $value) {
            $result->bindValue(':'.$key, $value);
        }
        foreach($where as $key => $value) {
           $result->bindValue(':'.$key, $value);
        }
        return $result->execute();
    }
 
    public static function delete($table, $where) {
        $i = 0;
        $list = '';
        foreach($where as $key => $value) {
            $i++;
            if ($i < count($where)) {
                $list .= ":$key = $key AND ";
            } else {
                $list .= ":$key = $key";
            }
        }
        $result = self::$db->prepare("DELETE FROM `".$table."` WHERE $list");
        return $result->execute($where);
    }
 
    public static function select($table, $select, $params) {
        $i = 0;
        $list = '';
        foreach($params as $key => $value) {
            $i++;
            if ($i < count($params)) {
                $list .= ":$key = $key AND ";
            } else {
                $list .= ":$key = $key";
            }
        }
        $result = self::$db->prepare("SELECT ".$select." FROM `".$table."` WHERE $list");
        $result->execute($params);
        return $result->fetchAll();
    }
 
    public static function count($query) {
        $result = self::$db->query($query);
        return $result->rowCount();
    }
 
    public static function addslashes($str) {
        return addslashes($str);
    }
 
    private function __clone() {}
    private function __wakeup() {}
}
 
// Подключение к БД
$object = PdoDatabase::getInstance('localhost', 'laravel', 'root', 'root');
 
// Проверка статуса подключения
$result = PdoDatabase::GetConnectionStatus();
if ($result) {
    echo 'Connection sucsess <br>';
 
    // Использование любомого метода
    echo PdoDatabase::delete('articles', array('id' => 16));
} else {
    // Получение ошибки подключения, в случае ее наличия
    echo PdoDatabase::GetConnectionError();
}

Answer the question

In order to leave comments, you need to log in

1 answer(s)
K
Konstantin B., 2015-08-30
@Kostik_1993

What does this entry mean?
:$key = $key AND

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question