
这是一篇以PHP面向对象的方式来实作MySQL数据库的教学,适合对PHP有一定了解的面向对象初学者。我们只实现了最基本的功能,你可以根据自己的需要进行扩充。如果你发现有什么问题或建议,欢迎提出。同时我们也寻求后续教学文章,欢迎推荐。本文的代码主要来自Build Internet.
建立一个数据库和users表
用面向对象来操作MySQL数据库,最主要的部分就是写一个数据库的类。首先我们建立一个数据库跟一个名为users的表,以供教学使用,以下是SQL码:
CREATE TABLE IF NOT EXISTS `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL, `password` varchar(50) NOT NULL, `email` varchar(50) NOT NULL, `join_date` datetime NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
数据库类和属性
接下来,我们进入数据库类的设计。这个类有四个属性(Properties):
- $db_name:数据库名称
- $db_user:数据库用户名称
- $db_pass:数据库用户密码
- $db_host:数据库伺服器,一般为localhost
由于这些资料仅供内部使用,我们将它们设为protected。这样,我们可以得出最基本的设计:
<?php
//DB.class.php
class DB{
protected $db_name = 'yourdatabasename';
protected $db_user = 'databaseusername';
protected $db_pass = 'databasepassword';
protected $db_host = 'localhost';
}
?>
类的方法
接下来我们要写这个类的方法,接下来讲到所有的方法都属于这个类,所以要写在class DB的大括号里面。第一个方法自然是connect(),连结数据库:
//连结数据库
//每一个使用数据库的页面都要运行这个方法
public function connect() {
$connection = mysql_connect($this->db_host, $this->db_user, $this->db_pass);
mysql_select_db($this->db_name);
return true;
}
这个方法用mysql_connect()连结数据库后,再用mysql_select_db()选择使用的库。
再来,我们要实现最基本的数据库操作,包括:
- 写入:insert()
- 读出:select()
- 更新:update()
- 删除:delete()
第一个是写insert()方法,用于新增资料:
public function insert($data, $table) {
$columns = "";
$values = "";
foreach ($data as $column => $value) {
$columns .= ($columns == "") ? "" : ", ";
$columns .= $column;
$values .= ($values == "") ? "" : ", ";
$values .= $value;
}
$sql = "insert into $table ($columns) values ($values)";
mysql_query($sql) or die(mysql_error());
//返回新增行(row)的id
return mysql_insert_id();
}
这个方法首先将$data里的全部key合集到$columns里面(用逗号分开),同样将合部的值(value)合集到$values。再运行mysql_query,失败的话用die()显示错误讯息,成功则返回新增行(row)的id。
在写select()方法前,我们还需要一个方法辅助。由于,从数据库读出的资料是行的(RowSet)形式,不方便使用,所以我们要把它们转为数组(array),我们用processRowSet()方法来实现这个功能:
public function processRowSet($rowSet, $singleRow=false)
{
$resultArray = array();
while($row = mysql_fetch_assoc($rowSet))
{
array_push($resultArray, $row);
}
if($singleRow === true)
return $resultArray[0];
return $resultArray;
}
这个方法用mysql_fetch_assoc()将$rowSet里面的所有的行(Row)逐一转为数组($row),再用array_push()将这些数组推入$resultArray里面。另外,如果有设定$singleRow的话,只返回$resultArray里的第一个数组,否则就返回整个$resultArray。
现在进入select()方法:
public function select($table, $where) {
$sql = "SELECT * FROM $table WHERE $where";
$result = mysql_query($sql);
if(mysql_num_rows($result) == 1)
return $this->processRowSet($result, true);
return $this->processRowSet($result);
}
这里就可以看到刚才的processRowSet如何发挥作用。首先用mysql_query()读出资料,再用processRowSet将资料转换为数组(Array)并返回;如果mysql_query()得出来的结果只有一行(用mysql_num_rows()判断),则将processRowSet()的第二个参数$singleRow设为true,也就是只要返回第一个结果就可以。
最后的update()跟delete()就比较简单了,纯粹只是运行SQL查询,成功则返回true,失败则显示错误讯息,以下是update():
public function update($data, $table, $where) {
foreach ($data as $column => $value) {
$sql = "UPDATE $table SET $column = $value WHERE $where";
mysql_query($sql) or die(mysql_error());
}
return true;
}
以下是delete():
public function delete($table, $where) {
$sql = "DELETE * FROM $table WHERE $where";
mysql_query($sql) or die(mysql_error());
return true;
}
应用数据库类
现在你的数据库应该是这样:
<?php
//DB.class.php
class DB{
protected $db_name = 'yourdatabasename';
protected $db_user = 'databaseusername';
protected $db_pass = 'databasepassword';
protected $db_host = 'localhost';
public function connect() {
$connection = mysql_connect($this->db_host, $this->db_user, $this->db_pass);
mysql_select_db($this->db_name);
return true;
}
public function insert($data, $table) {
$columns = "";
$values = "";
foreach ($data as $column => $value) {
$columns .= ($columns == "") ? "" : ", ";
$columns .= $column;
$values .= ($values == "") ? "" : ", ";
$values .= $value;
}
$sql = "insert into $table ($columns) values ($values)";
mysql_query($sql) or die(mysql_error());
return mysql_insert_id();
}
public function processRowSet($rowSet, $singleRow=false)
{
$resultArray = array();
while($row = mysql_fetch_assoc($rowSet))
{
array_push($resultArray, $row);
}
if($singleRow === true)
return $resultArray[0];
return $resultArray;
}
public function select($table, $where) {
$sql = "SELECT * FROM $table WHERE $where";
$result = mysql_query($sql);
if(mysql_num_rows($result) == 1)
return $this->processRowSet($result, true);
return $this->processRowSet($result);
}
public function update($data, $table, $where) {
foreach ($data as $column => $value) {
$sql = "UPDATE $table SET $column = $value WHERE $where";
mysql_query($sql) or die(mysql_error());
}
return true;
}
public function delete($table, $where) {
$sql = "DELETE * FROM $table WHERE $where";
mysql_query($sql) or die(mysql_error());
return true;
}
}
?>
没问题的话,我们来看看怎么使用这个类:
//建立一个DB类的实例
$db = new DB();
//连结数据库
$db->connect();
$data = array(
"username" => "'Jack'",
"email" => "'jack@email.com'"
);
//新增一个用户
$db->insert($data, 'users');
//更改email
$data = array(
"username" => "Jack",
"email" => "jack.gmail@gmail.com"
);
//更新资料
$db->update($data, 'users', 'id = 1');
//删除资料
$db->delete('users', 'id = 1');
本教学只完成了主干程式,还有像是错误处理,资料校验等功能没有实现,有兴趣的朋友可以自行挑战看看。




