本文是从我的个人博客中交叉发布的。 您可以在以下位置找到所有精美的原始文章:
http://motomastyle.com/creating-a-my...-layer-in-php/ 。 介绍:本教程的目标是设计PHP中的数据抽象层(DAL),这将使我们能够忽略MySQL的复杂性,并将注意力集中在应用层和业务逻辑上。 希望在本指南结束时,您将拥有一个可用的DAL,并在此过程中学习有关PHP,MySQL和面向对象设计的一些知识。
假设:您知道PHP并已建立。
您知道MySQL并进行了设置。
您对面向对象的方法学有所了解。
你不是傻子。
定义项目:该项目的目的是创建一个有效的MySQL DAL,以使自己远离与PHP / MySQL系统相关的繁琐任务,例如传递连接句柄和遍历结果集。 我们将创建一个对象,该对象将创建并维护与数据库的连接,为我们提供执行所有必需的SQL查询,正确处理错误,整齐显示数据并保持应用程序代码清洁所需的工具。
定义对象:
我们的数据库对象将由局部变量,构造函数,变量和方法组成。 我将保留数据库类的析构函数和作用域,以保持与PHP4的兼容性。
局部变量:我们将需要变量来跟踪我们的连接信息,以及跟踪我们可能拥有的任何打开的连接。
构造函数:我们的类的构造方法将服务器创建数据库类的实例。 它将为类的变量提供其初始值。
Mut变者:我们的课程将提供用于动态更改数据库的功能,因此,我们将对其进行设计,以使我们可以单独或整体更改连接信息。
方法:我们正在设计DAL以连接到数据库,因此我们的Database类最好具有一个connect方法! 除connect方法外,它还应具有断开连接,执行查询和返回结果的方式。
对象零件:
我们的数据库类的意愿起步很简单; 我们只需要定义类和变量就可以了:
class Database
{
var $database_name;
var $database_user;
var $database_pass;
var $database_host;
var $database_link;
接下来,我们继续构造函数。
请记住,这将为我们提供数据库连接的初始值,因此如果我们将当前信息作为默认值输入就可以了:
function Database()
{
$this->database_user = "motoma";
$this->database_pass = "bI1dU5";
$this->database_host = "localhost";
$this->database_name = "dalDatabase";
}
现在我们继续我们的增变器。 这些将使我们可以对连接数据进行微调控制。 对于每个要设置的变量,我们都需要一个方法。 我们还可以选择创建一个以在一次调用中全部设置:
function changeUser($user)
{
$this->database_user = $user;
}
function changePass($pass)
{
$this->database_pass = $pass;
}
function changeHost($host)
{
$this->database_host = $host;
}
function changeName($name)
{
$this->databse_name = $name;
}
function changeAll($user, $pass, $host, $name)
{
$this->database_user = $user;
$this->database_pass = $pass;
$this->database_host = $host;
$this->database_name = $name;
}
我们现在真的很滚! 关于我们与连接有关的方法。 我们的connect方法将需要使用我们提供的凭据建立连接,并在发生连接错误时通知我们:
function connect()
{
$this->database_link = mysql_connect($this->database_host, $this->database_user, $this->database_pass) or die("Could not make connection to MySQL");
mysql_select_db($this->database_name) or die ("Could not open database: ". $this->database_name);
}
相反,disconnect方法将关闭我们的类先前建立的任何连接:
function disconnect()
{
if(isset($this->database_link)) mysql_close($this->database_link);
else mysql_close();
}
那不是很困难吗? 继续我们的方法。 我们首先需要做的也是最基本的事情是执行一个不返回任何结果的查询。 删除,更新和插入属于此类查询。 但是,在执行查询之前,我们应该检查数据库连接是否已建立。 如果没有,我们将需要在执行查询之前建立连接:
function iquery($qry)
{
if(!isset($this->database_link)) $this->connect();
$temp = mysql_query($qry, $this->database_link) or die("Error: ". mysql_error());
}
返回第一个返回查询处理程序的结果。 我个人喜欢使用数组。 由于我们通常会看到显示结果的结构,因此关联数组在返回结果集时有意义。 就像无结果查询处理程序一样,在尝试任何操作之前,我们将需要检查连接。 然后它将执行查询,并遍历结果集,将其整齐地放置在关联数组中供我们使用。
function query($qry)
{
if(!isset($this->database_link)) $this->connect();
$result = mysql_query($qry, $this->database_link) or die("Error: ". mysql_error());
$returnArray = array();
$i=0;
while ($row = mysql_fetch_array($result, MYSQL_BOTH))
if ($row)
$returnArray[$i++]=$row;
mysql_free_result($result);
return $returnArray;
}
}
可以向此列表添加更多功能,即返回auto_increment字段的最后插入的id并检查表是否存在。
使用我们的DAL:现在我们有了DAL,我们如何使用它? 这是一个例子:
<?php
// Our Database Class
include("lib/database.php");
// Instantiate our Database Class
$db = new Database();
// Query!
$resArr = $db->query("SELECT * FROM users WHERE userid != 1");
// $resArr is now an associative array containing the entire result set
// of the SQL query. We can now use and abuse this data as necessay.
// In this hypothetical situation, I am returing all of the users in
// my table except the Administrator
echo '<table><tr><th>UserID</th><th>UserName</th>';
echo '<th>RealName</th><th>Homepage</th></tr>';
foreach($resArr as $user)
{
echo '<tr><td>'.$user['userid'].'</td><td>'.$user['username'].'</td>';
echo '<td>'.$user['realname'].'</td><td>'.$user['homepage'].'</td></tr>';
}
echo "</table>";
?>
包起来:
希望本教程向您展示了如何快速轻松地为Web应用程序创建最小的数据抽象层。 使用DAL可以使我们专注于应用程序的应用程序和业务层,而不必经历单调的数据访问。
From: https://bytes.com/topic/php/insights/632487-creating-data-abstraction-layer-php