MySQL类,你都用到了什么功能?

countstars 2004-04-27 09:06:48
征求一下大家的意见,写了一个MySQL Class,不知道要往里面填什么
请说出你需要的功能,谢谢,具体点的,越多越好,当然,是比较好用的功能
这样好“封装”.=_=!!
其实很少写类,最近开始一个一个封了。。。
...全文
65 点赞 收藏 16
写回复
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianze98 2004-04-28
好好学习,我的mysql类不编辑SQL,就是说SQL都是直接传给类,只是把结果整理出来
我不知道这样好不好,可是我用的顺了,就觉得好了
回复
ice_berg16 2004-04-28
数据库类在这里只是起到初始化的作用,并没有其它作用。
也可放在M层里
function member()
{
$this->db = new mysql();
}
但这样在M层里就必须包含数据类,效果是一样的
回复
hackfan 2004-04-28
楼上的,需要改进,Control里面不应该出现数据库类
回复
song213 2004-04-28
我现在只有mark的能力。
回复
countstars 2004-04-28
$DSN = array(
"dbHost" => "localhost",
"dbName" => "dbname",
"dbUser" => "root",
"dbPswd" => "",
);
$DB = new DB($DSN);
$row = $DB->getAll("Select * From open_topics");
这样初始化,我上面已经写过了.
回复
gaofaq 2004-04-28
楼上的你的
Class中的$dsn[]数组是从哪取的?
回复
countstars 2004-04-28
贴一下,有待改进,请唠叨和各位老大指点,没有注释,和和,等完成了再注释:
<?php
/*
+-------------------------------------------------------------------+
| OpenPHP.cn Version 1.0 Beta |
+-------------------------------------------------------------------+
| Copyright (c) 2003-2004 The OpenPHP.cn Web Team |
+-------------------------------------------------------------------+
| WebSite : http://www.openphp.cn |
| Time : Sat, Apr 17 2004 05:36:04 GMT |
| Support : support@openphp.cn |
| Contect : webmaster@openphp.cn |
| Licence : http://www.openphp.cn/?license |
+-------------------------------------------------------------------+
| Filename : MySQL.class.php |
| Function : DB class |
+-------------------------------------------------------------------+
| Authors : ShenKong <shenkong@openphp.cn> |
| Maintainer : ShenKong <shenkong@openphp.cn> |
| Create Time : Sat, Apr 17 2004 05:36:04 GMT |
| Last Modify : Sat, Apr 17 2004 05:36:04 GMT |
+-------------------------------------------------------------------+
*/

define("DB_FETCH_ROW", MYSQL_NUM);
define("DB_FETCH_ASSOC", MYSQL_ASSOC);
define("DB_FETCH_ARRAY", MYSQL_BOTH);

class DB
{
var $dbHost = null;
var $dbName = null;
var $dbUser = null;
var $dbPswd = null;
var $conn = null;
var $query = null;
var $result = null;
var $errStr = null;
var $quick = false;
var $sqlStr = array();
var $sQueries = 0;
var $uQueries = 0;

function DB($dsn, $fetchMode = DB_FETCH_ASSOC, $pConn = false)
{
$this->dbHost = $dsn["dbHost"];
$this->dbName = $dsn["dbName"];
$this->dbUser = $dsn["dbUser"];
$this->dbPswd = $dsn["dbPswd"];
$this->connect($pConn);
$this->selectDB();
$this->setFetchMode($fetchMode);
}

function connect($pConn = false)
{
$pConn ? $connFunc = "mysql_pconnect" : $connFunc = "mysql_connect";
$this->conn = @ $connFunc($this->dbHost, $this->dbUser, $this->dbPswd);
if (!$this->conn)
{
$this->errStr = "DataBase Connect False : ($this->dbHost, $this->dbUser, ******) !";
$this->dbError();
}
}

function selectDB()
{
if ($this->dbName != null)
{
if(! @ mysql_select_db($this->dbName, $this->conn))
{
$this->errStr = "DataBase -[$this->dbName]- does not exist !";
$this->dbError();
}
}
return false;
}

function setFetchMode($fetchMode)
{
if(!defined("DB_FETCH_MODE"))
{
define("DB_FETCH_MODE", $fetchMode);
}
}

function query($query, $quick = false)
{
$this->quick = $quick;
$this->query = $query;
$this->sqlStr[] = $this->query;
$this->quick ? $queryFunc = "mysql_unbuffered_query" : $queryFunc = "mysql_query";
$this->result = @ $queryFunc($this->query, $this->conn);
$this->sQueries++;
if (!$this->result)
{
$this->dbError();
}
return $this->result;
}

function simpleQuery($query, $from = 0, $limit = 0)
{
if($from)
{
$from = $from . ',';
}
if($limit)
{
$query .= ' Limit ' . $from. $limit;
}
$this->query($query);
}

function getOne($query)
{
//$this->query = preg_replace("!(select .+ from [^ ]+)(.*)!i", "\\1", $query);
if (!stristr($query, "limit"))
{
$query .= " Limit 1";
}
$this->query($query, true);
$row = $this->fetchRow(DB_FETCH_ROW);
$this->free();
return $row[0];
}

function getRow($query, $fetchMode = DB_FETCH_MODE)
{
if (!stristr($query, "limit"))
{
$query .= " Limit 1";
}
$this->query($query, true);
$row = $this->fetchRow($fetchMode);
$this->free();
return $row;
}

function getAll($query, $fetchMode = DB_FETCH_MODE)
{
$this->query($query, true);
while($rows = @ $this->fetchRow($fetchMode))
{
$allRows[] = $rows;
}
$this->free();
return $allRows;
}

function update($query)
{
$this->query = $query;
$this->sqlStr[] = $this->query;
$this->result = mysql_unbuffered_query($query);
if (!$this->result)
{
$this->errStr = "Update data Error !";
$this->dbError();
}
$this->uQueries++;
$this->free();
return true;
}

function getTables()
{
$this->result = @ mysql_list_tables($this->dbName);
if (!$this->result)
{
$this->errStr = "List database's tables Error !";
$this->dbError();
}
$tablesNum = @ mysql_num_rows($this->result);
for ($i = 0; $i < $tablesNum; $i++)
{
$tables[] = mysql_tablename($this->result, $i);
}
return $tables;
}

function optimize()
{
$tables = $this->getTables();
print_r($tables);
$tablesNum = count($tables);
for($i=0; $i < $tablesNum; $i++)
{
$this->update("Optimize Table " . $tables[$i]);
echo "Optimeze Table " . $tables[$i] . "\n";
}
}

function fetchRow($fetchMode = DB_FETCH_MODE)
{
$rows = @ mysql_fetch_array($this->result, $fetchMode);
return $rows;
}

function seek()
{
}

function rows()
{
return @ mysql_num_rows($this->result);
}

function fields()
{
return @ mysql_num_fields($this->result);
}

function lastID()
{
return @ mysql_insert_id($this->conn);
}

function free()
{
@ mysql_free_result($this->result);
$this->result = null;
}

function close()
{
@ mysql_close($this->conn);
}

function dbError()
{
//ob_end_clean();
$errStr = "Error No : " . mysql_errno() . "\n";
$errStr .= "Time : " . date("Y-m-d H:i:s") . "\n";
if (isset($this->errStr))
{
$errStr .= $this->errStr . "\n";
}
if(isset($this->query))
{
$errStr .= "Query : " . $this->query . "\n";
}
$errStr .= "Error MSG : " . mysql_error();
echo nl2br($errStr);
exit;
}
}

?>
回复
countstars 2004-04-28
类方便嘛,比如我的类中这样操作:
$DSN = array(
"dbHost" => "localhost",
"dbName" => "dbname",
"dbUser" => "root",
"dbPswd" => "",
);
$DB = new DB($DSN);
$row = $DB->getAll("Select * From open_topics");
即可把结果全部给$row了,很方便

另外To tianze98(择天) :类并没有编辑SQL,需要把SQL传给方法处理。
回复
xuzuning 2004-04-28
有很多性能很好的数据库操作类,大可不必自己封装。当然练练手也无可非议。
封装数据库操作的目的是使控制逻辑与具体的数据库操作分离,所以数据库类要能处理各种数据库。也就是你需要了解各种数据库的操作,否则意义并不大。
比如mysql_insert_id在别的数据库中是否提供,如何提供的?
又如在查询串中出现了limit或top,类是否能识别并加以处理?
又如原来使用mysql的程序换用Oracle后数据库相关部分是否要做改动?要做多大改动?
.....
回复
flyfeicsdn 2004-04-28
另外:我是菜鸟说句可能你们都会反对的话,php提供这么多的mysql函数,为什么要用类(我指的是一般的中小web站点) ,用mysql函数快,功能多!
回复
flyfeicsdn 2004-04-28
PHP mysql 函数库有个mysql_insert _id() 取得上一步 INSERT 操作产生的 ID 有时候可能会用到。
回复
mistjin 2004-04-28
8错,
可以方便mysql的操作,不过估计每个人都有一个mysql操作类,只不过功能大小不同而已。
所以觉的意思不是太大,练练手很好。

还是一句话:8错8错
回复
ice_berg16 2004-04-27
如果用M(model)V(view)C(cotroller)架构来开发WEB系统
大概是这个样子
C也就是控制器来根据要求调用不同的V(也就是视图)
而V是M通用mysql 类(数据抽象访问层)来和数据库交互。生成V反馈给C
我们一般写SQL查询语句的时候不是写在V层,是写在M层
而V层只是调用M层的相关函数就可以实现查询数据库了。
举个例子:
一个会员系统的M层
class member{
var $name; //用户名
var $pwd; //密码
var $db; //数据库抽象层的对象
function member($db)
{
$this->db = $db;
}
function login($name, $pwd) //用户登录程序
{
$sql = 'select * from member where name='$name' and pwd = '$pwd';
$this->db->query($sql);
if ($this->db->total_record()) //相当于mysql_num_rows($res)
return 1;
else
return 0;
}
}

我们在程序中可以这样来实现用户登录
require_once("mysql.php")//包含数据抽象层
require_once("member.php") //包含定义的M层
$db = new mysql();
$mem = new member($db);
if ($mem->login($_POST['name'], $_POST['pwd'])
$_SESSION['name'] = $_POST['name']; //实现登录
else
echo "出错";

也就是说M层主要实现了各种对会员的数据库操作的模型
V层只要调用M层就可以。不必考虑M层具体是怎么实现的。
--------------------------------------------------------
以上只是个人对这方面的理解,有不对之处还请指证。
ps:别叫我高手,我也是菜鸟。。。。。


回复
countstars 2004-04-27
请问搂上的高手,逻辑层(model)是什么呢?能不能解释一下?它具体干什么?能否举个例子说明什么是逻辑层?
回复
ice_berg16 2004-04-27
个人认为:
数据库抽象层只是起到与数据库沟通的作用,不需要包含太多的功能
具体的操作应该由逻辑层(model)来完成。
回复
countstars 2004-04-27
目前我写了一下,有下面的功能:
取得一个数值[getOne]
取得一行[getRow]
取得所有行返回一个数组[getAll]
普通查询[fetchRow]
更新数据[update]
得到所有的SQL语句赋给数组[sqlStr]
错误处理[dbError]
全局设定Fetch Mode,并可给某个查询设定Fetch Mode
优化数据表[Optimize]
暂时好像就这些,不知道还要什么
回复
发动态
发帖子
基础编程
创建于2007-09-28

2.1w+

社区成员

从PHP安装配置,PHP入门,PHP基础到PHP应用
申请成为版主
社区公告
暂无公告