PDA

View Full Version : آموزش: شروع oop با نوشتن کلاس دیتابیس و pdo



IMANAZADI
یک شنبه 15 شهریور 1394, 17:45 عصر
با سلام

من قبلا از کدنویسی توی صفحات استفاده میکردم
اما واسه یه پروژه متوسط خیلی کدها تکراری میشه

الان میخوام برم به سمت oop

الان یه کلاس دیتابیس نوشتم میخوام بدونم مشکلاتش چیه ؟؟؟

البته اینم بگم خیلی از توابع هنوز نوشته نشده
اگر هم تمایل دارید میتونید توابعی که خودتون میدونید رو پست کنید






<?php


class db{


private $pdo;

private $host='localhost';
private $user='root';
private $password='';
private $database='tttt';

public $stmt;
private $err_msg;


public function __construct()
{
$this->open_connection();
}


public function open_connection()
{
try
{
$this->pdo=@new PDO("mysql:host=$this->host;dbname=$this->database;charset=utf8",$this->user,$this->password);

return true;

}

catch(PDOException $e)
{
$this->err_msg="Error : ". $e->getMessage();
return false;
}

}




public function __destruct()
{
$this->close_connection();
}


public function close_connection()
{
if (isset($this->pdo))
{
$this->pdo=null;
unset($this->pdo);
}

}



public function query($sql)
{
try{
$result= $this->pdo->query($sql);

$this->stmt=$result;
}

catch(PDOException $e)
{
$this->err_msg="Error : ".$e->getMessage();
}
}


public function prepare($sql,$param)
{
try
{
$stmt=$this->pdo->prepare($sql);

if($stmt->execute($param))
{
$this->stmt=$stmt;
return true;
}

return false;
}
catch(PDOException $e)
{
$this->err_msg="Error : ". $e->getMessage();
return false;
}
}


public function affectRow()
{
return $this->stmt->rowCount();
}


public function fetch_all()
{
return $this->stmt->fetchAll();
}


public function fetch()
{
return $this->stmt->fetch();
}


public function insert($table, $data)
{
try
{
$fields="`".implode("`, `",array_keys($data))."`";


$fieldsCount= count(array_values($data));

$placeholders='';

for ($i=0;$i<$fieldsCount;$i++)
{
$placeholders.=" ? , ";
}


$placeholders=rtrim($placeholders," ,");


$sql = "INSERT INTO `{$table}` ({$fields}) VALUES ({$placeholders})";

return ($this->prepare($sql,array_values($data)))?true:false;


}
catch(PDOException $e)
{
$this->err_msg="Error : ". $e->getMessage();
return false;
}
}




public function last_insert_id()
{
return $this->pdo->lastInsertId();
}


public function getError()
{
return trim($this->err_msg)!="" ? $this->err_msg : "";
}




}







ساخت نمونه از کلاس و تست اون








$db=new db();


$bb=$db->prepare("select * from MENU where id>=?",array(9));




echo ($bb?"true":"false")."<br>";




echo $db->affectRow()."<br>";


$r=$db->fetch_all();


foreach ($r as $k=>$v)
{
echo $v['label']."-".$v['link']."<br>";
}




$db->query("UPDATE MENU set label='test',link='linetest',sort='4' where id>10");


echo $db->affectRow()."<br>";




$tt=$db->insert('menu',array("label"=>"test1","link"=>"#link1","parent"=>"0","sort"=>""));




echo $db->affectRow()."<br>";


echo $db->last_insert_id()."<br>";




?>

Mohammadsgh
یک شنبه 15 شهریور 1394, 20:18 عصر
برای آغاز خوبه.اگر بتونید متدها رو chain کنید خیلی خوب میشه

hamedarian2009
یک شنبه 15 شهریور 1394, 22:26 عصر
کلاس خوبیه فقط دلیل ایجاد تابع open_connection برای چی بود که فقط هم در سازنده استفاده کردین خب کدهاشو مستقیم داخل سازنده مینوشتین
در ضمن بهتر بود از خواص شی گرایی بهتر استفاده میکردید و کلاس PDO رو extends میکردین

IMANAZADI
دوشنبه 16 شهریور 1394, 07:07 صبح
من قبلا متد کانکشن رو توی سازنده میزاشتم ولی تو اکثر جاها و سایت ها دیدم که متدی جداگانه ای برای اون در نظر میگرفتن و توی سازنده اونو صدا میزدن
دلیلش رو نمیدونم