Вступление
Сейчас почти все программисты хотят облегчить себе работу. Создаются фреймворки, ORM'ы и т.п. Сегодня я хочу показать вам как можно за 20-30 минут создать свой ORM на подобии RedBeanPHP. Покажу я только Систему CRUD (Create, Read, Update, Delete).
Подготовка
Для начала нам нужен будет всего лишь два файла это Lyricon.php (вы можете назвать свой ORM как-то по другому, но я напишу так) и index.php он будет являться тестом нашего ORM.
Основная часть
Для начала создадим класс. Я написал L (Lyricon) для упрощения.
<?php
class L{
}
Теперь нам нужно создать переменную connection или связь с базой данных.
class L{
static private $connection;
}
Далее создаём функцию, которая будет отвечать за подключение к базе данных. Назовём её setup.
class L{
static private $connection;
public function setup($host,$db,$login,$pass){
self::$connection = mysqli_connect($host,$login,$pass,$db);
}
}
Теперь переменную $connection мы постоянно можем её использовать в функциях. После нужно создать команду Create. Я организую её как в RBPHP с помощью dispense и store. Наша функция должна будет создавать таблицу удобную для пользователя автоматически. Для этого нужно будет поработать со строками. Создадим функцию dispense она будет отвечать за имя таблицы.
public function dispense($table){
$arr = array('table' => $table);
return $arr;
}
Теперь мы можем в данном массиве создавать другие ячейки. Например:
$user = L::dispense('users');
$user['login'] = 'Pegriler';
$user['pass'] = '132231';
Но мы должны же как-то это залить в базу данных. Для этого я сделал переменные $table и $insert. Для того чтобы сделать таблицу удобную для юзера скопируйте этот код:
public function store($variable){
$insert = "INSERT INTO `".$variable['table']."`(";
foreach ($variable as $key => $value) {
if(trim($key) != 'table'){
$insert = $insert.''.$key.',';
}
}
$insert = substr($insert,0,-1);
$insert = $insert.") VALUES(";
foreach ($variable as $key => $value) {
if(trim($key) != 'table'){
if(trim(gettype($value)) == 'string'){
$insert = $insert.'\''.$value.'\',';
}else{
$insert = $insert.''.$value.',';
}
}
}
$insert = substr($insert,0,-1);
$insert = $insert.')';
foreach ($variable as $key => $value) {
if(trim($key) != 'table'){
if(trim(gettype($value)) == 'string'&&strlen($value) < 512){
$variable[$key] = $key.' TEXT(512),
';
}elseif(trim(gettype($value)) == 'string'&&strlen($value) > 512&&strlen($value) <= 1024){
$variable[$key] = $key.' TEXT(1024),
';
}elseif(trim(gettype($value)) == 'string'&&strlen($value) > 1024&&strlen($value) <= 2048){
$variable[$key] = $key.' TEXT(2048),
';
}elseif(trim(gettype($value)) == 'string'&&strlen($value) > 2048&&strlen($value) <= 4096){
$variable[$key] = $key.' TEXT(4096),
';
}elseif(trim(gettype($value)) == 'string'&&strlen($value) > 4096){
$variable[$key] = $key.' TEXT(65535),
';
}
if(gettype($value) == 'integer'){
$variable[$key] = $key.' INT(128),
';
}
if(gettype($value) == 'double'||gettype($value) == 'float'){
$variable[$key] = $key.' FLOAT(53),
';
}
}
};
$table = "
CREATE TABLE ".$variable['table']."(
id INT(20) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
";
foreach ($variable as $key => $value) {
if(trim($key) != 'table'){
$table = $table.''.$value;
}
};
$table = substr($table,0,-3);
$table = $table.'
)';
}
Для начала объясню. $insert это переменная, которая будет отвечать за insert в бд mysql. $table за создание таблицы. Теперь всё это можно закрепить с помощью mysqli_query:
$tab = mysqli_query(self::$connection,$table);
$ins = mysqli_query(self::$connection,$insert);
Для проверки можете написать данный код:
$user = L::dispense('users');
$user['login'] = 'Priler';
$user['pass'] = 'Qwerty123';
L::store($user);
С Read всё просто. Напишем функцию read или find:
public function find($table,$condition){
$result = mysqli_query(self::$connection,"SELECT * FROM `$table` WHERE $condition ");
return mysqli_fetch_assoc($result);
}
mysqli_fetch_assoc нужен для того чтобы переменную отвечающую за чтение можно было хранить как массив и читать ячейки каким-либо условием например id = 1, name = John и т. д.
Окончание
Я показал как примерно создавать такие ORM если хотите можете сделать оставщееся команды CRUD. И вообще дальше создавать данный ORM.