1 Like

面向对象PHP教学:MySQL数据库应用

php mysql oop 面向对象PHP教学:MySQL数据库应用
这是一篇以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');

本教学只完成了主干程式,还有像是错误处理,资料校验等功能没有实现,有兴趣的朋友可以自行挑战看看。


欢迎到我们的论坛发表你的看法

关于 Zack

喜欢WordPress,WordPress主题设计学习中; 关注网络,特别是Web2.0的发展.英文网志:http://ZackLive.com
本篇发表于 网页设计 并标签为 , , , , , 。将永久炼结加入书签。

This website uses IntenseDebate comments, but they are not currently loaded because either your browser doesn't support JavaScript, or they didn't load fast enough.

留下评论

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>