Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Класс для работы с MySQL (с поддержкой макро-подстановок) (Александр Михалицын)
Author Message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Sun May 24, 2009 5:49 pm (написано за 7 минут 34 секунды)
   Post subject: Класс для работы с MySQL (с поддержкой макро-подстановок)
Reply with quote

Code (php): скопировать код в буфер обмена
<?php
/*

#
# DB Class
#

class DB
{
        #
        # Private properties
        #

        private $host;
        private $user;
        private $password;
        private $db_name;
        private $prefix;

        private $connect_id;

        private $last_query_result;

        private $sql_substitutions_args;

        #
        # Public properties
        #

        public $num_queries = 0;

        #
        # Public methods
        #

        public function __construct($host, $user, $password, $db_name, $prefix, $charset)
        {
                $this->host = $host;
                $this->user = $user;
                $this->password = $password;
                $this->db_name = $db_name;
                $this->prefix = $prefix;
                $this->charset = $charset;
               
                $this->connect_p();
        }

        public function close()
        {
                if ($this->connect_id)
                {
                        mysql_close (www.php.net/mysql_close)($this->connect_id);
                        $this->connect_id = null;
                }
        }

        public function connect()
        {
                if (!$this->connect_id)
                {
                        $this->connect_p();
                }
        }

        public function query($sql)
        {
                if ($this->connect_id)
                {
                        unset (www.php.net/unset)($this->last_query_result);

                        $args = func_get_args (www.php.net/func_get_args)();
                        $sql = $this->parse_sql_substitutions($sql, $args);

                        $this->last_query_result = mysql_query (www.php.net/mysql_query)($sql, $this->connect_id);
                        if ($this->last_query_result)
                        {
                                $this->num_queries++;
                        } else {
                                unset (www.php.net/unset)($this->last_query_result);
                                throw new SQLDBException(": '" . $sql . "'  !");
                        }
                } else {
                        throw new ConnectDBException("    ( query)");
                }
        }

        public function insert($table, $data)
        {
                $this->query("INSERT INTO `?_?c` (?k) VALUES (?s);", $table, array_keys (www.php.net/array_keys)($data), array_values (www.php.net/array_values)($data));
        }

        public function num_rows()
        {
                if ($this->connect_id && isset (www.php.net/isset)($this->last_query_result))
                {
                        return mysql_num_rows (www.php.net/mysql_num_rows)($this->last_query_result);
                }
        }

        public function fetch_array()
        {
                if ($this->connect_id && isset (www.php.net/isset)($this->last_query_result))
                {
                        return mysql_fetch_array (www.php.net/mysql_fetch_array)($this->last_query_result);
                }
        }

        #
        # Private methods
        #

        private function sql_substitutions_filter($result, $type)
        {
                switch ($type)
                {
                        case 's':
                                $result = "'" . mysql_real_escape_string (www.php.net/mysql_real_escape_string)($result, $this->connect_id) . "'";
                        break;

                        case 'd':
                                $result = (int)$result;
                        break;

                        case 'k':
                                $result = '`' . $result . '`';
                        break;

                        case '_': case 'c':
                                $result = $result;
                        break;

                        default:
                                $result = $result;
                }

                return $result;
        }

        private function parse_sql_substitutions_callback($matches)
        {
                static (www.php.net/static) $count = 1;

                if ($matches[1] == '_')
                {
                        $result = $this->prefix;
                } else {
                        $result = $this->sql_substitutions_args[$count++];
                }

                if (gettype (www.php.net/gettype)($result) == 'array')
                {
                        $tmp = '';

                        foreach ($result as $k => $v)
                        {
                                $tmp .= $this->sql_substitutions_filter($v, $matches[1]) . ((isset (www.php.net/isset)($result[$k + 1])) ? ', ' : '');
                        }

                        $result = $tmp;
                } else {
                        $result = $this->sql_substitutions_filter($result, $matches[1]);
                }

                return $result;
        }

        private function parse_sql_substitutions($sql, $args)
        {
                $this->sql_substitutions_args = $args;

                $sql = preg_replace_callback (www.php.net/preg_replace_callback)('#\\?([a-z_])#', array (www.php.net/array)(&$this, "parse_sql_substitutions_callback"), $sql);

                $this->sql_substitutions_args = array (www.php.net/array)();

                return $sql;
        }

        private function connect_p()
        {
                $this->connect_id = mysql_connect (www.php.net/mysql_connect)($this->host, $this->user, $this->password);

                if ($this->connect_id)
                {
                        mysql_query (www.php.net/mysql_query)("SET NAMES '" . $this->charset . "'", $this->connect_id);
                        $db_select = mysql_select_db (www.php.net/mysql_select_db)($this->db_name, $this->connect_id);

                        if (!$db_select)
                        {
                                mysql_close (www.php.net/mysql_close)($this->connect_id);
                                $this->connect_id = null;
                                throw new ConnectDBException("   !");
                        }
                } else {
                        throw new ConnectDBException("    !");
                }
        }
}

#
# Exceptions classes
#

//

//
class ConnectDBException extends Exception
{
        public function __construct($message)
        {
                parent::__construct($message);
        }
}

//
class SQLDBException extends Exception
{
        public function __construct($message)
        {
                parent::__construct($message);
        }
}
?>
Для работы, достаточно подключить класс и создать экземпляр:
Code (php): скопировать код в буфер обмена
$db = new DB(DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_PREFIX, DB_CHARSET);
$db->query("SELECT (?k) FROM ?k", array (www.php.net/array)('поле1', 'поле2'), 'имя таблицы');
Поддерживаются подстановки:
s - строка (прогоняется через мускул реал эскеёп стринг)
d - число
k - оборачивается в ``
_, c, итп -- никак не обрабатывается (просто заменяется).

Использует PHP 5
Back to top
View user's profile Send private message Send e-mail
Guest






Карма: 388
   поощрить/наказать


PostPosted: Mon May 25, 2009 9:08 am (спустя 15 часов 18 минут; написано за 16 секунд)
   Post subject:
Reply with quote

чем это лучше того же dbsimple?
Back to top
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Mon May 25, 2009 11:07 am (спустя 1 час 58 минут; написано за 37 секунд)
   Post subject:
Reply with quote

Гость,
тем, что проще. Не везде нужна такая большая и сложная библиотека как DbSimple...
Back to top
View user's profile Send private message Send e-mail
Guest






Карма: 388
   поощрить/наказать


PostPosted: Mon Jun 15, 2009 12:21 pm (спустя 21 день 1 час 13 минут; написано за 2 минуты 20 секунд)
   Post subject:
Reply with quote

ну да :-) dbsimple тоже сначала был маленький и простой.. каждый велосипед сначала очень прост и практически ничего не умеет. а по мере "обучения" - растёт и усложняется.
а теперь, внимание, вопрос - так ли важно, что там у неё внутри, если вся работа ведётся через специальный интерфейс, который мало чем отличается?
Back to top
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML