Создаем класс для работы с базой данных в 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'‘;
//$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'';
//$db->insert('names', array('NULL','Влад'));
$db->closeConnection();

?>

Итог

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


Загрузка комментариев...