MySQL. Создание класса на PHP для работы с MySQL

Sunday, 17 January 2010 | Автор: programmer

Рассмотрев в прошлой статье работу с классами и объектами сейчас мы попробуем создать свой класс по работе с базой данных. Данный класс позволит нам реализовывать в наших программах почти все функции MySQL.

 

Назовем наш класс sql_db и создадим для него конструктор, который будет принимать настройки соединения:

class sql_db {
    var $db_connect_id;
    var $user;
    var $password;
    var $server;
    var $database;

    function sql_db($sqlserver, $sqluser, $sqlpassword, $database) {
        $this->user = $sqluser;
        $this->password = $sqlpassword;
        $this->server = $sqlserver;
        $this->dbname = $database;
        
        $this->db_connect_id = mysql_connect($this->server, $this->user, $this->password);

        if( $this->db_connect_id ) {
            if( $database != "" ) {
                $this->dbname = $database;
                $dbselect = mysql_select_db($this->dbname);

                if( !$dbselect ) {
                    mysql_close($this->db_connect_id);
                    $this->db_connect_id = $dbselect;
                }
            }

            return $this->db_connect_id;
        }
        else {
            return false;
        }
    }
}

 

Разберем этот код. Изначально объявляем свойства нашего класса:

db_connect_id - идентификатор соединения
user - пользователь БД
password - пароль к БД
server - сервер БД
database - имя базы данных

 

Подсоединение к базе данных происходит путем вызова функции mysql_connect, принимающей параметры сервера, пользователя и пароля. Далее обязательно проверяем произошло ли соединение с базой данных, если да, то выбираем базу данных через функцию mysql_select_db, в противном случае возвращаем ошибку.

 

Теперь мы имеем соединение с базой данных, но этого мало, реализуем функцию отсылки запросов к БД.

    function sql_query($query = "") {
        unset($this->query_result);        
        $this->query_result = mysql_query($query, $this->db_connect_id);

        if( $this->query_result ) {
            return $this->query_result;
        }
        else {
            $this->query_err .= "<br>n" . $this->sql_error_msg()    ;
            return false;
        }
    }

 

На вход нашей функции sql_query передается запрос, которая выполняет mysql-функцию mysql_query. Здесь также проверяем что возвращает функция, если есть результат, то возвращаем его пользователю, в противном случае возвращаем ошибку.

 

Для связки подключение->запрос->ответ нам не хватает одной функции - это функция обработки ответа от MySQL-сервера. Создадим 2 функции, которые будут отдавать ассоциативные массивы. Функция sql_fetchrow будет обрабатывать ряд запроса и возвращать текущий ассоциативный массив, а функция sql_fetchrowset возращать полный ответ от сервера, т.е. многомерный ассоциативный массив.

 

    function sql_fetchrow($query_id = 0) {
        if( !$query_id ) {
            $query_id = $this->query_result;
        }

        if( $query_id ) {
            return @mysql_fetch_array($query_id, MYSQL_ASSOC);
        }
        else {
            return false;
        }
    }

    function sql_fetchrowset($query_id = 0) {
        if( !$query_id ) {
            $query_id = $this->query_result;
        }

        if( $query_id ) {
            unset($this->rowset);
            unset($this->row[$query_id]);

            while($this->rowset = @mysql_fetch_array($query_id, MYSQL_ASSOC)) {
                $result[] = $this->rowset;
            }

            return isset($result) ? $result : false ;
            unset($result);
        }
        else {
            return false;
        }
    }

 

Также есть другие функции, которые нам помогут в работе: sql_numrows - функция отдает количество возвращаемых БД-сервером рядов (для SELECT), sql_affectedrows - количество записей, которые были затронуты последним запросом (Для UPDATE, DELETE, INSERT), sql_numfields - количество возвращаемых полей в ответе, sql_fieldname - возвращает наименование поля, порядковый номер которого задается параметом offset, sql_fieldtype - возвращает тип поля, порядковый номер которого задается параметом offset, sql_rowseek - смещение указателя на rownum, sql_nextid - возвращает последний добавленный ID командой INSERT, sql_freeresult - освобождение памяти, sql_error - возвращает код последней ошибки и ее описание, sql_close - закрыть соединение с базой данных.

 

Теперь давайте попробуем поработать с нашим классом. Для примера будем использовать базу данных, созданную в уроках про phpMyAdmin и данные, которые мы добавляли в статье про основные типы запросов к MySQL. Создадим объект $db.

 

<?php
    include "mysql.php";
    $db = new sql_db("localhost", "root", "", "test");
?>

 

Теперь попробуем из таблицы books выбрать все записи двумя способами, с помощью функций sql_fetchrow и sql_fetchrowset

<?php
    $db->sql_query("select * from books;");


    while ($row = $db->sql_fetchrow()) {

      echo "Автор: {$row['autor']}. Книга: {$row['name']}<BR/>";

    }
?>

 

<?php
    $db->sql_query("select * from books;");

    $rowset = $db->sql_fetchrowset();


    foreach ($rowset as $row) {

      echo "Автор: {$row['autor']}. Книга: {$row['name']}<BR/>";

    }
?>

 

Чтобы узнать сколько записей возвращается из запроса, выполним следующий код:

<?php
    $db->sql_query("select * from books;");
    echo "Количество записей: ".$db->sql_numrows()."<BR/>";

?>

 

Узнаем ID последней добавленной записи

<?php
    $db->sql_query("INSERT INTO (name, autor) VALUES ('Рога и копыта', 'Вася Пупкин')");
     echo "Последний ID: ".$db->sql_nextid()."<BR/>";

?>

 

Скачать класс работы с MySQL и пример работы с классом можно по ссылкам:


 
Tweet


Категория(и): Изучаем PHP, Скрипты, MySQL

Комментарии


Thursday, 21 January 2010 | 21:30:51 | Автор: my
Очередной велосипед =) В следеющих статьях, полагаю, следует ожидать навыки работы с фреймворками =)
Thursday, 21 January 2010 | 22:40:56 | Автор: programmer
ФВ точно давать не буду, если человек научится писать сам, то разобраться с фреймворками не составит труда
Saturday, 06 February 2010 | 23:07:56 | Автор: my
А что означает '@' перед mysql_fetch_array?

А где у нас определена функция $this->sql_error_msg()?

Походу глюка на форуме.
Sunday, 07 February 2010 | 00:13:02 | Автор: my
В PHP5 конструктор объявляется как '__coustruct'.
Sunday, 07 February 2010 | 11:33:28 | Автор: programmer
my,

@ перед функциями или переменными означает подавление предупреждений (warning) при обращении к ним, если, например, они не существуют

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

sql_error_msg() есть в классе, скачайте его, я же написал, что в классе есть и другие функции, которые в статье не описываю
Monday, 07 June 2010 | 00:00:26 | Автор: newt

Спасибо за уроки :-)

Жалко исчезли ссылки на скачивание примеров - хотелось на другие функции посмотреть (

Monday, 07 June 2010 | 08:46:02 | Автор: programmer

newt,

Скачать класс можете по ссылке phpprogs.ru/uploads/mysql.zip

Отвечу на вопросы по PHP

Friday, 25 May 2012 | 01:33:56 | Автор: olegsobachnik

Вам правда удобно читать исходники, выровняные по правому краю и таким мелким шрифтом? :-)

Tuesday, 11 December 2012 | 01:35:27 | Автор: garry599

Спасибо большое за краткое и простое представление снтаксиса написания классов в PHP! :-)

Google всему голова!
Sunday, 10 February 2013 | 19:12:39 | Автор: esolo

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

Sunday, 10 February 2013 | 19:13:41 | Автор: esolo

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

Добавить комментарий
Чтобы оставить комментарий, Вам необходимо зарегистрироваться или авторизироваться