جلسه دوم | ساخت یک ساخت یک api Token Generator ساده از صفر تا صد
در این جلسه ما میخواهیم یک کانکشن خیلی ساده به دیتابیس بزنیم و بتونیم مقداری رو آپدیت کنیم و یا رکورد های رو fetch کنیم برای این کار میتونیم ما بیاییم خام کد بزنیم ولی چون این بحث ما روی ساختار mvc هستش خوب کد های ما باید دیزاین پترن خودشو داشته باشه و ساختاری در اون نهفته باشه برای این کار و اتصال به دیتابیس شما میتونید از دو روش استفاده کنید
- استفاده از Hydrahon
- استفاده از کد ساده زیر
در روش اول شما یک پروژه فوق العاده اوپن سورس میبنید که برای ما کوئری سازی میکنه ! من که نظرم اینه که این پکیج نصب کنید ولی شما اگه سیستم کوچیک تری دارید و استفاده پکیج مقدور نیست میتونید خودتون یک پروژه خیلی کوچیک تر از این پکیج بسازید برای مثال من این کلاس رو برای شما ساختم دقیقا کارش شبیه سیستم (هایدرهون) هستش .
class DB {
public $errors = [] ;
private static
$config = [
"host" => "localhost" , //* نام هاست *//
"username" => "root" , //* نام کاربر دیتابیس *//
"password" => "" , //* پسورد کاربر شما *//
"database" => "api" //* نام دیتابیس *//
],
$conn , //* اتصال دیتابیس *//
$table , //* جدولی که میخواهیم در آن تغییرات یا جستجو انجام دهیم *//
$wheres , //* قرار گرفتن شرط ها *//
$select ; //* انتخاب ستون های جدول ما *//
//* اولین اتصال ما به دیتابیس *//
private static function connect()
{
try{
extract(self::$config) ;
$conn = new PDO("mysql:host=$host;dbname=$database" , $username , $password );
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
static::$conn = $conn ;
}catch (Exception $e){
static::$errors[] = $e->getMessage() ;
}
}
//* غیر فعال کردن اتصال و پاک کردن اطلاعات اضافه *//
private static function disconnect(){
static::$conn = null ;
static::$table = null ;
static::$wheres = null ;
static::$select = null ;
}
//* انتخاب جدول دیتابیس و ذخیره اون در پروپرتی استاتیک خودمون *//
/*
* $name = نام جدول
*/
public static function table($name)
{
static::connect() ;
static::$table = $name ;
return new self() ;
}
//* ستون های که میخواهید نمایش دهید *//
/*
* $parameters = آرایه ای از ستون ها میگیرد
*/
public function select( array $parameters ){
static::$select = implode("," , $parameters ) ;
return new self() ;
}
//* شرط گزاری where در دیتابیس *//
/*
* $key
* $operator
* $value
*/
public function where($key , $operator , $value)
{
static::$wheres[] = [
sprintf("`%s`" , $key ) , $operator , (is_string($value) ? sprintf("'%s'" , $value) : $value )
];
return new self() ;
}
//* ساخت دستور select در دیتابیس *//
public function generateSelect()
{
$where = null;
$select = "*" ;
if (!empty(static::$wheres)) {
foreach (static::$wheres as $item) {
$where[] = implode(" ", $item);
}
$where = implode(" AND ", $where);
}
if ( !!static::$select ){
$select = static::$select ;
}
if (!! $where )
{
$where = sprintf(" WHERE %s" , $where ) ;
}
return sprintf("SELECT %s FROM %s %s" , $select , static::$table , $where ) ;
}
//* ساخت دستور آپدیت در دیتابیس *//
public function generateUpdate($parameters)
{
$where = null;
if (!empty(static::$wheres)) {
foreach (static::$wheres as $item) {
$where[] = implode(" ", $item);
}
$where = implode(" AND ", $where);
$where = sprintf(" WHERE %s" , $where ) ;
}
$set = [] ;
foreach ($parameters as $key => $value) {
$set[] = sprintf("`%s` = %s" , $key , is_string($value) ? "'{$value}'" : $value ) ;
}
$set = implode("," , $set ) ;
return sprintf("UPDATE %s SET %s %s" , static::$table , $set , $where ) ;
}
//* دستور آپدیت *//
/*
* array $parametrs
* example : [ "name" => "test" ]
*/
public function update(array $parameters)
{
try {
$conn = ( self::$conn )->prepare( $this->generateUpdate($parameters) ) ;
$result = $conn->execute() ;
static::disconnect() ;
return $result ;
}catch (Exception $exception){
$this->errors[] = $exception->getMessage() ;
}
}
//* انتخاب اولین رکورد *//
public function first()
{
$query = sprintf( "%s LIMIT 1" , $this->generateSelect() );
try{
$conn = ( self::$conn )->query( $query ) ;
$result = $conn->fetchall( PDO::FETCH_ASSOC ) ;
static::disconnect() ;
if ( !empty($result) )
return $result[0] ;
}catch (Exception $exception){
self::$errors[] = $exception->getMessage() ;
}
return null ;
}
//* دریافت رکورد های ما *//
public function get()
{
try{
$conn = ( self::$conn )->query( $this->generateSelect() ) ;
$result = $conn->fetchall( PDO::FETCH_ASSOC ) ;
static::disconnect() ;
return $result ;
}catch (Exception $exception){
self::$errors[] = $exception->getMessage() ;
}
return null ;
}
}
خوب در این کلاس چیز های جدیدی نمیبینم !! چون همه این چیز ها رو تو php raw کار کردید ! ما فقط اومدیم به وسیله ورودی های که میدیم به سیستم یک کوئری برای ما میسازه ولی این ساخت کوئری خیلی محدودیت داره و مثل پکیج Hydrahon قوی نیست ولی کارمون رو تو سیستم api راه میندازه چون ما در این سیستم همونطور ک گفته شد به دو حالت احتیاج داریم یکی جستجو در دیتابیس و دیگری update
خوب طریقه استفاده کد بالا خیلی راحت به نظر میرسه برای اینکه از کد بالا استفاده کنیم ما باید اول localhost , user , pass , database خودمونو تو پروپرتی های استاتیک که تعریف کردیم مقدار دهی کنیم بعد از مقدار دهی برای اینکه مثلا اطلاعات جدول users رو بگیریم مینویسیم :
DB::table("users")->get()
به همین راحتی تمام اطلاعات کاربران رو میگیریم 😊 ولی خوب ما فقط همین رو نمیخواییم مثلا ما افرادی رو میخواییم که فیلد name اونها برابر با aminGhaninia باشه خوب برای اینکار ما
DB::table("users")->where("name" , "=" , "aminGhaninia")->get()
همونطور که میبینید طریقه استفاده خیلی راحته و یه چیز شبیه DB query builder لاراول هست syntx ش
و همچنین زمانی که میخواییم آپدیت کنیم جدولی رو میتونیم اینطوری استفاده کنیم :
DB::table("users")->where("name" , "=" , "aminGhaninia")->update([
"name" => "amin"
])
به همین سادگی به همین خوشمزگی !!!! خوب ولی ما تو این کلاسی که نوشتیم محدودیت های داریم جز این دوتا عمل کار دیگه ای نمیتونیم انجام بدیم ولی خوبه دستتون بیاد چکار کردیم و میتونید این کلاس رو بزرگ تر کنید یا اگه تنبل هستید بیاید از پکیج استفاده کنید خوب این جلسه هم در مورد طراحی مدل ها آشنا شدید ولی در جلسه بعدی من میخوام از این دو کلاسی که نوشتم استفاده کنم باید چکار کنم ؟! خوب بقیه مبحث رو در جلسه بعد آموزش میدم