PHP基於MySQL資料庫實現對象持久層的方法,mysql資料庫_PHP教程

來源:互聯網
上載者:User

PHP基於MySQL資料庫實現對象持久層的方法,mysql資料庫


本文執行個體講述了PHP基於MySQL資料庫實現對象持久層的方法。分享給大家供大家參考。具體如下:

心血來潮,做了一下PHP的對象到資料庫的簡單持久層。

不常用PHP,對PHP也不熟,關於PHP反射的大部分內容都是現學的。

目前功能比較弱,只是完成一些簡單的工作,對象之間的關係還沒法映射,並且對象的成員只能支援string或者integer兩種類型的。

成員變數的值也沒有轉義一下。。。

下面就貼一下代碼:

首先是資料庫的相關定義,該檔案定義了資料庫的串連屬性:

<?php /*  * Filename: config.php  * Created on 2012-9-29  * Created by RobinTang  * To change the template for this generated file go to  * Window - Preferences - PHPeclipse - PHP - Code Templates  */   // About database   define('DBHOST', 'localhost'); // 資料庫伺服器   define('DBNAME', 'db_wdid'); // 資料庫名稱   define('DBUSER', 'root'); // 登陸使用者名稱   define('DBPSWD', 'trb'); // 登入密碼 ?> 

下面是資料庫訪問的簡單封裝:

<?php /*  * Filename: database.php  * Created on 2012-9-29  * Created by RobinTang  * To change the template for this generated file go to  * Window - Preferences - PHPeclipse - PHP - Code Templates  */   include_once("config.php");   $debug = false;   $g_out = false;   function out($s){     global $g_out;     $g_out .= $s;     $g_out .= "\r\n";   }   function db_openconnect(){     $con = mysql_connect(DBHOST, DBUSER, DBPSWD);          if(!mysql_set_charset("utf8", $con)){       out("set mysql encoding fail");     }     if (!$con){       out('Could not connect: ' . mysql_error());     }     else{       if(!mysql_select_db(DBNAME, $con)){         $dbn = DBNAME;         out("Could select database '$dbn' : " . mysql_error());      }       $sql = "set time_zone = '+8:00';";       if(!db_onlyquery($sql, $con)){         out("select timezone fail!" . mysql_error());       }     }     return $con;   }   function db_colseconnect($con){     mysql_close($con);   }   function db_onlyquery($sql, $con){     $r = mysql_query($sql, $con);     if(!$r){       out("query '$sql' :fail");       return false;     }     else{       return $r;     }   }   function db_query($sql){     $con = db_openconnect();     $r = db_onlyquery($sql, $con);     $res = false;     if($r){       $res = true;     }     db_colseconnect($con);     return $r;   }   function db_query_effect_rows($sql){     $con = db_openconnect();     $r = db_onlyquery($sql, $con);     $res = false;     if($r){       $res = mysql_affected_rows($con);       if($res==0){         $res = -1;       }     }     else{       $res = false;     }     db_colseconnect($con);     return $res;   }   function db_getresult($sql){     $con = db_openconnect();     $r = db_onlyquery($sql, $con);     $res = false;     if($r && $arr = mysql_fetch_row($r)){       $res = $arr[0];     }     db_colseconnect($con);     return $res;   }   function db_getarray($sql){     $con = db_openconnect();     $r = db_onlyquery($sql, $con);     $ret = false;     if($r){       $row = false;       $len = 0;       $ret = Array();       $i = 0;       while($arr = mysql_fetch_row($r)){         if($row == false || $len==0){           $row = Array();           $len = count($arr);           for($i=0;$i<$len;++$i){             $key = mysql_field_name($r, $i);             array_push($row, $key);           }         }         $itm = Array();         for($i=0;$i<$len;++$i){           $itm[$row[$i]]=$arr[$i];         }         array_push($ret, $itm);       }     }     db_colseconnect($con);     return $ret;   } ?> 

其實上面的兩個檔案都是之前寫好的,持久層的東西是下面的:

<?php /*  * Filename: sinorm.php  * Created on 2012-11-4  * Created by RobinTang  * To change the template for this generated file go to  * Window - Preferences - PHPeclipse - PHP - Code Templates  */   include_once("database.php");      function SinORM_ExecSql($sql) {     return db_query($sql);   }   function SinORM_ExecArray($sql) {     return db_getarray($sql);   }   function SinORM_ExecResult($sql){     return db_getresult($sql);   }   function SinORM_GetClassPropertys($class) {     $r = new ReflectionClass($class);     if (!$r->hasProperty('tablename')) {       throw new Exception("Class '$class' has no [tablename] property");     }     $table = $r->getStaticPropertyValue('tablename');     if (!$r->hasProperty('id')) {       throw new Exception("Class '$class' has no [id] property");    }     $mpts = Array ();     $pts = $r->getProperties(ReflectionProperty :: IS_PUBLIC);     foreach ($pts as $pt) {       if (!$pt->isStatic()) {         array_push($mpts, $pt);       }     }     return Array (       $table,       $mpts     );   }   function SinORM_GetPropertyString($pts, $class, $obj = false, $noid = false) {     if (is_null($pts)) {       list ($tb, $pts) = SinORM_GetClassPropertys($class);     }     $s = false;     $v = false;     $l = false;     foreach ($pts as $pt) {       $name = $pt->name;       if ($noid == false || $name != 'id') {         if ($l) {           $s = $s . ',';         }         $s = $s . $name;            if ($obj) {           if ($l) {             $v = $v . ',';           }           $val = $pt->getValue($obj);           if (is_null($val))             $v = $v . 'null';           if (is_string($val))             $v = $v . "'$val'";           else             $v = $v . $val;         }         $l = true;       }     }     return Array (       $s,       $v     );   }   function SinORM_GetTableName($class){     $r = new ReflectionClass($class);     if (!$r->hasProperty('tablename')) {       throw new Exception("Class '$class' has no [tablename] property");     }     $table = $r->getStaticPropertyValue('tablename');     if (!$r->hasProperty('id')) {       throw new Exception("Class '$class' has no [id] property");     }     return $table;   }   function SinORM_ResetORM($class) {     list ($tb, $pts) = SinORM_GetClassPropertys($class);     $sql = "CREATE TABLE `$tb` (`id` int NOT NULL AUTO_INCREMENT";     $r = new ReflectionClass($class);     $obj = $r->newInstance();     foreach ($pts as $pt) {       $val = $pt->getValue($obj);       $name = $pt->name;       if ($name != 'id') {         $sql = $sql . ',';       } else {         continue;       }       if (is_null($val))         throw new Exception($class . '->' . "name must have a default value");       if (is_string($val))         $sql = $sql . "`$name` text NULL";       else         $sql = $sql . "`$name` int NULL";     }     $sql = $sql . ",PRIMARY KEY (`id`));";     $dsql = "DROP TABLE IF EXISTS `$tb`;";     return SinORM_ExecSql($dsql) && SinORM_ExecSql($sql);   }   function SinORM_SaveObject($obj) {     $class = get_class($obj);     list ($tb, $pts) = SinORM_GetClassPropertys($class);     list ($names, $vals) = SinORM_GetPropertyString($pts, $class, $obj, true);     $sql = "INSERT INTO `$tb`($names) values($vals)";     if(SinORM_ExecSql($sql)){       $q = "SELECT `id` FROM `$tb` ORDER BY `id` DESC LIMIT 1;";       $id = SinORM_ExecResult($q);       if($id){         $obj->id = $id;       }     }     return false;   }   function SinORM_GetObjects($class) {     list ($tb, $pts) = SinORM_GetClassPropertys($class);     $sql = "SELECT * from `$tb`;";     $ary = SinORM_ExecArray($sql);     $res = false;     if (is_array($ary)) {       $res = Array ();       $ref = new ReflectionClass($class);       foreach ($ary as $a) {         $obj = $ref->newInstance();         foreach ($pts as $pt) {           $name = $pt->name;           $olv = $pt->getValue($obj);           $val = $a[$name];           if (is_string($olv))             $pt->setValue($obj, $val);           else             $pt->setValue($obj, intval($val));         }         array_push($res, $obj);       }     } else {       echo 'no';     }     return $res;   }   function SinORM_GetObject($class, $id) {     list ($tb, $pts) = SinORM_GetClassPropertys($class);     $sql = "SELECT * from `$tb` where `id`=$id;";     $ary = SinORM_ExecArray($sql);     $res = null;     if (is_array($ary) && count($ary) > 0) {       $res = Array ();       $ref = new ReflectionClass($class);       $a = $ary[0];       $obj = $ref->newInstance();       foreach ($pts as $pt) {         $name = $pt->name;         $olv = $pt->getValue($obj);         $val = $a[$name];         if (is_string($olv))           $pt->setValue($obj, $val);         else           $pt->setValue($obj, intval($val));       }       return $obj;     }     return null;   }   function SinORM_Update($obj) {     $class = get_class($obj);     list ($tb, $pts) = SinORM_GetClassPropertys($class);     $sql = "UPDATE `$tb` SET ";     $l = false;     foreach ($pts as $pt) {       $name = $pt->name;       $val = $pt->getValue($obj);       if ($name == 'id')         continue;       if ($l)         $sql = $sql . ',';       if (is_string($val))         $sql = $sql . "$name='$val'";       else         $sql = $sql . "$name=$val";       $l = true;     }     $sql = $sql . " WHERE `id`=$obj->id;";     return SinORM_ExecSql($sql);   }   function SinORM_SaveOrUpdate($obj) {     if (SinORM_GetObject(get_class($obj), $obj->id) == null) {       SinORM_SaveObject($obj);     } else {       SinORM_Update($obj);     }   }   function SinORM_DeleteObject($obj){     $class = get_class($obj);     $tb = SinORM_GetTableName($class);     $sql = "DELETE FROM `$tb` WHERE `id`=$obj->id;";     return SinORM_ExecSql($sql);   }   function SinORM_DeleteAll($class){     $tb = SinORM_GetTableName($class);     $sql = "DELETE FROM `$tb`;";     return SinORM_ExecSql($sql);   } ?> 

下面是使用的例子:

<?php /*  * Filename: demo.php  * Created on 2012-11-4  * Created by RobinTang  * To change the template for this generated file go to  * Window - Preferences - PHPeclipse - PHP - Code Templates  */   include_once("sinorm.php");   // 下面是一個持久對象的類的定義   // 每個持久對象類都必須有一個叫做$tablename靜態成員,它表示資料庫中儲存物件的表名   // 類的每個成員都必須初始化,也就是必須給它一個初始值   // 成員變數只能為字串或者整型,而且請定義成public的,只有public的成員變數會被映射   class User{     public static $tablename = 't_user';  // 靜態變數,對象的表名,必須的     public $id = 0; // 對象ID,對應表中的主鍵,必須的,而且必須初始化為0          public $name = ''; // 姓名,必須初始化     public $age = 0; // 年齡,必須初始化     public $email = ''; // 必須初始化    }      // 注意:下面的語句一定要在定義好類之後運行一下,修改了類也需要運行一下,它完成建立表的工作   // SinORM_ResetORM('User'); // 這一句只是一開始執行一次,執行之後就會自動在資料庫中建立User對應的表      $user1 = new User();  // 建立一個對象   $user1->name = 'TRB';   $user1->age = 22;   $user1->email = 'trbbadboy@qq.com';   SinORM_SaveObject($user1); // 把對象儲存到資料庫中      // 儲存之後會自動給id的   $id = $user1->id;   echo $id . '
'; $user2 = SinORM_GetObject('User', $id); // 通過ID從資料庫建立一個對象 echo $user2->name . '
'; $user1->name = 'trb'; // 改變一下 SinORM_Update($user1); // 更新到資料庫 $user3 = SinORM_GetObject('User', $id); // 重新讀出 echo $user3->name . '
'; ?>

希望本文所述對大家的php程式設計有所協助。

http://www.bkjia.com/PHPjc/1018528.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1018528.htmlTechArticlePHP基於MySQL資料庫實現對象持久層的方法,mysql資料庫 本文執行個體講述了PHP基於MySQL資料庫實現對象持久層的方法。分享給大家供大家參考。具...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.