Привет, Хабр!
Думаю в жизни каждого веб-разработчика наступает момент, когда хочется сделать что-то свое, внести вклад в развитие своей отрасли.
Такой момент настал у меня. Спустя 3,5 года программирования на PHP я решил сделать что-то полезное для других разработчиков.
<?php
$opt = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
];
$pdo = new PDO("mysql:host=localhost;dbname=".DB,User,Pass,$opt);// установили соединение с БД
$pdo->exec("SET CHARSET utf8"); // установили кодировку
$query = $pdo->prepare("INSERT INTO `users` (`name`,`email`) VALUES (:username,:email)"); // сформировали запрос
$arr_to_execute = ['name'=>'username','email'=>'email'];// сформировали данные для экранирования
$insert = $query->execute($arr_to_execute); // выполнили запрос
<?php
$RyF = new RyF();
$RyF->Insert('users')
->values(['name'->'userName','email'->'email'])
->execute();
<?php
define('DB','bd_name');// Название БД
define('User', 'root');// Имя пользователя
define('Pass', '');// Пароль пользователя
<?php
include_once('config.php');
class RyF{
protected $pdo;
function __construct(){
$opt = [// Базовые настройки работы PDO
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // Формат ошибок
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC // Устанавливаем режим возвращения данных в массиве
];
$this->pdo = new PDO("mysql:host=localhost;dbname=".DB,User,Pass,); // Устанавливаем соединение с БД
$this->pdo->exec("SET CHARSET utf8"); // Устанавливаем кодировку
}
}
$RyF->Select('table')
->execute();
class RyF{
protected $pdo;
private $sql_query; // Сам запрос
function __construct(){
$opt = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
];
$this->pdo = new PDO("mysql:host=localhost;dbname=".DB,User,Pass,$opt);
$this->pdo->exec("SET CHARSET utf8");
}
public function Select($table){ // Реализовываем метод для получения данных из БД
$this->sql_query = "SELECT * FROM `$table` "; // Начинаем формировать строку запроса
return $this; // Небольшая фишка
}
public function execute(){ // Метод выполнения запроса
$q = $this->pdo->prepare($this->sql_query); // Подготавливаем запрос для выполнения
$q->execute(); // Выполняем запрос
if($q->errorCode() != PDO::ERR_NONE){ // Обрабатываем случай ошибки
$info = $q->errorInfo();
die($info[2]); // Если при выполнении запроса произошла ошибка, то скажем об этом
}
return $q->fetchall(); // Возвращаем массив данных
}
}
SELECT * FROM `table`
<?php
class RyF{
protected $pdo;
private $sql_query;
private $values_for_exec; // Массив значений для экранирования
function __construct(){
$this->sql_query = "";
$this->values_for_exec = array();
$this->pdo = new PDO("mysql:host=localhost;dbname=".DB,User,Pass,$opt);
$this->pdo->exec("SET CHARSET utf8");
}
...
public function where($where, $op = '='){ // Метод для обработки условия выборки
$vals = array(); // Массив значений, которые будут "подготовленными"
foreach($where as $k => $v){ // Превращаем строку в массив подготовленных значений
$vals[] = "`$k` $op :$k"; // Формируем строку, добавляя операцию
$this->values_for_exec[":".$k] = $v; // Заполняем массив полученными значениями
}
$str = implode(' AND ',$vals);
$this->sql_query .= " WHERE " . $str; // Модифицируем наш запрос
return $this;
}
...
public function execute(){
$q = $this->pdo->prepare($this->sql_query);
$q->execute($this->values_for_exec);
if($q->errorCode() != PDO::ERR_NONE){
$info = $q->errorInfo();
die($info[2]);
}
return $q->fetchall();
}
<?php
$RyF->Select('users')
->where(['name' => '= tester'])
->execute();
...
private function set_default(){
$this->sql_query = ""; // Сбрасываем строку запроса
$this->values_for_exec = array(); // Сбрасываем массив значений для экранирования
}
...
...
public function Insert($table){
$this->sql_query = "INSERT INTO `$table` ";
return $this;
}
...
public function values($arr_val){
$cols = array(); // Создаем отдельный массив для колонок таблицы
$masks = array(); // Создаем отдельный массив для плейсхолдеров на место значений в запросе
foreach($arr_val as $k => $v){ // Применяем те же операции, что и для where
$value_key = explode(' ', $k);
$value_key = $value_key[0];
$cols[] = "`$value_key`"; // Собираем отдельно ключи
$masks[] = ':'.$value_key; // Собираем отдельно плэйсхолдеры для значений
$this->values_for_exec[":$value_key"] = $v; // Заполняем массив для экранирования корректными значениями
}
$cols_all = implode(',',$cols);
$masks_all = implode(',',$masks);
$this->sql_query .= "($cols_all) VALUES ($masks_all)"; // Превращаем полученные данные в корректный запрос
return $this;
}
...
$RyF->Insert('users')
->values(['name'=>'username','email'=>'email'])
->execute();
INSERT INTO `table` (fileds) VALUES (values)"
class RyF{
...
private $type;
public function Insert($table){
$this->sql_query = "INSERT INTO `$table` ";
$this->type = 'insert'; // Добавляем тип запроса
return $this;
}
public function Update($table){
$this->sql_query = "UPDATE `$table` ";
$this->type = 'update'; // Добавляем тип запроса
return $this;
}
public function values($arr_val){
$cols = array();
$masks = array();
$val_for_update = array(); // Отдельный массив для формирования строки обновления записей
foreach($arr_val as $k => $v){
$value_key = explode(' ', $k);
$value_key = $value_key[0];
$cols[] = "`$value_key`";
$masks[] = ':'.$value_key;
$val_for_update[] = "`$value_key`=:$value_key";
$this->values_for_exec[":$value_key"] = $v;
}
if($this->type == "insert"){ // Разделяем формирование строк запроса
$cols_all = implode(',',$cols);
$masks_all = implode(',',$masks);
$this->sql_query .= "($cols_all) VALUES ($masks_all)";
}else if($this->type == 'update'){
$this->sql_query .= "SET ";
$this->sql_query .= implode(',',$val_for_update);
}
return $this;
}
...
private function set_default(){
$this->type = ""; // Сбрасываем type после вы//запроса
...
}
...
}
UPDATE `table` SET `name`=':name',`email`=':email'
...
public function Delete($table){ // Метод для удаления записей из таблицы
$this->sql_query = "DELETE FROM `$table`"; // Формируем запрос
$this->type = 'delete';
return $this;
}
...
...
public function order_by($val, $type){ // Создаем метод для выборки данных, отсортированных определенным образом
$this->sql_query .= "ORDER BY `$val` $type"; // Модифицируем строку запроса
return $this;
}
public function limit($from, $to = NULL){ // Создаем метод для выборки определенного количества записей
$res_str = "";
if($to == NULL){
$res_str = $from;
}else{
$res_str = $from . "," . $to;
}
$this->sql_query .= " LIMIT " . $res_str; // Модифицируем строку запроса
return $this;
}
...
class RyF{
public static $instance; // Переменная для реализации Singleton
...
public static function Instance(){ // Метод для проверки было ли уже создано соединение с БД
if(self::$instance == NULL){
self::$instance = new RyF();
}
return self::$instance;
}
...
}
$RyF = RyF::Instance();
class RyF{
public $pdo;
...
public function get_pdo(){
return $this->pdo;
}
...
}
class RyF{
private $production;
...
function __construct($prodaction = false, $array = array()){ // По умолчанию включаем режим разработчика и даем возможность в ручную указать настройки для работы PDO
$opt = $this->set_option($this->prodaction, $array = array()); // Передаем данные в метод
}
...
private function set_option($prodation, $array){ // Ограничиваем вывод ошибок
$opt = array();
if(!$this->prodaction){
if($array){ // Если разработчик передал свои настройки, то уважаем его мнение
$opt = $array;
}else{
$opt[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$opt[PDO::ATTR_DEFAULT_FETCH_MODE] = PDO::FETCH_ASSOC;
}
}else{
if($array){
$opt = $array;
}else{
$opt[PDO::ATTR_DEFAULT_FETCH_MODE] = PDO::FETCH_ASSOC;
}
}
return $opt;
}
}
К сожалению, не доступен сервер mySQL