ظƒظ„ط§ط³ط§طھ ط§ظ„php : ط§ظ„ط¯ط±ط³ ط§ظ„ط«ط§ظ„ط«: ط§ظ„ط§ط³طھط؛ظ„ط§ظ„ ط§ظ„ط¹ظ…ظ„ظ‰ ظ„ظƒظ„ط§ط³ ظ‚ظˆط§ط¹ط¯ ط§ظ„ط¨ظٹط§ظ†ط§طھ









نستكمل معكم اخوانى سلسلة دروس كلاسات php, وان شاء الله سوف نبدأ الاستغلال الحقيقى للكلاسات
بدءا من هذا الدرس مفصل.

بالنسبة لاستغلال الكلاسات , سوف تكون دروس هذه الجزئيه مقسمه لجزئين:


1-ثلاثة دروس تطبيقات عملية لكيفية استغلال الكلاسات الجاهزه
2-ثلاثة دروس تطبيقات عملية لكيفية كتابة كلاسات بسيطه من ابداعك باستخدام التفكير الذاتى oop

وبدأ من هذا الدرس مفصل سوف نبدأ باول درس مفصل لاستغلال الكلاسات الجاهزة , حتى نتعود على أشكال كتابة
كود code الكلاسات كاملا, بحيث تكون دربت نفسك عليها, وأخذت فكرة بسيطة عن طريقة كتابتها قبل الخوض
فى الثلاث دروس الأخرى الخاصة بكتابة الكلاسات المكتوبه بيدك أنت .............


نبدأ على بركة الله ................



استغلال كلاس قواعد البيانات





قبل أن أبدأ الشرح طريقة حمل الملفات الاتيه من هــــــنـــــــا

وتشمل 3 ملفات :

1- Mysql.class.php : وهو ملف كلاس الاتصال + التأمين بقاعدة البيانات
2-QueryResult.class.php: وهو خاص بجلب البيانات من القاعدة بطرق مختلفة (جدول-xml ...الخ)
3-usage.php : وهو خاص باستغلال هاتان الكلاسان (واللى راح نكتبه بأنفسنا ونتدرب عليه )

اولا:Mysql.class.php

الكود code:

رمز Code:
<?php /** * Mysql.class.php * @author Charles Reace (www.charles-reace.com) * @version 1.0 * @license http://opensource.org/licenses/gpl-license.php GNU Public License */ /** * class used for db query results */ require_once 'QueryResult.class.php'; /** * &quot;Singleton&quot; pattern MySQL database class * @package Database */ class Mysql { // USER MODIFIABLE DATABASE SETTINGS // private $dbHost = 'localhost'; private $dbUser = 'root'; private $dbPwd = 'root'; private $database = 'class'; private $connx = NULL; private $error = ''; // DO NOT MODIFY BELOW THIS LINE // private static $instance; /** * Private constructor: prevents direct creation of object */ private function __construct() { $this->connect(); } /** * Singleton method (only allow one instance of this class) * @return object */ public static function singleton() { if (!isset(self::$instance)) { $c = __CLASS__; self::$instance = new $c; } return self::$instance; } // end singleton() /** * Prevent users from cloning this instance * @return void */ public function __clone() { trigger_error('Clone is not allowed.', E_USER_ERROR); } /** * Connect to MySQL and select database * @return boolean */ private function connect() { $connx = @mysql_connect($this->dbHost, $this->dbUser, $this->dbPwd); if($connx != FALSE) { $this->connx = $connx; $db = mysql_select_db($this->database, $this->connx); if($db == FALSE) { $this->error = &quot;Unable to select DB: &quot; . mysql_error(); user_error($this->error, E_USER_WARNING); return(FALSE); } return(TRUE); } $this->error = &quot;Unable to connect to DBMS: &quot; . mysql_error(); user_error($this->error, E_USER_WARNING); return(FALSE); } // end connect() /** * Get database connection resource ID * @return resource */ public function getConnection() { return($this->connx); } /** * Sanitize input for use in SQL * @param string|integer|float $input * @return string|integer|float */ public function sanitize($input) { $input = trim($input); if(!is_numeric($input)) { if(get_magic_quotes_gpc()) { $input = stripslashes($input); } $input = &quot;'&quot; . mysql_real_escape_string($input) . &quot;'&quot;; } return($input); } /** * Execute SELECT query (or any query that returns result rows) * @param string $sql * @return object */ public function select($sql) { if(!$this->connx) { $this->error = &quot;Cannot process query, no DB connection.&quot;; user_error($this->error, E_USER_WARNING); return(FALSE); } $result = mysql_query($sql, $this->connx); if($result) { if(mysql_num_rows($result)) { return(new QueryResult($result, $this->connx)); } else { return(0); } } else { $this->error = &quot;Query failed ($sql): &quot; . mysql_error(); user_error($this->error, E_USER_WARNING); return(FALSE); } } /** * Execute query that does not return result rows (e.g.: INSERT) * @param string $sql * @return integer */ public function modify($sql) { if(!$this->connx) { $this->error = &quot;Cannot process query, no DB connection.&quot;; user_error($this->error, E_USER_WARNING); return(FALSE); } $result = mysql_query($sql, $this->connx); if($result) { return(mysql_affected_rows($this->connx)); } else { $this->error = &quot;Query failed ($sql): &quot; . mysql_error(); user_error($this->error); return(FALSE); } } }

ما يهمنا معرفته فى هذه الكلاس لاستغلالها فيما بعد هو الاتى:

1-بيانات الاتصال بالقاعدة :

رمز Code:
private $dbHost = 'localhost'; private $dbUser = 'root'; private $dbPwd = 'root'; private $database = 'class'; private $connx = NULL; private $error = '';
2-تأمين الكلاس من الاتصال بقاعدة البيانات: والتأمين هنا لايقصد به تأمين البيانات, لكن تأمين الكلاس نفسها من حيث الخصوصية فى الاتصال private+منع تكرار الاتصال واستنساخه+الاتصال الاحادى غير المتعدد singleton

رمز Code:
private function __construct() { $this->connect(); } /** * Singleton method (only allow one instance of this class) * @return object */ public static function singleton() { if (!isset(self::$instance)) { $c = __CLASS__; self::$instance = new $c; } return self::$instance; } // end singleton() /** * Prevent users from cloning this instance * @return void */ public function __clone() { trigger_error('Clone is not allowed.', E_USER_ERROR); }

3-فانكشن الاتصال بقاعدة البيانات:


رمز Code:
private function connect() { $connx = @mysql_connect($this->dbHost, $this->dbUser, $this->dbPwd); if($connx != FALSE) { $this->connx = $connx; $db = mysql_select_db($this->database, $this->connx); if($db == FALSE) { $this->error = &quot;Unable to select DB: &quot; . mysql_error(); user_error($this->error, E_USER_WARNING); return(FALSE); } return(TRUE); } $this->error = &quot;Unable to connect to DBMS: &quot; . mysql_error(); user_error($this->error, E_USER_WARNING); return(FALSE); } // end connect()

4-فانكشن اختيار وعد عدد صفوف الجدول

رمز Code:
public function select($sql) { if(!$this->connx) { $this->error = &quot;Cannot process query, no DB connection.&quot;; user_error($this->error, E_USER_WARNING); return(FALSE); } $result = mysql_query($sql, $this->connx); if($result) { if(mysql_num_rows($result)) { return(new QueryResult($result, $this->connx)); } else { return(0); } } else { $this->error = &quot;Query failed ($sql): &quot; . mysql_error(); user_error($this->error, E_USER_WARNING); return(FALSE); } }

هذا ما يهمنا فى هذه الكلاس,




ثانيا: QueryResult.class.php


1-فانكشن جلب البيانات على هيئة جدول:

رمز Code:
public function getTable($headers = FALSE, $labels = NULL) { if(!mysql_data_seek($this->result, 0)) { return(false); } $table = &quot;<table class='dbresult'>\n&quot;; if($headers) { $table .= &quot;<tr>&quot;; if(is_array($labels)) { foreach($labels as $label) { $table .= &quot;<th>$label</th>&quot;; } } else { $num = mysql_num_fields($this->result); for($ix = 0; $ix < $num; $ix++) { $table .= &quot;<th>&quot;.mysql_field_name($this->result,$ix).&quot;</th>&quot;; } } $table .= &quot;</tr>\n&quot;; } while($row = mysql_fetch_row($this->result)) { $table .= &quot;<tr>&quot;; foreach($row as $val) { $table .= &quot;<td>$val</td>&quot;; } $table .= &quot;</tr>\n&quot;; } $table .= &quot;</table>\n&quot;; return($table); }

2-فانشكن جلب البيانات على هيئة xml

رمز Code:
public function getXml() { mysql_data_seek($this->result, 0); $xml = &quot;<?xml version='1.0' encoding='ISO-8859-1'?>\n<data>\n&quot;; $count = 1; while($row = mysql_fetch_assoc($this->result)) { $xml .= &quot; <record row='$count'>\n&quot;; foreach($row as $key => $val) { $xml .= &quot; <$key>$val</$key>\n&quot;; } $xml .= &quot; </record>\n&quot;; $count++; } $xml .= &quot;</data>&quot;; return($xml); } // end getXml()
هذا أهم أشياء والتى منها سنستغل الكلاس جيدا.......


الان: نأخذ مثال عملى شامل لاستغلال هذه الكلاس





اولا: عمل قاعدة البيانات :

1- نسوى قاعدة بيانات ونسميها class
2-نسوى جدول نسميه users, يتكون من 4 حقول id,name,country,email

وهذا هو كود code عمل القاعدة جاهز


رمز Code:
-- phpMyAdmin SQL Dump -- version 2.10.3 -- http://www.phpmyadmin.net -- -- المزود: localhost -- أنشئ في: 23 يناير 2014 الساعة 23:18 -- إصدارة المزود: 5.0.51 -- PHP إصدارة: 5.2.6 SET SQL_MODE=&quot;NO_AUTO_VALUE_ON_ZERO&quot;; -- -- قاعدة البيانات: `class` -- -- -------------------------------------------------------- -- -- بنية الجدول `users` -- CREATE TABLE `users` ( `id` int(11) NOT NULL auto_increment, `name` varchar(150) NOT NULL, `country` varchar(150) NOT NULL, `mail` varchar(150) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ; -- -- إرجاع أو إستيراد بيانات الجدول `users` -- INSERT INTO `users` VALUES (1, 'vista-design', 'egypt', '[email protected]'); INSERT INTO `users` VALUES (2, 'mohamed amin', 'ksa', '[email protected]'); INSERT INTO `users` VALUES (3, 'mazn eldosary', 'syria', '[email protected]'); INSERT INTO `users` VALUES (4, 'ahmed elmohandsy', 'u.a.e', '[email protected]');




ثانيا: عمل الاسكربت واستغلال الكلاسات :

1-سوى مجلد جديد ونسميه dbclass
2-ضع ملفين الكلاس mysql.class.php +queryresulty.class.php به
3-سوى ملف جديد اسمه usage.php


اولا: افتح ملف mysql.class.php وقم بظبط اعدادت الاتصال بقاعدة البيانات




2-مرحلة الاستغلال وعمل الاسكربت :

الان نفتح ملف usage.php , وراح نكتب به كود codeنا لعمل هذا الاسكربت البسيط جدا:

1-اولا نستدعى ملف الكلاس:

رمز Code:
require_once 'Mysql.class.php';
2-كود code الاستغلال:

راح نأخذ طرق مختلفة لاستغلال هذه الكلاس........


اولا:دائما تذكر هذه الجمله للاستغلال ( متغير وتأمين وفانكشن فى كلاس)

متغير: وهو المتغير الخاص اللى راح نلعب عليه
تأمين : وهى فانكشن لتأمين اتصال الكلاس بالقاعدة
فانكشن: وهى اللى راح نلعب بها لجلب البيانات
فى كلاس: وهى عمل كلاس جديد لضم كل السابق

نبدأ...........


1-نسوى كلاس اسمها مثلا test:

رمز Code:
class Test { }

2-ثم نخصص متغير لنعلب عليه :

رمز Code:
private $db;
3-ثم نسوى خطوة التأمين , وراح تكون عبارة عن فانكشن constructor, راح يتم استدعاءها فى كل مره
يتم استخدام هذه الكلاس فيها

رمز Code:
public function __construct() { $this->db = Mysql::singleton(); }
تفسير الكود code: قمنا بعمل فانكشن constructor , ودخلنا للمتغير, ثم اشرن لفانكشن singleton الخاصه بالتأمين الموجوده بالكلاس mysql فى ملف الكلاس mysql.class.php


4-ثم نسوى فانكشن : وهى اللى راح نستغل بها الكلاس:

نسوى الفانكشن وراح نسميها listcustomers:

رمز Code:
public function listCustomers() { }

الان علينا ان نختار فانكشن ال select والتى تقوم بالاتصال وعد حقول الجدول ,
(راجع فانكشن select فى ملف mysql.class.php لتعرف وظيفتها )

رمز Code:
public function listCustomers() { $result = $this->db->select('SELECT * FROM users'); }

بعد ذلك , بعد ما اتصلنا بالقاعدة وعدينا حقوق الجدول بواسطة هذه الفانكشن (select)
سنقوم بجلب بيانات الجدول باستخدام فانكشن gettable الموجوده فى ملف queryresulty.class.php


رمز Code:
public function listCustomers() { $result = $this->db->select('SELECT * FROM users'); return $result->gettable(true); }

لاحظ ان الtrue يقصد بها انه راح يرجع باسماء الحقول,




طب, نفرض اننا نريد جلب بيانات الزبائن على هيئة ملف xml

بسيطه, نستبدل فانكشن gettable السابقه والتى تجلب البيانات على هيئة جدول html مثل ما شوفنا,
بفانكشن getxml الموجوده فى نفس ملف الكلاس queryresulty.class.php (راجعها)

رمز Code:
public function listCustomers() { $result = $this->db->select('SELECT * FROM users'); return $result->getXml(); }



بهيك نكون خلصنا كلاس الاستغلال.......


الان علينا تنفيذ هذه الكلاس......

1-نسوى متغير لاستخدام الكلاس

رمز Code:
$test = new Test();
2-نطبع فانكشن الاستغلال listcustomers

رمز Code:
echo $test->listCustomers();

بحيث يعطينا كل عضويات الزبائن









بهيك يكون انتهى درس مفصلنا,

ترقبوا الدرس مفصل القادم وتطبيق عملى أكثر بأذن الله......











الملفات المرفقة [TR]
dbclass.zip (2.9 كيلوبايت, عدد مرات المشاهدة 1795 مرة) [/TR]



©المشاركات المنشورة تعبر عن وجهة نظر صاحبها فقط، ولا تُعبّر بأي شكل من الأشكال عن وجهة نظر إدارة المنتدى©