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

Очень простой MySQL-класс (kzew)
Author Message
kzew
Заглянувший



Joined: 08 Oct 2004
Posts: 14
Карма: 0
   поощрить/наказать


PostPosted: Mon May 16, 2005 9:38 pm (написано за 32 минуты 23 секунды)
   Post subject: Очень простой MySQL-класс
Reply with quote

Предлагаю Вашему вниманию очень простой класс для доступа к MySQL (точнее 2 класса) с поддержкой placeholders.
Возможно, новичкам он будет полезен.
Code (php): скопировать код в буфер обмена
class mysql (www.php.net/mysql) {

    function _link($newLink=false) {
        static (www.php.net/static) $link;
        if($newLink) $link = $newLink;
        return $link;
    }

    function _fixSql($args) {
        $sql = array_shift (www.php.net/array_shift)($args);
        if(count (www.php.net/count)($args)) {
            $data = array_map (www.php.net/array_map)(array (www.php.net/array)('mysql','esc'), $args);
            $sql = str_replace (www.php.net/str_replace)(array (www.php.net/array)('%','?'), array (www.php.net/array)('%%','%s'), $sql);
            $sql = vsprintf (www.php.net/vsprintf)($sql, $data);
        }
        return $sql;
    }

    function _error($errMsg, $sql='') {
        $str = '<br /><b>'.$errMsg.'</b>: <tt>'.mysql_error().'</tt>';
        if($sql) $str .= '  ['.$sql.']';
        die (www.php.net/die)($str);
    }

    function count (www.php.net/count)($increment=false) {
        static (www.php.net/static) $count = 0;
        if($increment) $count++;
        return $count;
    }

    function connect($host, $user, $pass, $dbName) {
        if($link=@mysql_connect (www.php.net/mysql_connect)($host, $user, $pass)) mysql (www.php.net/mysql)::_link($link);
        else mysql (www.php.net/mysql)::_error('Database server connection failure');
        if(!@mysql_select_db (www.php.net/mysql_select_db)($dbName, mysql (www.php.net/mysql)::_link())) mysql (www.php.net/mysql)::_error('Database selection failure');
    }

    function disconnect() {
        mysql_close (www.php.net/mysql_close)(mysql (www.php.net/mysql)::_link());
    }

    function query() {
        mysql (www.php.net/mysql)::count (www.php.net/count)(1);
        $sql = mysql (www.php.net/mysql)::_fixSql(func_get_args (www.php.net/func_get_args)());
        if(!$query=mysql_query (www.php.net/mysql_query)($sql, mysql (www.php.net/mysql)::_link())) mysql (www.php.net/mysql)::_error('Database query failure', $sql);
        return new mysqlResultSet($query);
    }

    function esc($str) {
        return mysql_escape_string (www.php.net/mysql_escape_string)(stripslashes (www.php.net/stripslashes)($str));
    }

}

class mysqlResultSet {

    var $q;

    function mysqlResultSet($query) {
        $this->q = $query;
    }

    function getRow() {
        return mysql_fetch_object (www.php.net/mysql_fetch_object)($this->q);
    }

    function getVar() {
        return ($row=mysql_fetch_row (www.php.net/mysql_fetch_row)($this->q)) ? $row[0] : false;
    }

    function getAll() {
        $all = false;
        while($row=$this->getRow()) $all[] = $row;
        return $all;
    }

    function getCol() {
        $col = false;
        while($var=$this->getVar()) $col[] = $var;
        return $col;
    }

    function rowCount() {
        return mysql_num_rows (www.php.net/mysql_num_rows)($this->q);
    }

    function insertId() {
        return mysql_insert_id (www.php.net/mysql_insert_id)($this->q);
    }

}
Использование
Основные функции:
    mysql::connect('сервер', 'пользователь', 'пароль', 'имя базы данных') - соединение с БД
    mysql::query('SELECT/UPDATE/.. WHERE id=? ..', $someId) - запрос с символами ? в качестве placeholders
    mysql::count() - общее количество запросов
    mysql::esc($someUserInput) - обрабатывает даные для безопастного запроса (необязательно, если используются placeholders)
Получение данных:
В качестве результата запроса возвращается объект класса mysqlResultSet, обладающий следующими методами:
    getRow() - единичный объект, свойствами которого являются запрошенные поля (ряда)
    getAll() - возвращает массив-список всех объектов результата сразу (все ряды)
    getVar() - первое запрошенное поле как переменная
    getCol() - возвращает массив-список всех результатов для первого запрошенного поля (колонку таблицы)
    rowCount() - количество затронутых запросом записей (рядов)
    insertId() - использованное значение поля auto_increment (id) при запросе-вставке
Как класс mysql, так и mysqlResultSet очень просто расширять своими методами.

Примеры:
Code (php): скопировать код в буфер обмена
mysql (www.php.net/mysql)::connect('localhost', 'root', 'root', 'database');
$entries = mysql (www.php.net/mysql)::query('SELECT * FROM `some_entries` WHERE `date` < ?', time (www.php.net/time)());
var_dump (www.php.net/var_dump)($entries->getAll()); // Array

$VasyaInfo = mysql (www.php.net/mysql)::guery('SELECT `lastname` FROM `users` WHERE `name`="?" AND `gender`="?"', 'Vasya', 'M');
$VasyasSurname = $VasyaInfo->getVar(); // string

$currentDir = mysql (www.php.net/mysql)::query('SELECT * FROM `files` WHERE `path` LIKE "?%" AND `owner`=?', '/some/dir/', 100);
while($file = $currentDir->getRow()) {
    echo (www.php.net/echo)($file->name . '<br />');
}


Last edited by kzew on Thu May 19, 2005 7:24 pm; edited 3 times in total
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 414
   поощрить/наказать


PostPosted: Thu May 19, 2005 5:11 pm (спустя 2 дня 19 часов 33 минуты; написано за 1 минуту 8 секунд)
   Post subject:
Reply with quote

Можно несколько замечаний?
1. Название класса не очень хорошее - лучше бы mysql, а не sql хотя бы...
2. Нет поддержки работы с несколькими соединениями одновременно, хотя ООП как раз позволяет добиться этой функциональности максимально удобным способом.

Хотя, в принципе, код вполне рабочий.
Back to top
View user's profile Send private message Send e-mail
kzew
Заглянувший



Joined: 08 Oct 2004
Posts: 14
Карма: 0
   поощрить/наказать


PostPosted: Thu May 19, 2005 7:14 pm (спустя 2 часа 3 минуты; написано за 2 минуты 15 секунд)
   Post subject:
Reply with quote

Quote:
1. Название класса не очень хорошее - лучше бы mysql, а не sql хотя бы...
На целых две буквы длиннее, но Вы правы %)
Quote:
Нет поддержки работы с несколькими соединениями одновременно
Просто в моей бедной практике необходимость в этом пока не возникала.
Back to top
View user's profile Send private message Send e-mail
n00b
Guest





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


PostPosted: Wed Aug 24, 2005 4:08 am (спустя 3 месяца 4 дня 8 часов 53 минуты; написано за 8 секунд)
   Post subject:
Reply with quote

замороченная хренототень ! :(
Back to top
СидоровАлексей
Guest





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


PostPosted: Sun Oct 16, 2005 9:04 pm (спустя 1 месяц 23 дня 16 часов 55 минут; написано за 3 минуты 33 секунды)
   Post subject:
Reply with quote

Извиняюсь конечно, но новечкам гораздо полезнее будеть самим разобраться с запросами.Другое дело если этот класс как-бы один из.Те например ты написал гостевую книгу и сделал только ее для МайЭСКУЭЛ а кто то хочет юзать ее с чем-то другим - тогда это нужно.Но всетаки, скажу честно когда я был новичком то разбирал чужой код только для интереса что там и как работает, но никогда не юзал его.ИМХО.
Back to top
MpaK
Участник форума



Joined: 28 Jul 2003
Posts: 34
Карма: 0
   поощрить/наказать

Location: Ufa/Russia

PostPosted: Mon Oct 17, 2005 10:00 am (спустя 12 часов 56 минут; написано за 16 секунд)
   Post subject:
Reply with quote

мне кажется при каждом запросе создавать объект как-то расточительно?
Back to top
View user's profile Send private message
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