首页 » 工作 » 正文

MySQL数据库连接类mysql.class.php

发布者:某某人
2011/01/25 浏览数(1,893) 分类:工作 暂无评论

说明:

MySQL数据库连接类,常用操作:

connect //连接数据库服务器(mysql_connect) 、

query //执行查询(mysql_query)、

rows //取得结果集的总数(mysql_num_rows)、

insertId //取得上一步INSERT操作产生的ID(mysql_insert_id)、

fetchArray //从结果集中作为数组取得一行(mysql_fetch_array)、

getOne //获取一条记录、

affectedRows //前一次操作所影响的记录行数(mysql_affected_rows)、

begin、rollback、commit //事务启动、回滚、提交

error、errno //错误信息。

用法:

取一条数据:

<?php
include('mysql.class.php');
$db = new mysql('localhost:3307','upall','pwd','testDb');
$rs = $db->getOne("SELECT `id` FROM `member` WHERE `user` = 'upall' LIMIT 1");
if (!empty($rs['id'])){
	echo '登录成功';
}else{
	echo '用户名或密码错误';
}
?>

输出列表:

<?php
include('mysql.class.php');
$db = new mysql('localhost:3307','upall','pwd','testDb');
$sql = "SELECT * FROM `member`";
$query = $db->query($sql);
$rows = $db->rows($query);
while ($rs = $db->fetchArray($query)){
	echo $rs['user'] . '<br />';
}
echo "共 $rows 条记录";
?>

事务处理:

MySQL中只有InnoDB和BDB类型的数据表才能支持事务处理!其他的类型是不支持的。

<?php
include('mysql.class.php');
$db = new mysql('localhost:3307','upall','pwd','testDb');
$db->begin(); // 启动事务
$sqlReduction = "UPDATE `account` SET `money` = `money` - 10000 WHERE `id` = 1 LIMIT 1 FOR UPDATE";
$queryReduction = $db->query($sqlReduction);
if ($db->error()){
	$db->rollback(); // 回滚事务
	echo '扣钱时出错啦~';
}else{
	$sqlIncrease = "UPDATE `account` SET `money` = `money` + 10000 WHERE `id` = 2 LIMIT 1";
	$queryIncrease = $db->query($sqlReduction);
	if ($db->error()){
		$db->rollback(); // 回滚事务
		echo '加钱时出错啦~';
	}else{
		$db->commit();// 提交事务
		echo '转款成功啦。';
	}
}
?>

自动保存:

<form action="?add">
	<!-- 属性“name”与表字段对应 -->
	<label>标题:<input type="text" name="title" /></label>
	<label>作者:<input type="text" name="author" /></label>
	<label>内容:<input type="text" name="content" /></label>
	<button type="submit">添加</button>
</form>
<?php
if (isset($_GET['add'])){
	include('mysql.class.php');
	$db = new mysql('localhost:3307','upall','pwd','testDb');
	$rs = $db->insert('news_info'); //news_info是表名,自动处理POST
	if (TRUE == $rs){ //错会直接抛出异常
		echo '录入成功';
	}

}
?>

自动更新:

<?php
// 这里可以参考上文中的getOne()
$rs =  ....
?>
<form action="?save">
	<!-- 属性“name”与表字段对应 -->
	<label>标题:<input type="text" name="title" value="<?php echo $rs['title'];?>" /></label>
	<label>作者:<input type="text" name="author" value="<?php echo $rs['author'];?>" /></label>
	<label>内容:<input type="text" name="content" value="<?php echo $rs['content'];?>" /></label>
	<input type="hidden" name="id" value="<?php echo $rs['id'];?>" />
	<button type="submit">添加</button>
</form>
<?php
if (isset($_GET['save'])){
	include('mysql.class.php');
	$db = new mysql('localhost:3307','upall','pwd','testDb');
	$id = (int)$_POST['id'];
	$rs = $db->update($id,'news_info'); // 更新id为$id的记录,news_info是表名,自动处理POST
	if (TRUE == $rs){ //错会直接抛出异常
		echo '更新成功';
	}

}
?>

下载:

mysql.class.php.tar.gz (为什么此附件的地址不能分享给朋友们下载?)

代码:

<?php
/**
 * 说明:MySQL数据库连接类
 * 时间:13:04 2011年7月28日 星期四
 * $host = 服务器地址(“$host”或“$host:PORT”)
 * $name = 用户名
 * $pwd  = 密码
 * $db   = 数据库
 * ----------------------------------
 * 用法:
 *    $dbHost = 'localhost:3307'
 *    $dbUser = 'root'
 *    $dbPwd = 'upall'
 *    $dbName = 'mysql'
 *    $db = new mysql($dbHost, $dbUser, $dbPwd, $dbName); // 实例后直接连接数据库
 *    $sql = "SELECT * FROM user WHERE User LIKE '%upall%'";
 *    $query = $db->query($sql); // 执行查询
 *    while ($rs = $db->fetchArray($query)){
 *       echo $rs['User'] . '<br />';
 *    }
 */
class mysql{
	public $host = 'localhost:3306';
	public $user = 'upall';
	public $pwd = '';
	public $db = 'mysql';
	public $charset = 'utf8'; // 注意:mysql中不是utf-8,没有减号
	public $linkId;
	public $sql = '';

	function __construct($host = '', $user = '', $pwd = '', $db = '', $charset = ''){
		empty($host) ? '' : $this->host = $host;
		empty($user) ? '' : $this->user = $user;
		empty($pwd) ? '' : $this->pwd = $pwd;
		empty($db) ? '' : $this->db = $db;
		empty($charset) ? '' : $this->charset = $charset;
		$this->connect();
	}
	// 打开一个到 MySQL 服务器的连接
	function connect(){
		$this->linkId = @mysql_connect($this->host,$this->user,$this->pwd);
		if ($this->linkId) {
			$this->selectDb($this->db);
			mysql_query("SET NAMES $this->charset");
		}else{
			$this->error('无法连接数据库服务器',__LINE__);
			return FALSE;
		}
	}
	function selectDb($dbName){
		if (!empty($this->error)) return FALSE;
		$rs = @mysql_select_db($this->db, $this->linkId);
		if (!$rs){
			$this->error('选定数据库失败',__LINE__);
			return FALSE;
		}
	}
	// 发送一条 MySQL 查询
	function query($sql){
		$this->sql = $sql;
		$result = @mysql_query($sql, $this->linkId);
		$mysqlError = mysql_error();
		if (!empty($mysqlError)){
			$mysqlError .= '<br />(SQL: ' . $sql . ')';
			$this->error($mysqlError,__LINE__);
		}
		return $result;
	}
	// 取得结果集的总数
	function rows($query){
		$rows = @mysql_num_rows($query);
		$mysqlError = mysql_error();
		if (!empty($mysqlError)) $this->error($mysqlError,__LINE__);
		return $rows;
	}
	// 取得上一步 INSERT 操作产生的 ID 
	function insertId(){
		$insertId = @mysql_insert_id($this->linkId);
		$mysqlError = mysql_error();
		if (!empty($mysqlError)) $this->error($mysqlError,__LINE__);
		return $insertId;

	}
	// 从结果集中取得一行
	function fetchArray($query){
		$result = @mysql_fetch_array($query);
		$mysqlError = mysql_error();
		if (!empty($mysqlError)) $this->error($mysqlError,__LINE__);
		return $result;
	}
	// 获取一条记录
	function getOne($sql){
		return $this->fetchArray($this->query($sql));
	}
	// 前一次操作所影响的记录行数
	function affectedRows(){
		$aRows = @mysql_affected_rows();
		$mysqlError = mysql_error();
		if (!empty($mysqlError)) $this->error($mysqlError,__LINE__);
		return $aRows;
	}
	// 自动事务开关
	function autocommit($bool){
		if (TRUE === $bool){
			mysql_query("SET AUTOCOMMIT=1");
		}elseif(FALSE === $bool){
			mysql_query("SET AUTOCOMMIT=0");
		}
	}
	// 错误信息
	function error($msg = '',$line = 0){
		if (empty($msg)) return FALSE;
		try{
			throw new Exception($msg);
		}
		catch(Exception $e){
			//echo '<br />Message: ' .$e->getMessage();
			#$file = $e->getFile();
			#$file = pathinfo($file);
			#$file = $file['basename'];
			echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><div style="margin:10% auto 0;border:dotted 1px #F90;background-color:#F5DE38;width:400px;padding:20px;color:#C00;"><strong>错误: </strong>数据库读取出错 <strong>Line: </strong>' . $line . '<br /><strong>详细: </strong>' .$msg. '<div style="text-align:right;">管理员: <a href="http://upall.cn/" target="_blank" title="root@upall.cn">upall™</a></div></div>';
			exit;
		}
	}
	// 错误号
	function errno(){
		return mysql_errno();
	}
	// 开始事务
	function begin(){
		$this->query('START TRANSACTION');
	}
	// 回滚事务
	function rollback(){
		$this->query('ROLLBACK');
	}
	// 提交事务
	function commit(){
		$this->query('COMMIT');
	}

	// 自动添加
	function insert($tableName){
		global $_POST;

		// 处理接收到的数据
		if (isset($_POST)){
			foreach ($_POST as $k => $v){
				${$k} = escapeData($v);
			}
		}else{
			$this->error('错误(不允许添加空数据)',__LINE__);
			return FALSE;
		}

		// 生成包含数据的SQL
		$dataDb = $this->db;
		$this->db = 'information_schema';
		$this->selectDb($this->db);
		$sql = "SELECT
					COLUMN_NAME AS col
					FROM `COLUMNS`
					where table_name = '$tableName'
					AND COLUMN_NAME <> 'id'";
		$query = $this->query($sql);
		$rows = $this->rows($query);
		if (0 == $rows) {
			$this->error('不能添加数据(数据表中没有字段)');
			return FALSE;
		}
		$colArrayCol[0] = '`id`';
		$colArrayValue[0] = 'NULL';
		$index = 1;
		while($result = $this->fetchArray($query)){
			$tempVarName = ${$result['col']};
			if (!empty($tempVarName)){// 不更新无值的字段
				$colArrayCol[$index] = '`' . $result['col'] . '`'; // 表字段集
				$colArrayValue[$index] = '\'' . ${$result['col']} . '\''; // 表字段对应的数据集
			}
			$index++;
		}
		$sql  = '';
		$sql .= "INSERT INTO `$tableName` (";
		$sql .= implode(', ',$colArrayCol);
		$sql .= ') VALUES (';
		$sql .= implode(', ',$colArrayValue);
		$sql .= ')';
		
		// 执行插入
		$this->db = $dataDb;
		$this->selectDb($this->db);
		$rs = $this->query($sql);
		return TRUE;
	}
	
	// 自动更新
	function update($id, $tableName){
		global $_POST;

		// 判断记录是否存在
		$existSql = "SELECT id FROM `$tableName` WHERE id = '$id' LIMIT 1";
		$rows = $this->rows($this->query($existSql));
		if (0 == $rows) $this->error('错误(您要更新的记录不存在)',__LINE__);
		
		// 读取表结构
		$dataDb = $this->db;
		$this->db = 'information_schema';
		$this->selectDb($this->db);
		$sql = "SELECT
					COLUMN_NAME AS col
					FROM `COLUMNS`
					where table_name = '$tableName'
					AND COLUMN_NAME <> 'id'";
		$query = $this->query($sql);
		$rows = $this->rows($query);
		if (0 == $rows) {
			$this->error('不能添加数据(数据表中没有字段)',__LINE__);
			return FALSE;
		}
		
		// 生成SQL
		$colSqlArray = array();
		while ($colRs = $this->fetchArray($query)){
			foreach ($_POST as $k => $v){
				if ($k == $colRs['col']){ // 如果有需要更新的字段……
					$col = $colRs['col'];
					$v = escapeData($v);
					$colSqlArray[] = "`$col` = '$v'"; // ……则生成相应的SQL
					break;
				}
			}
		}
		if (empty($colSqlArray)){
			$this->error('没有获取到需要更新的数据',__LINE__); // POST传进了0个需要更新的字段
		}
		$sql = '';
		$sql .= "UPDATE `$tableName` SET ";
		$sql .= implode(', ',$colSqlArray);
		$sql .= " WHERE `id` = '$id' LIMIT 1 ;";

		// 执行更新
		$this->db = $dataDb;
		$this->selectDb($this->db);
		$rs = $this->query($sql);
		return TRUE;
	}
	
}
?>

<完>

暂时木有评论啊,等您坐沙发呢!

发表评论

点击返回顶部
  1. 留言
  2. 联系方式