PHP ORM操作MySQL数据库

先来说说ORM的事儿,ORM全称是Object Relational Mapping[对象关系映射],结合博文标题理解ORM就是把PHP对象映射成数据表里的记录,使用PHP语言完成MySQL数据库的操作,写代码是一种很好的理解原理和概念的方式。
首先给出数据库里一张表的表结构,如下图所示:


图片.png

这里写图片描述
现在我们能够将这张表进行操作,比如使用setId_P(“5”),即可以设置Id_P字段的值,使用getId_P(),可以获得当前对象的值。所以我们需要建立model对象,在下面就是Person类,与表里的字段一一对应。

<?php
    class Person{  
        public $Id_P;
        public $Lastname;
        public $Firstname;
        public $Address;
        public $City;

        function getTableNameBdd()
        {
            return 'persons';
        }
        function setId_P($Id_P){
            $this->Id_P=$Id_P;
        }
        function getId_P(){
            return $this->Id_P;
        }
        function setLastName($Lastname){
            $this->Lastname=$Lastname;
        }
        function getLastName(){
            return $this->Lastname;
        }
        function setFirstName($Firstname){
            $this->Firstname=$Firstname;
        }
        function getFirstName(){
            return $this->Firstname;
        }
        function setAddress($Address){
            $this->Address=$Address;
        }
        function getAddress(){
            return $this->Address;
        }
        function setCity($City){
            $this->City=$City;
        }
        function getCity(){
            return $this->City;
        } 
    }
?> 

接下来实现如何连接MySQL数据库,先预定义数据库的基本信息服务器主机,用户名,密码,数据库名称,文件名称为db_config.php;

<?php
define("DB_USER", "root");
define("DB_PASSWORD", "");
define("DB_DATABASE", "persondb");
define("DB_SERVER", "localhost");
?>

其次,连接数据库文件名称为db_connect.php;其代码如下所示:

<?php function connect(){ 
require_once __DIR__.'/db_config.php'; 
global $con; 
$con=mysqli_connect(DB_SERVER,DB_USER,DB_PASSWORD) or die(mysqli_connect_error()); 
$db=mysqli_select_db($con,DB_DATABASE)or die(mysqli_error()); 
return $con; } 
function close()
{ global $con; mysqli_close($con); } 
?>

现在我们使用ORM操作MySQL数据库,这也应该可以很好的理解ORM概念了。其文件名称为orm.php,代码如下:

<?php
    require_once __DIR__.'/db_connect.php';
    class orm{

        private static $con = NULL; 

       //链接数据库
        public function getConnection(){
            self::$con=connect();
            return self::$con;
        }

        //获得一个表的所有列名  
        public function getColumns($tableName) {  

            $sql = "show columns from ".$tableName;   
            $columns = array();  

            if(self::$con!=null){  

                $rtn = mysqli_query(self::$con,$sql);  

                while($rtn!==false&&($row=mysqli_fetch_array($rtn))!=null){  

                    $columns[] = $row[0];  
                } 
            }  

            return $columns;  

        }  

        //从数据表中获取所有对象数据
        public function getAll($object){

            $tableName = $object->getTableNameBdd();
            $columns=$this->getColumns($tableName);
            $sql = "SELECT * FROM `".$tableName."`";

            if(self::$con!=null){
                $rtn=mysqli_query(self::$con,$sql);

                $arr=array();

                while ($rtn!=false&&($row=mysqli_fetch_array($rtn))) {
                    $index=-1;
                    $obj=new Person();

                    foreach ($columns as $key=>$column) {
                         $obj->{"set".ucfirst($column)}($row[++$index]);

                    }

                    $arr[]=$obj;

                }
                return $arr;
            }

            mysqli_close(self::$con);

        }

        //向数据表中插入对象数据
        public function save($object){

            $tableName = $object->getTableNameBdd();
            $columns=$this->getColumns($tableName);

            $tag=false;

            if (self::$con!=null) {

                $sql = "INSERT INTO `" . $tableName . "` (";

                foreach ($columns as $key => $column) {
                    $sql.= $column.",";
                }

                $sql=substr($sql,0,strlen($sql)-1).") values (";

                foreach ($columns as $key => $column) {
                    $value=$object->{"get".ucfirst($column)}();
                    $sql.="'".$value."',";
                }

                $sql=substr($sql,0,strlen($sql)-1);
                $sql.=")";

                mysqli_query(self::$con,$sql);
                $tag=true;
                mysqli_close(self::$con);

            }

            return $tag;

        }

        //修改数据表中的对象数据
        public function update($object){
            $tableName = $object->getTableNameBdd();
            $columns=$this->getColumns($tableName);
            $tag=false;
            if (self::$con!=null) {

                $sql="UPDATE `".$tableName."`SET ";
                for ($i=0; $i<count($columns);$i++) { 
                    $column=$columns[$i];
                    $value=$object->{"get".ucfirst($columns[$i])}();

                    if ($value==null) {
                        $sql.=$column."=null,";
                    }else{
                        $sql.=$column."='".$value."',";  
                    }
                }

                $sql=substr($sql,0,strlen($sql)-1);

                $sql.= " where ";  
                $tempColumn = $columns[0];  
                $tempValue = $object->{"get".ucfirst($columns[0])}(); 
                $sql.= $tempColumn."=".$tempValue;   
                mysqli_query(self::$con,$sql);
                $tag = true; 
                mysqli_close(self::$con);
            }

             return $tag; 

        }

        //删除数据表中的所有数据
        public function deleteALL($object){
            $tableName=$object->getTableNameBdd();
            $tag=false;
            $sql="delete from".$tableName;
            if (self::$con!=null) {
                mysqli_query(self::$con,$sql);
                $tag=true;
            }
            return $tag;
        }
        }
        ?>

下面我们就写一段代码去测试一下PHP对象对数据库的操作,需要在测试代码之前加一段注册给定的函数作为 __autoload 的实现 ,其代码是:

<?php
    spl_autoload_register(function($class){
        $name = str_replace('\\', '/', $class);
        require_once($name.'.php');
    });
?>

其测试代码名称为test.php,其代码如下所示:

<?php
require_once('autoloader.php');
$orm = new Orm();
$orm->getConnection();

//查询Persons表中的所有数据
$person = new Person();
$personArr = $orm->getAll($person);

//修改Persons表中的某一条数据
$person=new Person();
$person->setId_P("5");
$person->setLastName("ly");
$person->setFirstName("l");
$person->setAddress("js");
$person->setCity("nj");
$orm->save($person);
$person->setId_P("5");
$person->setLastName("l");
$person->setFirstName("y");
$tag=$orm->update($person);

//向Persons表中添加一条数据
$person=new Person();
$person->setId_P("6");
$person->setLastName("ly");
$person->setFirstName("l");
$person->setAddress("js");
$person->setCity("nj");
$orm->save($person);

//删除Persons表中的所有数据
$person=new Person();
$orm->deleteALL($person);

?>

上面的代码只是给简单的增删改查的演示,重点是理解ORM概念,以及用面向对象的思维方式来操作数据库的含义。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容