PHP ORM操作MySQL数据库

先来说说ORM的事儿,ORM全称是Object Relational Mapping[对象关系映射],结合博文标题理解ORM就是把PHP对象映射成数据表里的记录,使用PHP语言完成MySQL数据库的操作,写代码是一种很好的理解原理和概念的方式。
首先给出数据库里一张表的表结构,如下图所示:
这里写图片描述
现在我们能够将这张表进行操作,比如使用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概念,以及用面向对象的思维方式来操作数据库的含义。

自主封装的PHP ORM框架,面向对象的PDO数据库操作,API框架,支持Get/Post/Put/Delete多种请求方式。 代码示例: <?php use Models\User; require '../application.php'; require '../loader-api.php'; //适合查询,如:获取用户列表或者单个用户信息 execute_request(HttpRequestMethod::Get, function() { $action = request_action(); //判断是否存在 if ($action == 1) { list($type, $value) = filter_request(array( request_int('type', 1, 2, 3), //1.用户名 2.邮箱 3.手机号 request_string('value'))); $type_field_map = array( 1 => User::$field_username, 2 => User::$field_email, 3 => User::$field_phone ); if ($type == 2 && !is_email($value) || $type == 3 && !is_mobilephone($value)) { die_error(USER_ERROR, $type_field_map[$type]['name'] . '格式无效'); } $user = new User(); $user->set_where_and($type_field_map[$type], SqlOperator::Equals, $value); $result = $user->exists(create_pdo()); echo_result($result ? 1 : 0); //存在返回1,不存在返回0 } //查询单条信息 if ($action == 2) { list($userid) = filter_request(array( request_userid())); //查询单条数据 $user = new User($userid); //set_query_fields可以指定查询字段,下面两种写法均可 //$user->set_query_fields('userid, username, email'); //$user->set_query_fields(array(User::$field_userid, User::$field_username, User::$field_email)); //还可设置where条件进行查询 //$user->set_where_and(User::$field_status, SqlOperator::Equals, 3); //$user->set_where_and(User::$field_truename, SqlOperator::IsNullOrEmpty); //$user->set_where_and(User::$field_age, SqlOperator::In, array(27, 29)); //$user->set_where_and(User::$field_regtime, SqlOperator::LessThan, '-6 month'); //创建数据库连接 $db = create_pdo(); $result = $user->load($db, $user); //也可以用Model类的静态方法 //$result = Model::load_model($db, $user, $user); if (!$result[0]) die_error(PDO_ERROR_CODE, '获取用户信息时数据库错误'); if (!$user) di
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值