Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Класс для работы с БД


Автор: CyClon 28.11.2007, 13:47
Код
<?php

class DB
{
    public function __construct($type, $host, $user, $password, $db)
    {
        switch ($type) {
            case 'mysql':
                return new MySQL($host, $user, $password, $db);
                break;
        }
    }
}

?>

Код
<?php

class MySQL
{
    private $host;
    private $user;
    private $password;
    private $db;
    private $cid;
    private $persistent = FALSE;
    private $errors;

    public function __construct($host, $user, $password, $db)
    {
        $this->host = $host;
        $this->user = $user;
        $this->password = $password;
        $this->db = $db;
    }

    public function connect()
    {
        if ($this->cid = ($this->persistent) ? mysql_pconnect($this->host, $this->user, $this->password) : mysql_connect($this->host, $this->user, $this->password)) {
            if (mysql_select_db($this->db, $this->cid)) {
                return TRUE;
            } else {
                $errors[] = mysql_error($this->cid);
                return FALSE;
            }
        } else {
            $errors[] = mysql_error($this->cid);
            return FALSE;
        }
    }

    public function query($query)
    {
        $query = mysql_real_escape_string($query);
        if ($result = mysql_query($query, $this->cid)) {
            return $result;
        } else {
            $errors[] = mysql_error($this->cid);
            return FALSE;
        }
    }

    public function disconnect()
    {
        if ($this->cid) {
            mysql_close($this->cid);
        }
    }

    public function __destruct()
    {
        $this->disconnect();
    }
}

?>


Проблема в строке return new MySQL($host, $user, $password, $db). Мне нужно сделать, чтобы работать можно было так:
Код
<?php

$db = new DB('mysql', 'localhost', 'root', '', 'db');
$db->connect();
$db->query('...');

?>


Но, что-то не очень получается. Подскажите как организовать.

ЗЫ: Подход к написанию класс правильный? Или может стоит подумать о других вариантах реализации?

Автор: SamDark 28.11.2007, 14:45
А вообще писать надо?
http://dklab.ru/lib/DbSimple/

Автор: teroni 28.11.2007, 15:12
Я бы сделал общий класс DB, в котором находились бы общие для всех типов БД свойства и методы.
А потом для каждого БД делал класс типа MySQL extends DB, PostgreSQL extends DB и т.д.
А вызывал бы
Код

<?php
$db1 = new MySQL('localhost', 'root', '', 'db');
$db1->connect();
$db1->query('...');

$db2 = new PostgreSQL('localhost', 'root', '', 'db');
$db2->connect();
$db2->query('...');
?>

Автор: vasac 28.11.2007, 15:14
Какой смысл использовать различные СУБД при одинаковом SQL?

Автор: CyClon 28.11.2007, 15:42
teroni, тип базы данных нужно хранить в конфиге, соответственно это будет константа. Я могу написать: $db = new DB(DB_TYPE, DB_HOST, DB_USER, DB_PASSWORD, DB_NAME). Написать же $db = new DB_TYPE(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) я не смогу (или смогу? smile ). Получается если нужно будет перейти с MySQL на PostrageSQL или др. БД, придется лезть в код и т.п. smile Это конечно не сложно, но хотелось бы, чтобы все было по-человечески. Использовать такие вещи как PEAR DB не буду, ибо слишком громоздко.

Автор: CyClon 28.11.2007, 21:46
Сделал так:

Код
<?php

$db = DB:create('mysql://root@localhost/test');
$db->connect;

?>


Вроде норм smile

Автор: Azalis 29.11.2007, 13:06
Знаешь, мне очен странна вот эта функция:

Код

public function query($query)
    {
        $query = mysql_real_escape_string($query);
        if ($result = mysql_query($query, $this->cid)) {
            return $result;
        } else {
            $errors[] = mysql_error($this->cid);
            return FALSE;
        }
    }


Получается, что ты ВЕСЬ ЗАПРОС проверяешь на запрещённые символы.. тоесть получается, что когда ты передашь ей запрос типа:
Код

SELECT  * FROM `tbl_users` WHERE `id`='name'

На выходе при подаче запроса получится следующее:
Код

SELECT  * FROM \`tbl_users\` WHERE \`id\`=\'name\'


Крута, правда? ))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)