Создаем класс для работы с базой данных в PHP

класс базы данных

От автора: в данном уроке мы рассмотрим простой пример создания собственного класса ООП PHP, для работы с базой данных.

Замечание: данный класс не является эталонным, на который стоит равняться. Цель данного урока показать, как можно все удобно сгруппировать для комфорта создания CMS в будущем.

Скелет класса PHP для работы с базой данных

Прежде чем начать писать класс для работы с базой данных в PHP, мы сначала набросаем его скелет, кстати имя нашего класса будет DBClass.

Во-первых, нам понадобиться два метода:

для того, чтобы соединится с базой;

для дисконнекта с базой.

Во-вторых, в скелет класса войдет группа методов дляредактирование определенных таблиц базы данных. Например, вставка, удаление, выборка – insert, delete, select соответственно. Операции типа редактирование и т.п. будет вам как домашнее задание. Напишите сами, тем самым дополнив базу данных новыми полезными компонентами, то есть методами.

На этом пока все.

Схематический скелет класса DBClass:

function__construct(); (метод, который вызывается автоматически, при создании класса)

function openConnection();

function select();

function insert();

function delete();

function closeConnection();

Пишем метод __construct();

В этот метод извне мы будет передавать 4 параметра: хост, имя пользователя, пароль, имя базы данных. Потом присвоим эти переменные аналогичным классовым переменным. И конечно, же вызовем метод открытия соединения сMySQL.

метод select();

Цель метода состоит в возвращении массива значений выбранных полей в запросе. С полученным массивом в будущем будет намного проще работать. Разберем словесно алгоритм работы метода.

Объявляем переменную $fetched как массив, в котором будет храниться значения выбранных полей в запросе.

Формируем запрос ($sql) в MySQL и отправляем его mysql_query($sql)

Начало цикла $i

Далее у нас идет цикл for, в котором мы перебираем выбранные из MySQL строки по очереди. Количество строк узнаем при помощи функции mysql_num_rows()

В цикле мы по очереди извлекаем результирующий ряд (строку) как ассоциативный массив, с которого сразу же возвращаем все ключи массива в переменную $key

Считаем количество элементов массива $key ($numKeys = count($key);)

Начало цикла $x

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

Конец цикла $x

Конец цикла $i

Далее else(елсами) возвращаем при неудаче false к соответствующим ифам (if).

Метод select() готов.

public function select($what,$from,$where = null,$order = null)
    {   $fetched = array();         
        $sql = 'SELECT '.$what.' FROM '.$from;  
if($where != null) $sql .= ' WHERE '.$where;  
if($order != null) $sql .= ' ORDER BY '.$order;  

        $query = mysql_query($sql);  
if($query)  
        {  
            $rows = mysql_num_rows($query);  
for($i = 0; $i < $rows; $i++)  
            {  
                $results = mysql_fetch_assoc($query);  
                $key = array_keys($results);
                    $numKeys = count($key);
for($x = 0; $x < $numKeys; $x++)  
                { 
                    $fetched[$i][$key[$x]] = $results[$key[$x]];                           
                }                                          
            } 
return $fetched; 
        }  
else
        {  
return false;  
        }                   
    }

Вид полученного массива:

класс базы данных

метод insert();

Здесь все очень просто. Давайте вспомним как формируетсязапрос вставки в MySQL. Примерно так: $sql = ‘NSERT INTO table VALUES (……..)’. Конечно, можно ещё указать в какие поля вставлять.

Алгоритм метода просто:

Сначала мы формируем сам SQL запрос.

Далее в цикле мы немного изменяем вид значений, которые передались извне через параметры функции.

for($i = 0; $i < $numValues; $i++)  
            {  
if(is_string($values[$i])) $values[$i] = '"'.$values[$i].'"';
}

теперь превращаем массив $values в строку, разделяя элементы массива запятой.

далее mysql_query($insert) и проверка на истинность выполнения запроса.

public function insert($table,$values,$rows = null)  
    {  
            $insert = 'INSERT INTO '.$table;  
if($rows != null)  
            {  
                $insert .= ' ('.$rows.')';  
            }  
            $numValues = count($values);
for($i = 0; $i < $numValues; $i++)  
            {  
if(is_string($values[$i])) $values[$i] = '"'.$values[$i].'"';
            }  
            $values = implode(',',$values);  
            $insert .= ' VALUES ('.$values.')';  
            $ins = mysql_query($insert);
return ($ins) ? true : false;
    }

метод delete();

Предполагая, что здесь и так все ясно. Делаем по аналогии с предыдущими методами. + к тому же здесь не так уж и много кода.

метод closeConnection();

Метод, при вызове которого закрывается соединение с Базой Данных.

Сначала мы проверяем на истинность, открыто ли соединение.

Если открыто, закрываем его и ставим идентификатору соединение значение false и возвращаем значение метода true.

public function closeConnection()
    {
if($this->db)
        {  
if(@mysql_close())
            {
                $this->db = false;
return true;
            }
else
            {
return false;
            }
        }
    }

Простая демонстрация использования класса

<?php
// из файла config.php к примеру
define('SERVER','localhost');
define('USER','root');
define('PASS','');
define('DBNAME','dbclass');
//
$db = new DBClass(SERVER,USER,PASS,DBNAME);
  $names =  $db->select('*','names');
echo'<pre>';
print_r($names);
echo'</pre>';
  //$db->insert('names', array('NULL','Влад'));
  $db->closeConnection();


?>

Файл dbclass.php целиком

<?php
define('SERVER','localhost');
define('USER','root');
define('PASS','');
define('DBNAME','dbclass');

classDBCLass
  {
private $server,$user,$pass,$dbname,$db;
function __construct($server,$user,$pass,$dbname)
    {
      $this->server = $server;
      $this->user = $user;
      $this->pass = $pass;
      $this->dbname = $dbname;
      $this->openConnection();                 
    }
public function openConnection()  
    {  
if(!$this->db)  
        {  
            $connection = @mysql_connect($this->server,$this->user,$this->pass);  
if($connection)  
            {  
                $selectDB = @mysql_select_db($this->dbname,$connection);  
if($selectDB)  
                {  
                  $this->db = true;
mysql_query('SET NAMES UTF8');
return true;  
                } 
else
                {  
return false;  
                }  
            } else  
            {  
return false;  
            }  
        } else  
        {  
return true;  
        }  
    }
public function select($what,$from,$where = null,$order = null)
    {   $fetched = array();         
        $sql = 'SELECT '.$what.' FROM '.$from;  
if($where != null) $sql .= ' WHERE '.$where;  
if($order != null) $sql .= ' ORDER BY '.$order;  

        $query = mysql_query($sql);  
if($query)  
        {  
            $rows = mysql_num_rows($query);  
for($i = 0; $i < $rows; $i++)  
            {  
                $results = mysql_fetch_assoc($query);  
                $key = array_keys($results);
                    $numKeys = count($key);
for($x = 0; $x < $numKeys; $x++)  
                { 
                    $fetched[$i][$key[$x]] = $results[$key[$x]];                           
                }                                          
            } 
return $fetched; 
        }  
else
        {  
return false;  
        }                   
    }
public function insert($table,$values,$rows = null)  
    {  

            $insert = 'INSERT INTO '.$table;  
if($rows != null)  
            {  
                $insert .= ' ('.$rows.')';  
            }  
            $numValues = count($values);
for($i = 0; $i < $numValues; $i++)  
            {  
if(is_string($values[$i])) $values[$i] = '"'.$values[$i].'"';
            }  
            $values = implode(',',$values);  
            $insert .= ' VALUES ('.$values.')';  
            $ins = mysql_query($insert);
return ($ins) ? true : false;

    }
public function delete($table,$where = null)
    {

            $sql = 'DELETE FROM '.$table.' WHERE '.$where;
if($where == null)
            {
                $sql = 'DELETE '.$table;
            } 
            $deleted = @mysql_query($sql);
return ($deleted)? true : false;
    }

}

  $db = new DBClass(SERVER,USER,PASS,DBNAME);
  $names =  $db->select('*','names');
echo'<pre>';
print_r($names);
echo'</pre>';
  //$db->insert('names', array('NULL','Влад'));
  $db->closeConnection();


?>

Итог

Вот мы и рассмотрели пример создания класса, для работы с базой данных в PHP, с использованием ООП на практике, теперь дело за вами: сидеть и экспериментировать.

Всего доброго. С уважением Паук Владислав.

Автор: Влад Паук

Редакция: Рог Виктор и Андрей Бернацкий. Команда webformyself.

E-mail: contact@webformyself.com

Курс по программированию на языке PHP

Изучите PHP с нуля до результата!

Смотреть курс

Метки:

Комментарии Вконтакте:

Комментарии Facebook:

Комментарии (10)

  1. Дмитрий

    Абсолютно неполезная статья.
    Откуда у людей такой мнение, что если написать «class», «public function», то твой код становится ООП.
    Добавить базовый класс, интерфейс и было бы проще в будущем использовать другие базы данных.
    Ошибки никак не обрабатываются, немного в сторону и повалятся warnig и fatal error. Да и Exception никто не отменял.
    $this->db = true; — здесь лучше бы разместили линк на базу, а вдруг понадобится подключаться к другой?
    Нет даже малейшего экранирования данных, сотни потенциальных ошибок.
    $key = array_keys($results); $numKeys = count($key); for … — а вот это зачем, ненужный действия, которые не используется, только код перегружается. Это можно сделать более красиво и эффективнее.
    Так же для MySQL давно есть расширения mysqli, pdo, mysqlnd, для кого они создаются, непонятно.
    В итоге, если в код внести несколько изменений, было бы лучше, т.к. статья написана для обучения, но не очень хорошим техникам учит.

    Лишь высказал свое мнение :)

  2. Keanor

    То что защиты никакой это минус, а так статья полезная.

  3. Борис

    Полностью согласен с Дмитрием. Автору нужно задуматься о собственном обучении, нежели об обучении других.
    Почему кстати код так ужасно оформлен?
    Не смогли даже с этим справиться на сайте, а уже пишите статьи.

  4. Игорь

    Уважаемый Борис, не могли бы Вы хотя бы на примере данного класса, показать, как нужно правильно и красиво оформлять код? Считаю, что это будет полезно не только для начинающих.

  5. Иван

    Полностью поддерживаю Дмитрия. И зачем так все усложнять с SELECT. я имею в виду формирование массива. Ведь можно просто так:
    $arr = array();
    while($row = mysql_fetch_assoc($query)){
    $arr[] = $row;
    }

  6. Stas

    Нет защиты от SQL-инъекций.

  7. sergei

    Что за бред? Уже давно существует PDO.

  8. bsdlnik

    Полезная статья, но не понимаю, что тут делают умники? Никак за копипастом сюда пришли? Делайте свои статьи и сайты — и там умничайте! Автору респект!

  9. Alex

    Прекрасный пример тога, как не следует писать код..

  10. Макс

    Код устарел, много лишних велосипедов.
    Для начинающего неплохо, но учить этому не стоит.
    Ну и конечно стоит использовать mysqli. Как ни как с 5 версии PHP уже поддерживается.
    Автору и всем кто хочет подтянуть свои знания советую курс Борисова от специалиста.
    ps: «то не реклама. Сам смотрю его. Там 4 уровня. Каждый найдет, что то свое.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree