先来说说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概念,以及用面向对象的思维方式来操作数据库的含义。