Using classes php mysql

Классы в MySQL

Никто точно не знает почему, но mysql и php в большинстве web-проектов почти всегда используются вместе. Вроде разработчики php включили поддержку и других баз данных, да и mysql можно использовать не только вместе с php. А может просто провайдеры стремясь снизить цену хостинга и привлечь клиентов, включали на серверах поддержку php и mysql и это стало традицией.

Но факт есть факт. Наверно больше половина проектов в интернете сделана на этой связке. Поэтому и возникла необходимость создать инструмент для программистов, с помошью которого можно работать с базой данных просто и эффективно. Вот так и появился класс на php, с помощью которого программирование намного упростилось.

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

Что хочешь, то и получишь!

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

Ну например, если мы хотим узнать количество клиентов занесенных в базу данных>

select count(*) from `customers`;

то ясно, что мы ожидаем число. Класс разбирает запрос к базе данных и на основание запроса, выдает результат.

Но как говориться, лучше один раз увидеть, чем сто раз услышать.

Ну а теперь посмотрим как этот зверь работает.

Откроем новую базу данных и создадим там пару таблиц.

create database `test_mysql_class` ; create table `customers` ( `customer_id` smallint(6) not null auto_increment, `lastname` varchar(255) not null default '', `surname` varchar(255) not null default '', primary key (`customer_id`) ) type=myisam auto_increment=4 ; insert into `customers` values (1, 'pupkin', 'vasya'); insert into `customers` values (2, 'mal4ish', 'ploxish'); insert into `customers` values (3, 'mal4ish', 'kibal4ish'); create table `orders` ( `customer_id` smallint(6) not null default '0', `product_id` smallint(6) not null default '0', key `customer_id` (`customer_id`,`product_id`) ) type=myisam; insert into `orders` values (1, 12); insert into `orders` values (1, 23); insert into `orders` values (1, 34); insert into `orders` values (1, 65); insert into `orders` values (2, 12); insert into `orders` values (3, 33); insert into `orders` values (3, 43); insert into `orders` values (3, 655);

У нас появилось две таблицы, с клиентами и с их заказами.

Попытаемся соединиться с базой данных при помощи класса:

getconnect($host,$only_db,$username,$password))< echo "net contact :-("; exit; >else echo "yes contact! ;-)"; ?>

Если у вас появилась надпись «yes contact! ;-)», значит соединение с базой данных прошло успешно, можно переходить к изучению класса.

Внимание! Все примеры будут будут дописываться в конец первой программы!

И так попробуем узнать, сколько у нас клиентов в базе данных?

Класс проанализировал наш запрос, и понял, что на выход надо послать одно число. Если мы не хотим, что бы отладочная информация печаталась классом, то надо вместо:

$count = $db->query($sql, 1); написать так: $count = $db->query($sql, 0); или просто $count = $db->query($sql); также это работает с min(*) и МАХ(*).

Теперь попробуем узнать какой id номер у нашего клиента, которого зовут pupkin vasya

query($sql, 1); echo $customer_id; ?>

При „разборке“ этого выражения, класс „понял“, что на „гора“ надо выдать только одно число, а именно $customer_id . Почему? Потому, что во-первых мы делаем select только по `customer_id` , a во-вторых и это самое главное, в конце $sql у нас стоит limit 0,1 . Как говориться комментарии излишни.

Ну а теперь попробуем, найти имя и фамилию клиента зная его id.

ну и что мы получим? object

Да, мы получили обьект. Но у этого обьекта есть нужные нам свойства,
а именно `lastname` и `surname` ,а это то, что нам надо!

query($sql, 1); echo $obj->lastname; echo ""; echo $obj->surname; ?>

А теперь мы захотим получить все имена клиентов из базы данных.

И что мы получили на выходе? Массив! array

Но это массив обьектов, нам нужно только их перелистать и получить все имена!

query($sql, 1); if(is_array($array)) foreach ($array as $obj) echo $obj->lastname." ".$obj->surname.""; ?>

pupkin vasya
mal4ish ploxish
mal4ish kibal4ish

Казалось бы всего перечисленного могло бы хватить, но. .

Если нам понадобиться получить все продукты которые заказали клиенты с фамилией mal4ish ? Конечно проблем нет, так как mysql не все вложенные sql запросы поддерживает, то sql запрос будет следующим:

select `orders`.`product_id` as id from ( `orders` left join `customers` on `customers`.`customer_id` = `orders`.`customer_id`)where `customers`.`lastname` = 'mal4ish' query($sql, 1); if(is_array($array)) foreach ($array as $obj) echo $obj->id.""; ?>

Но для некоторых это сложно и непонятно, а иногда такой запрос составить просто невозможно.

Что делать? Надо перевести комманды которые мы хотим выполнить в тот формат, который понимает mysql.

Ну например sql запрос можно было бы написать так:

select `product_id` from `orders` where `customer_id` in(select `customer_id` from `customers` where `lastname` = 'mal4ish')

Только не пробуйте пропустить это через mysql, конечно это не правильно.

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

 "; $array = $db->query($sql, 0); if(is_array($array)) foreach ($array as $obj) echo $obj->product_id.""; ?>

Если включить режим вывода на экран, то увидим, что наш класс меняет запрос который стоит в фигурных скобках, на результат разделенный запятой и снова выполняет запрос, пока не получит последний результат:

---- sql select `product_id` from `orders` where `customer_id` in ---- in sql select `customer_id` from `customers` where `lastname` = 'mal4ish' ---- sql select `product_id` from `orders` where `customer_id` in (2,3) 12 33 43 655

Результат совпадает с ожидаемым!

Заключение

Вкратце все. Класс как класс, пользуйтесь на здоровье! Надо только следить за синтаксисом, и за пробелами, что бы регулярные выражения поняли, что вы хотите.

Источник

PHP OOP Database Class Example

A simple PHP Database Class using PDO as the extension.

In this post I will be showing you how to create a reusable, readable Object-Oriented Programming(OOP) Database connection using PHP Pdo to connect to a MySQL Database.

Quick Explanation

By Default PHP comes with 3 MySQL API

You can read Choosing between MySQL, MySQLi and PDO for a comparison for each.

In this example we will be using the PDO API

Here’s a brief explanation of some PDO codes that we will be using.

  • dsn [Required] — The Data Source Name that contains information required to connect to the database
  • username [Required] — MySQL Username
  • password [Required] — MySQL Password
  • statement [Required] — An SQL statement to execute
    Example:
    $instance->prepare(‘Select * from tableName’);
    Returns a PDOStatement or Throws an error
  • Example:
    $pdoStatement = $instance->prepare(‘Select * from tableName where $pdoStatement->execute([‘id’=>1]); $data = $pdoStatement->fetchAll(); //var_dump($data);
    Returns object or array

Creating the Class:

Preparing our Class name, variables and functions. class DatabaseClass < private $connection = null; // this function is called everytime this class is instantiated public function __construct()< >// Insert a row/s in a Database Table public function Insert( ) < >// Select a row/s in a Database Table public function Select( ) < >// Update a row/s in a Database Table public function Update( ) < >// Remove a row/s in a Database Table public function Remove( ) < >// execute statement private function executeStatement( ) < >> Now that we have a simple design for our Database class. Lets fill the functions with some codes.

Establish the MySQL connection in the costructor // this function is called everytime this class is instantiated public function __construct( $dbhost = «localhost», $dbname = «myDataBaseName», $username = «root», $password = «»)< try< $this->connection = new PDO(«mysql:host=;dbname=;», $username, $password); $this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->connection->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); >catch(Exception $e)< throw new Exception($e->getMessage()); > >
The constructor will have 4 parameters

  • $dbhost — The database host.
  • $dbname — The database name.
  • $username The database User.
  • $password — The database password for the User.

A Function that will execute all statements // execute statement private function executeStatement( $statement = «» , $parameters = [] )< try< $stmt = $this->connection->prepare($statement); $stmt->execute($parameters); return $stmt; >catch(Exception $e)< throw new Exception($e->getMessage()); > > We will be passing our SQL Statements to this function (Insert, Select, Update and Remove).
Returns a PDOStatement object or throws an exception if it get’s an error.

Insert Function // Insert a row/s in a Database Table public function Insert( $statement = «» , $parameters = [] )< try< $this->executeStatement( $statement , $parameters ); return $this->connection->lastInsertId(); >catch(Exception $e)< throw new Exception($e->getMessage()); > > Insert will add a row and will return an integer of the last ID inserted or throws an exception if it get’s an error.

Select Function // Select a row/s in a Database Table public function Select( $statement = «» , $parameters = [] )< try< $stmt = $this->executeStatement( $statement , $parameters ); return $stmt->fetchAll(); >catch(Exception $e)< throw new Exception($e->getMessage()); > > Select will return all row/s or throws an exception if it get’s an error.

Update Function // Update a row/s in a Database Table public function Update( $statement = «» , $parameters = [] )< try< $this->executeStatement( $statement , $parameters ); >catch(Exception $e)< throw new Exception($e->getMessage()); > > Update will update a row/s or throws an exception if it get’s an error.

Remove Function // Remove a row/s in a Database Table public function Remove( $statement = «» , $parameters = [] )< try< $this->executeStatement( $statement , $parameters ); >catch(Exception $e)< throw new Exception($e->getMessage()); > > Remove will remove a row/s or throws an exception if it get’s an error.

Our Database Class example:

class DatabaseClass< private $connection = null; // this function is called everytime this class is instantiated public function __construct( $dbhost = "localhost", $dbname = "myDataBaseName", $username = "root", $password = "")< try< $this->connection = new PDO(«mysql:host=;dbname=;», $username, $password); $this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->connection->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); >catch(Exception $e)< throw new Exception($e->getMessage()); > > // Insert a row/s in a Database Table public function Insert( $statement = «» , $parameters = [] )< try< $this->executeStatement( $statement , $parameters ); return $this->connection->lastInsertId(); >catch(Exception $e)< throw new Exception($e->getMessage()); > > // Select a row/s in a Database Table public function Select( $statement = «» , $parameters = [] )< try< $stmt = $this->executeStatement( $statement , $parameters ); return $stmt->fetchAll(); >catch(Exception $e)< throw new Exception($e->getMessage()); > > // Update a row/s in a Database Table public function Update( $statement = «» , $parameters = [] )< try< $this->executeStatement( $statement , $parameters ); >catch(Exception $e)< throw new Exception($e->getMessage()); > > // Remove a row/s in a Database Table public function Remove( $statement = «» , $parameters = [] )< try< $this->executeStatement( $statement , $parameters ); >catch(Exception $e)< throw new Exception($e->getMessage()); > > // execute statement private function executeStatement( $statement = «» , $parameters = [] )< try< $stmt = $this->connection->prepare($statement); $stmt->execute($parameters); return $stmt; >catch(Exception $e)< throw new Exception($e->getMessage()); > > >

Using the Database Class:

Create/Instantiate the Database Class. $db = new Database( «MySQLHost», «myDatabaseName», «myUserName», «myUserPassword» ); Insert Example $id = $db->Insert(«Insert into `TableName`( `column1` , `column2`) values ( :column1 , :column2 )», [ ‘column1’ => ‘column1 Value’, ‘column2’ => ‘column2 Value’, ]); Select Example $db->Select(«Select * from TableName»); Update Example $db->Update(«Update TableName set `column1` = :column1 where ‘id’ => 1, ‘column1’ => ‘a new column1 value’ ]); Remove Example $db->Remove(«Delete from TableName where ‘id’ => 1 ]);

Tips:

  • Minimize connections to your server.

Take this as an example: for( $x = 1; $x Select(«Select * from TableName where // do something with $data > The above code will create 1000 connections and this could lead to your server to slowing down.

A better way to do this is to create the DatabaseClass object before the looping: $db = new Database( «MySQLHost», «myDatabaseName», «myUserName», «myUserPassword» ); for( $x = 1; $x Select(«Select * from TableName where // do something with $data > The above code will create 1 connection and will use it inside the loop.

I also have created a PHP MySQLi version of this class. You can read how i created it here Creating a MySqli Database Class in PHP

Источник

Читайте также:  Php chmod на папки
Оцените статью