PDA

View Full Version : سوال: کلاس pdo برای کار با دیتابیس



redhat2
جمعه 29 شهریور 1392, 13:18 عصر
سلام ، یه کلاس برای کار با pdo نوشتم که استفاده ازش خیلی سادس اینم از کداش :




require_once 'Ex.php';

error_reporting(E_USER_NOTICE);

class Db extends Ex {

private $connect;
private $where;
private $table;

public function __construct($dbhost, $dbname, $dbusername, $dbpass) {

try {
$this->connect = new PDO("mysql:dbhost=" . $dbhost . ";dbname=" . $dbname, $dbusername, $dbpass);
} catch (Ex $exc) {
echo $exc->getMessage();
}
}

public function where($where = array()) {

if (!is_array($where)) {
throw new Ex("the where must be array . try again !");
} else {
foreach ($where as $key => $value) {
$this->where[$key] = $value;
}
}
return $this;
}

public function select($select = null) {
if (is_null($select)) {
$set = "*";
} else {
if (!is_array($select)) {
throw new Ex("the select nust be array . try again !");
} else {

foreach ($select as $value) {
$set .= $value . ",";
}
}
}
$set = trim($set, ",");
if (count($this->where) > 0) {
$sql = "SELECT " . $set . " FROM " . $this->table . " WHERE ";
$where = $this->configurewhere();
} else {
$sql = "SELECT " . $set . " FROM " . $this->table;
}
$sql .= trim($where, " AND ");
$prepare = $this->connect->prepare($sql);
$prepare->execute($this->where);
// echo $sql;
return $prepare->fetch(PDO::FETCH_ASSOC);
}

public function update($update = array()) {
if (!is_array($update)) {
throw new Ex("the update must be array");
} else {
foreach ($update as $key => $value) {
$set .= $key . " = :" . $key . ",";
}
$set = trim($set, ",");
$sql = "UPDATE " . $this->table . " SET " . $set . " WHERE ";
$where = $this->configurewhere();
$sql .= trim($where, " AND ");
$prepare = $this->connect->prepare($sql);
$this->where = array_merge($this->where, $update);
// echo $sql;
return $prepare->execute($this->where);
}
}

private function configurewhere() {
if (count($this->where) > 1) {
foreach ($this->where as $key => $value) {
$where .= $key . " = :" . $key . " AND ";
return $where;
}
} else {
$where = array_keys($this->where)[0] . " = :" . array_keys($this->where)[0];
return $where;
}
}

public function table($table) {
if (is_string($table)) {
$this->table = $table;
}
}

public function insert($insert = array()) {
if (!is_array($insert)) {
throw new Ex("the insert must be array . try again !");
} else {
foreach ($insert as $key => $value) {
$values .= ":" . $key . ",";
$data .= $key . ",";
}
$values = trim($values, ",");
$data = trim($data, ",");
$sql = "INSERT INTO " . $this->table . " (" . $data . ")" . " VALUES (" . $values . ")";
// echo $sql;
$this->connect->prepare($sql)->execute($insert);
}
}

public function delete() {
$where = $this->configurewhere($this->where);
$sql = "DELETE FROM " . $this->table . " WHERE " . $where;
// echo $sql;
$this->connect->prepare($sql)->execute($this->where);
}

}


نحوه ای استفاده از کلاس برای Select :



$db = new Db("localhost", "rcms", "root", "");
$db->table("users");
$db->where(array("username" => "reza"))->select(array("email"));


نحوه ی استفاده از insert :



$db->where(array("username" => "reza"))->insert(array("username" => "saeed"));


نحوه ی استفاده از update :


$db->where(array("username" => "reza"))->update(array("email" => "mohammad"));


نحوه ی استفاده از delete :



$db->where(array("username" => "reza"))->delete();


این کلاس 4 عمل اصلی یعنی Select ، update ، insert ، delete را انجام میده اگه سوالی در مورد نحوه ی کار با کلاس براتون پیش اومد بپرسین ، لطفا نظرتون را در مورد کلاس هم بگید ممنون .

masiha68
جمعه 29 شهریور 1392, 17:54 عصر
خسته نباشی
خوبه که کدهات رو به اشتراک می زاری

redhat2
شنبه 30 شهریور 1392, 20:17 عصر
2 تا function جدید هم نوشتنم که اضافه کردنش به کلاس با خودتون :



public function orderby($column, $sort) {
if (!is_string($column) && !is_numeric($sort)) {
throw new Ex("the column or sort parameter is incorrect . try again !");
} else {
$this->column = $column;
if (preg_match("/^[0-1]$/", $sort)) {
if ($sort == 1) {
$this->sort = "ASC";
} else {
$this->sort = "DESC";
}
} else {
throw new Ex("the sort is should be one or zero ");
}
}
return $this;
}

------------

public function limit($number, $lentgh = null) {
if (!is_numeric($number)) {
throw new Ex("the number parameter is should be number . try again !");
} else {
if (!is_null($lentgh)) {
if (!is_numeric($lentgh)) {
throw new Ex("the lentgh parameter is should be number . try again !");
} else {
$this->limit = " LIMIT " . $number . "," . $lentgh;
}
} else {
$this->limit = " LIMIT " . $number;
}
}
return $this;
}


function سلکت هم به این صورت تغییر پیدا می کنه :



public function select($select = null) {
if (is_null($select)) {
$set = "*";
} else {
if (!is_array($select)) {
throw new Ex("the select nust be array . try again !");
} else {

foreach ($select as $value) {
$set .= $value . ",";
}
}
}
$set = trim($set, ",");
if (count($this->where) > 0) {
$sql = "SELECT " . $set . " FROM " . $this->table . " WHERE ";
$where = $this->configurewhere();
} else {
$sql = "SELECT " . $set . " FROM " . $this->table;
}
$sql .= trim($where, " AND ");
if (!empty($this->column)) {
$sql .= " ORDER BY " . $this->column;
}
if (!empty($this->column)) {
$sql .= " " . $this->sort;
}
if (!empty($this->limit)) {
$sql .= $this->limit;
}
$prepare = $this->connect->prepare($sql);
$prepare->execute($this->where);
// echo $sql;
if (!empty($this->limit)) {
if (strstr($this->limit, ",")) {
return $prepare->fetchAll(PDO::FETCH_ASSOC);
}
}
return $prepare->fetch(PDO::FETCH_ASSOC);
}


2 متغیر هم به اول کلاس اضافه کنین :



private $sort;
private $limit;


نحوه کار هم به این صورت هست :



$db->orderby("date", 1)->limit(1, 2)->select();


توی این مثال می گیم که دستور orderby بر اساس ستون date باشه ، پارامتر دوم هم یا میتونه 1 یا 0 باشه که به ترتیب به معنی asc و desc هستش ، limit هم اگه فقط پارامتر اول باشه ، یعنی این تعداد را برای ما بر گردونه ، اگه پارامتر دوم هم باشه یعنی از 1 row شروع کن و 2 تای بعدی را بگیر . به همین راحتی . سوالی بود درخدمتم .

redhat2
جمعه 10 آبان 1392, 09:28 صبح
سلام یه مشکلی توی کدهام پیدا کردم و اینه که زمانی که ما از تابع where ، دو بار استفاده می کنیم ، مثلا یکبار برای Select و یکبار برای update ، این تابع ، ترکیبی از هر دو دستور میشه ، یعنی قسمت where نهایی از where های مربوط به select و update تشکیل شده ، و در نتیجه این مشکل سازه ، چون اگه مثلا اولین Where را برای select به کار برده باشیم ، زمانی که بخواییم update کنیم ، where سلکت به where مربوط به update اضافه میشه و کوئری مورد نظر اشتباه در میاد ، برای رفع این مشکل هم میام و کد زیر را در اول تابع where اضافه می کنیم :


$this->where = null

navid3d_69
جمعه 10 آبان 1392, 10:13 صبح
کد خوبی هست ولی من متوجه نشدم چرا برای insert باید where باشه؟

MRmoon
جمعه 10 آبان 1392, 10:42 صبح
اصلا HAVING و JOIN و اينا رو در نظر نگرفتي برا select

Veteran
جمعه 10 آبان 1392, 12:12 عصر
اصلا HAVING و JOIN و اينا رو در نظر نگرفتي برا select
به نظرم این یک کلاس هست که برای خودشون نوشتن و طبق نیاز های خودشون پیاده سازی کردن

Veteran
جمعه 10 آبان 1392, 12:13 عصر
کد خوبی هست ولی من متوجه نشدم چرا برای insert باید where باشه؟
این سوال هم برای من پیش اومده

redhat2
شنبه 11 آبان 1392, 10:03 صبح
کد خوبی هست ولی من متوجه نشدم چرا برای insert باید where باشه؟
درسته ، این تیکه رو اشتباه نوشتم ، ببخشید . :خجالت:

redhat2
شنبه 11 آبان 1392, 10:06 صبح
اصلا HAVING و JOIN و اينا رو در نظر نگرفتي برا select
این کلاس فقط 4 عمل اصلی را انجام ، به مرور ویژگی هایی دیگه هم بهش اضافه می کنم .

H:Shojaei
شنبه 11 آبان 1392, 12:20 عصر
سلام و خسته نباشيد
كلاس خوبيه البته به قول خودتون هنوز تكميل نيست :تشویق:
ولي يه پيشنهاد صليقه اي اين كه بهتر نيست به جاي اين كه يه تابع مجزا كه تو كلاس هست به نام $where رو توي همون توابع خود كلاس فراخواني كنيد چون سرعتتون موقع كد زدن به نظر من بالاتر ميره.
مثلا تو پارامتر هاي تابع update يه $where هم اضافه كنيد و اگر مقدار نداشتيد خالي بذارين... اگرم داشت كه تو همون خود تابع update صداش ميزنيد تا تفكيك انجام بشه :)
البته اينو واسه limit, order by, group by هم ميشه همين كارو كرد...
مثلا اگر واسه همونا هم همين كاري كه الان كرديد رو انجام بدين و همشون يه جا تو يه كوئري لازم باشن 4 بار بايد يكي يكي اونا رو صدا بزنيد

redhat2
شنبه 11 آبان 1392, 19:10 عصر
اگه درست فهمیده باشم شما میگین که مثلا برای 2 تا دستور متفاوت مثل Select و یا update از یک where استفاده کنیم ، هر وقت هم که بخوایم where جدیدی بنویسیم خوب Where جدیدی می نویسیم . درسته ؟

redhat2
شنبه 11 آبان 1392, 19:37 عصر
سلام و خسته نباشيد
كلاس خوبيه البته به قول خودتون هنوز تكميل نيست :تشویق:
ولي يه پيشنهاد صليقه اي اين كه بهتر نيست به جاي اين كه يه تابع مجزا كه تو كلاس هست به نام $where رو توي همون توابع خود كلاس فراخواني كنيد چون سرعتتون موقع كد زدن به نظر من بالاتر ميره.
مثلا تو پارامتر هاي تابع update يه $where هم اضافه كنيد و اگر مقدار نداشتيد خالي بذارين... اگرم داشت كه تو همون خود تابع update صداش ميزنيد تا تفكيك انجام بشه :)
البته اينو واسه limit, order by, group by هم ميشه همين كارو كرد...
مثلا اگر واسه همونا هم همين كاري كه الان كرديد رو انجام بدين و همشون يه جا تو يه كوئري لازم باشن 4 بار بايد يكي يكي اونا رو صدا بزنيد

اگه میشه با مثال توضیح بدین ، درست متوجه نشدم . :لبخند: ممنون .

Veteran
شنبه 11 آبان 1392, 19:51 عصر
ایشون میگن توی کلاس متدی به اسم where نداشته باشیم و اونرو به عنوان یک پارامتر برای دیگر توبع قرار بدین نه یک متد از کلاس
مثلا اینو

$db->where(array("username" => "reza"))->update(array("email" => "mohammad"));
به این شکل بنویسیم


$db->update(array("email" => "mohammad"),array("username" => "reza"));

redhat2
شنبه 11 آبان 1392, 20:14 عصر
ایشون میگن توی کلاس متدی به اسم where نداشته باشیم و اونرو به عنوان یک پارامتر برای دیگر توبع قرار بدین نه یک متد از کلاس
مثلا اینو

$db->where(array("username" => "reza"))->update(array("email" => "mohammad"));
به این شکل بنویسیم


$db->update(array("email" => "mohammad"),array("username" => "reza"));

خوب این مزیتش چیه ؟

H:Shojaei
یک شنبه 12 آبان 1392, 11:52 صبح
ممنون سبحان جان

خوب این مزیتش چیه ؟
من كه گفتم كاملا صليغه ايه و هيچ مزيت خاصي ايجاد نميكنه چون اينطوري به نظر من راحت تره كمتر گيج مشه كسي كه بخواد از كد استفاده كنه...
تازه اين كه حتما مقادير تو آرايه باشن هم به نظر من وقت گيره مثلا مقادير رو با يه كاراكتر خاص از هم جداشون كنيد تو كلاس تفكيك بشن به نظر من بهتره :لبخند:
مثلا:
به نظر شما

$db->mysql_select($select,$table,$where,$orderby,$group by)
راحت تره يا:

$db->table($table)->where($where)->orderby('','')->groupby('')->select()
البته بازم ميگم اين صليغه ايه و هرطور خودتون راحت ترين همون بهترينه. :لبخندساده:

H:Shojaei
یک شنبه 12 آبان 1392, 11:56 صبح
راستي شما كه لطف كرديد نوشتيدش يه لطف ديگه هم بكنيد اين كه امنيتش رو هم بهش اضافه كنيد اينجا دوستان جمعشون جمعه به چيزاي خوبي ميتونيم برسيم :لبخند:
با تشكر :لبخندساده:

redhat2
یک شنبه 12 آبان 1392, 15:15 عصر
راستي شما كه لطف كرديد نوشتيدش يه لطف ديگه هم بكنيد اين كه امنيتش رو هم بهش اضافه كنيد اينجا دوستان جمعشون جمعه به چيزاي خوبي ميتونيم برسيم :لبخند:
با تشكر :لبخندساده:
خوب برای شروع ، برا امنیتش چه پیشنهادی می دین ؟ بسم الله . :لبخند:

H:Shojaei
یک شنبه 12 آبان 1392, 16:43 عصر
خب به نظر من اولين كاري كه بايد كرد escape كردن داده هاي وروديه ديگه ميتونيم با همين شروع كنيم...

navid3d_69
یک شنبه 12 آبان 1392, 16:52 عصر
برای امنیت از prepare استفاده شده زیاد مشکلی رو ایجاد نمی کنه و به نظر من بهتر هست اطلاعات قبل از داد شدن به کلاس دیتابیس پاک سازی بشن

masiha68
دوشنبه 13 آبان 1392, 07:00 صبح
فک می کنین چقد طول بکشه تا کلاس کاملش اماده بشه !!!!

redhat2
دوشنبه 13 آبان 1392, 08:51 صبح
فک می کنین چقد طول بکشه تا کلاس کاملش اماده بشه !!!!
خوب اگه دوستان همکاری کنند میتونیم سریع تر کلاسو کامل کنیم ، والا من خودم توی ایام امتحانات دانشگاهم زیاد وقت نمیکنم به این کارا برسم .

masiha68
دوشنبه 13 آبان 1392, 09:54 صبح
من دارم واسه ارشد می خونم و تا دو سه ماه دیگه هم بیاد برم سربازی ... خیلی عجله دارم :)
همکاری دوستان !!! بگین چیا لازم داره ... شما که استارت رو زدید ... پس تمومش کنید . خیلی سرچ کردم و کلاسی واسه کار با pdo پیدا نکردم

masiha68
دوشنبه 13 آبان 1392, 11:26 صبح
یه نگاهی به این بنداز ببین کمکت می کنه :)
زیر خاکیه و به سختی پیداش کردم :d
https://github.com/pesarkhobeee/easybusy-toolkit/

redhat2
دوشنبه 13 آبان 1392, 11:40 صبح
خوب تمومی ویژگی های که این کلاس باید داشته باشه ، را بگین تا ببینم میشه ، بهش اضافه کرد یا نه ؟ کلا ویژگی های مد نظر ما چیه ؟

masiha68
دوشنبه 13 آبان 1392, 11:54 صبح
بذارین یه طرح کلی بریزم :
4 تا عمل اصلی داریم
delet : حذف یک داده ... که دوتا یارامتر می خواد یکی ای داده و یکی هم جدول داده ( االبته واسه کسایی که حذف یک مرحله ای دارن و مثلا واسه مطالب حذف شده سطل زباله نمی زارن :) )
update : ای دی داده برای where مقدار فیلد های اپدیتی و مقدار اون ها که توی دوتا پارامتر به صورت ارایه ای وارد میشن و باید قبل از اپدیت بررسی بشه بینیم که این دوتا از نظر تعداد برابرن !!!
insert : که مثل اپدیت می مونه با این تفاوت که ای دی نمی خواد ( اگه به صورت خود افزاریش تعیین کرده باشیم در مورد mysql اینجوریه و از بقیه ی دیتابیس ها خبر ندارم )
و اما مهتر از همه select :
یک پارامتر برای ای دی . یکی برای انتخاب جدول . یکی برای فیلد های انتخابی . یکی برای where . یکی برای desc نحوه ی چیدمان . یکی برای limit . -> توی سطح عادی اینا کافیه ولی می شه گروه و بقیه رو بهش اضافه کرد
این طرح کلیه
ویژگی اصلی در مورد انعطاف select هاست که بتونه همه نوع select رو پشتبانی کنه ... خودتون یه حساب سر انگشتی انجام بدین ببینین چند نوع select لازم میشه

redhat2
دوشنبه 13 آبان 1392, 13:03 عصر
خوب الان که 4 عمل اصلی را انجام میده ، منظوره من این بود که اعمال پیشرفته تری که مد نظرتون هست را بگید تا من اعمال کنم .

2undercover
دوشنبه 13 آبان 1392, 14:44 عصر
اتفاقا مشابه این کلاس زیاده (فک می کنم دلیل این که شما چیزی پیدا نکردید این بوده که دنبال کلاس بودید برای کار با PDO اما اسم اصلی اینجور کلاس ها Query Builder هست).

نمونش: Query Builder استفاده شده در Laravel (http://four.laravel.com/docs/queries)

redhat2
دوشنبه 13 آبان 1392, 16:59 عصر
من خودم یه چیزه خیلی خوب پیدا کردم ، توی این آدرس میتونید دان کنین : http://fluentpdo.com/index.html با documention کامل توضیح داده .

redhat2
سه شنبه 14 آبان 1392, 18:23 عصر
سلام ، یه سوال داشتم ، having و group by را زمانی که به کار می بریم ، حتما باید sql ما یکی از توابع مثل Count یا Sum یا توابع دیگه را داشته باشه یعنی به این صورت باشه :

SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
یا میشه در یک select ساده هم ازشون استفاده کرد ؟ join به چه شکل هستش حتما باید به شکل زیر باشه ، یعنی نمیشه having و group by را درشون به کار برد ؟


SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2
ON table_name1.column_name=table_name2.column_name


کلا group by و having را چه زمانی به کار می برند ، میشه هز زمانی به کار برد ؟

redhat2
چهارشنبه 15 آبان 1392, 07:10 صبح
کسی نبود ؟

redhat2
چهارشنبه 15 آبان 1392, 12:28 عصر
اینم از سری جدید کلاس که join ، gruop by ، aggregate function و having بهش اضافه شده :


<?php

require_once 'Ex.php';

error_reporting(E_USER_NOTICE);

class Db extends Ex {

private $db;
private $sort;
private $column;
private $limit;
private $groupby;
private $where;
private $table;
private $having;

public function __construct($dbhost, $dbname, $dbusername, $dbpass) {

try {
$this->db = new PDO("mysql:dbhost=" . $dbhost . ";dbname=" . $dbname, $dbusername, $dbpass, array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'",
));
} catch (Ex $exc) {
echo $exc->getMessage();
}
}

public function settable($table) {
if (is_string($table)) {
$this->table = $table;
}
}

public function where($where = array()) {

if (!is_array($where)) {
throw new Ex("the where must be array . try again !");
} else {
foreach ($where as $key => $value) {
$this->where[$key] = $value;
}
}
return $this;
}

public function orderby($column, $sort) {
if (!is_string($column) && !is_numeric($sort)) {
throw new Ex("the column or sort parameter is incorrect . try again !");
} else {
$this->column = $column;
if (preg_match("/^[0-1]$/", $sort)) {
if ($sort == 1) {
$this->sort = "ASC";
} else {
$this->sort = "DESC";
}
} else {
throw new Ex("the sort is should be one or zero ");
}
}
return $this;
}

public function limit($number, $lentgh = null) {
if (!is_numeric($number)) {
throw new Ex("the number parameter is should be number . try again !");
} else {
if (!is_null($lentgh)) {
if (!is_numeric($lentgh)) {
throw new Ex("the lentgh parameter is should be number . try again !");
} else {
$this->limit = " LIMIT " . $number . "," . $lentgh;
}
} else {
$this->limit = " LIMIT " . $number;
}
}
return $this;
}

private function modifyselect($select) {
if ($select == "*") {
$modifyselect = "*";
} else {
if (!is_array($select)) {
throw new Ex("the select nust be array . try again !");
} else {

foreach ($select as $value) {
$this->modifyselect .= $value . ",";
}
}
}
$modifyselect = trim($this->modifyselect, ",");
return $modifyselect;
}

private function modifywhere() {
if (count($this->where) > 1) {
foreach ($this->where as $key => $value) {
$modifywhere .= $key . " = :" . $key . " AND ";
}
} else {
$modifywhere = array_keys($this->where)[0] . " = :" . array_keys($this->where)[0];
}
return trim($modifywhere, " AND ");
}

private function modifyupdate($update) {
if (!is_array($update)) {
throw new Ex("the update must be array");
} else {
foreach ($update as $key => $value) {
$modifyupdate .= $key . " = :" . $key . ",";
}

return trim($modifyupdate, ",");
}
}

private function join($params = array()) {
if (!is_array($params)) {
throw new Ex("the params must be array . try again !");
} else {
if (is_null($params[0])) {
$params[0] = $this->table;
}
return $params[0] . " " . strtoupper($params[2]) . " JOIN " . $params[1] . " ON " . $params[0] . "." . $params[3] . " = " . $params[1] . "." . $params[4];
}
}

public function select($select = null, $join = null) {
$select = $this->modifyselect($select);
$sql = "SELECT " . $select . " FROM ";
if (!is_null($join)) {
if (!is_array($join)) {
throw new Ex("the join must be array . try again !");
} else {
$join = $this->join($join);
$sql .= $join;
//echo $sql;
}
} else {
$sql .= $this->table;
if (count($this->where) > 0) {
$where = $this->modifywhere();
$sql .= " WHERE " . $where;
}
if (!empty($this->column)) {
$sql .= " ORDER BY " . $this->column;
}
if (!empty($this->sort)) {
$sql .= " " . $this->sort;
}
if (!empty($this->limit)) {
$sql .= $this->limit;
}
// echo $sql;
$prepare = $this->db->prepare($sql);
$prepare->execute($this->where);
if (!empty($this->limit)) {
if (strstr($this->limit, ",")) {
return $prepare->fetchAll(PDO::FETCH_ASSOC);
}
}
return $prepare->fetch(PDO::FETCH_ASSOC);
}
}

public function insert($insert = array()) {
if (!is_array($insert)) {
throw new Ex("the insert must be array . try again !");
} else {
foreach ($insert as $key => $value) {
$values .= ":" . $key . ",";
$data .= $key . ",";
}
$values = trim($values, ",");
$data = trim($data, ",");
$sql = "INSERT INTO " . $this->table . " (" . $data . ")" . " VALUES (" . $values . ")";
//echo $sql;
$this->db->prepare($sql)->execute($insert);
}
}

public function delete() {
$where = $this->configurewhere($this->where);
$sql = "DELETE FROM " . $this->table . " WHERE " . $where;
// echo $sql;
$this->db->prepare($sql)->execute($this->where);
}

public function update($update = array()) {
$modifyupdate = $this->modifyupdate($update);
$sql = "UPDATE " . $this->table . " SET " . $modifyupdate . " WHERE ";
$where = $this->modifywhere();
$sql .= $where;
$prepare = $this->db->prepare($sql);
$this->where = array_merge($this->where, $update);
//echo $sql;
return $prepare->execute($this->where);
}

public function groupby($groupby) {
if (!is_string($groupby)) {
throw new Ex("the insert must be string . try again !");
} else {
$this->groupby = " GROUP BY " . $groupby;
}
}

public function select_aggregate($aggregate, $column, $select, $having = null) {
$select = $this->modifyselect($select);
if (!is_string($aggregate) || !is_string($column)) {
throw new Ex("the aggregate and column must be string . try again !");
}
$sql = "SELECT " . $select . ", " . $aggregate . "(" . $column . ")" .
" FROM " . $this->table;
if (count($this->where) > 0) {
$where = $this->modifywhere();
$sql .= " WHERE " . $where;
}
if (!is_null($this->groupby)) {
$sql .= $this->groupby;
}
if (!is_null($having)) {
if (!is_array($having)) {
throw new Ex("the aggregate and column must be string . try again !");
} else {
$this->having($having);
$sql .= $this->having;
}
}
if (!empty($this->column)) {
$sql .= " ORDER BY " . $this->column;
}
if (!empty($this->sort)) {
$sql .= " " . $this->sort;
}
if (!empty($this->limit)) {
$sql .= $this->limit;
}
// echo $sql;
$prepare = $this->db->prepare($sql);
$prepare->execute($this->where);
if (!empty($this->limit)) {
if (strstr($this->limit, ",")) {
return $prepare->fetchAll(PDO::FETCH_ASSOC);
}
}
return $prepare->fetch(PDO::FETCH_ASSOC);
}

private function having($having) {
$this->having = " HAVING " . $having[0] . " ( " . $having[1] . " ) " . $having[2] . " " . $having[3];
}

}