这是php爱好者站用的操作数据库的类,你看看咯
<?php
/**
* mysql数据库操作类
*
* @author Fisher
*/
class Mysql {
/**
* 保存sql执行次数
*
* @var int
*/
protected $query_num = 0;
/**
* mysql连接标识
*
* @var resource
*/
protected $link;
/**
* 当前用的数据库名
*
* @var string
*/
protected $database;
/**
* 当前用的字符集
*
* @var unknown_type
*/
protected $charset;
/**
* 当前执行的sql语句
*
* @var string
*/
public $sql;
/**
* mysql语句执行错误是否退出并显示错误
*
* @var boolean
*/
public $quit = false;
/**
* mysql语句执行错误是否显示错误信息
*
* @var boolean
*/
public $show_error = false;
/**
* 保存错误信息
*
* @var array
*/
public $errors = array();
public $ping = false;
/**
* mysql配置
*
* @var array
*/
protected $config = array(
'dbhost'=>'',
'dbuser'=>'',
'dbpw'=>'',
'dbname'=>'',
'dbcharset'=>'',
'pconnect'=>0,
'newlink'=>1,
);
/**
* 设置mysql配置
*
* @param array $config
*/
public function set_config(array $config){
$keys = array_keys($this->config);
foreach ($config as $key => $val){
if(in_array($key, $keys)){
$this->config[$key] = $val;
}
}
}
/**
* 如果没有连接,连接mysql
*
*/
private function mysql_connect(){
if(!is_resource($this->link) || get_resource_type($this->link) != 'mysql link'){
$this->connect($this->config['dbhost'], $this->config['dbuser'], $this->config['dbpw'], $this->config['dbname'], $this->config['dbcharset'], $this->config['pconnect'], $this->config['newlink']);
}
}
/**
* 连接数据库
*
* @param string $dbhost MySQL服务器地址
* @param string $dbuser 数据库用户名
* @param string $dbpw 数据库密码
* @param string $dbname 数据库名
* @param string $dbcharset 数据表字符集
* @param int $pconnect 是否为持久连接
* @param int $newlink 是否新打开连接
*/
public function connect($dbhost, $dbuser, $dbpw, $dbname='', $dbcharset='', $pconnect=0, $newlink=1) {
if($pconnect) {
if(!$this->link = @mysql_pconnect($dbhost, $dbuser, $dbpw)) {
$this->error_handle('Can not connect to MySQL server');
}
}
else {
if(!$this->link = @mysql_connect($dbhost, $dbuser, $dbpw, $newlink)) {
$this->error_handle('Can not connect to MySQL server');
}
}
if($this->version() > '4.1' && $dbcharset) {
$this->set_names($dbcharset);
}
if($this->version() > '5.0.1') {
@mysql_query("SET sql_mode=''", $this->link);
}
if($dbname) {
$this->select_db($dbname, $this->link);
}
}
public function select_db($dbname) {
$this->mysql_connect();
$this->database = $dbname;
return mysql_select_db($dbname, $this->link);
}
public function set_names($charset){
$charset = strtolower(str_replace("-", "", $charset));
$this->charset = $charset;
return $this->query("SET character_set_connection=$charset, character_set_results=$charset, character_set_client=binary", $this->link);
}
public function query($sql) {//echo $sql;
if($this->ping && !$this->ping()){
$this->close();
}
$this->mysql_connect();
$this->sql = $sql;
$start = microtime(true);
if(!($query = @mysql_query($sql, $this->link))) {
$error_str = $this->error_handle('MySQL query error', $sql);
//记录出错的sql信息
@file_put_contents(WEB_ROOT.'/log/sqlerror.txt', $error_str.date("Y-m-d H:i:s")."\n\n", FILE_APPEND);
}
if(($query_time=microtime(true)-$start) > 2){
//记录执行时间较长的sql
@file_put_contents(WEB_ROOT.'/log/sqllong.txt', $sql." ".$query_time." ".date("Y-m-d H:i:s")."\n", FILE_APPEND);
}
$this->query_num++;
return $query;
}
/**
* 返回该类的一个或全部属性
*
* @param string $name
* @return mixed
*/
public function get_vars($name=null){
$vars = get_class_vars($this);
return $name ? (isset($vars[$name]) ? $vars[$name] : null) : $vars;
}
/**
* 返回mysql执行次数
*
* @return int
*/
public function query_num(){
return $this->query_num;
}
/**
* 返回mysql连接标识
*
* @return resource
*/
public function get_link(){
return $this->link;
}
function ping(){
return mysql_ping($this->link);
}
public function affected_rows() {
$this->mysql_connect();
return mysql_affected_rows($this->link);
}
public function result($query, $row) {
$query = @mysql_result($query, $row);
return $query;
}
public function num_rows($query) {
return mysql_num_rows($query);
}
public function num_fields($query) {
return mysql_num_fields($query);
}
public function free_result($query) {
return mysql_free_result($query);
}
public function insert_id() {
return ($id = mysql_insert_id($this->link)) >= 0 ? $id : $this->result($this->query("SELECT last_insert_id()"), 0);
}
public function fetch_array($query, $result_type = MYSQL_BOTH) {
return mysql_fetch_array($query, $result_type);
}
public function fetch_assoc($query){
return mysql_fetch_assoc($query);
}
public function fetch_row($query) {
return mysql_fetch_row($query);
}
public function fetch_object($query){
return mysql_fetch_object($query);
}
public function version() {
$this->mysql_connect();
return mysql_get_server_info($this->link);
}
public function error() {
return (($this->link) ? mysql_error($this->link) : mysql_error());
}
public function errno() {
return intval(($this->link) ? mysql_errno($this->link) : mysql_errno());
}
public function close() {
if(is_resource($this->link)/* && get_resource_type($this->link) != 'mysql link'*/){
return mysql_close($this->link);
}
}
/**
* mysql错误处理
*
* @param string $message 提示信息
* @param string $sql 出错sql语句
*/
private function error_handle($message='', $sql=''){
$error_str = ($message ? $message."\n" : "").($sql ? $sql."\n" : "").$this->errno().":".$this->error()."\n";
array_push($this->errors, $error_str);
if($this->show_error){
echo $error_str;
}
if($this->quit){
exit;
}
return $error_str;
}
//expansion--------------------------------------------------------------------------------------
/**
* 返回sql数据集的总数
* @param string $sql sql语句
* @return int
*/
public function total_row($sql){
$query = $this->query($sql);
$rows = $this->num_rows($query);
$this->free_result($query);
return $rows;
}
/**
* 返回数据集的第一行数据的第一列
*
* @param string $sql sql语句
* @return mixed
*/
public function return_first($sql){
$row = $this->return_row($sql);
if(count($row))
return array_pop($row);
return null;
}
/**
* 返回数据集的第一行数据
*
* @param string $sql sql语句
* @return array
*/
public function return_row($sql){
$arr = array();
$query = $this->query($sql);
if($this->num_rows($query))
$arr = $this->fetch_assoc($query);
$this->free_result($query);
return $arr;
}
/**
* 返回包含包含所有数据行的数组
*
* @param string $sql sql语句
* @return array
*/
public function return_array($sql) {
$arr = array();
$query = $this->query($sql);
while($row = $this->fetch_assoc($query)){
$arr[] = $row;
}
$this->free_result($query);
return $arr;
}
/**
* 返回包含包含所有数据行的数组,该数组的索引是指定索引或该行第一列的值
*
* @param string $sql sql语句
* @return array
*/
public function return_array_column_as_key($sql, $column_key=null){
$arr = array();
$query = $this->query($sql);
while($row = $this->fetch_assoc($query)){
$arr[isset($column_key)?$row[$column_key]:current($row)] = $row;
}
$this->free_result($query);
return $arr;
}
/**
* 返回列名的所有值的数组
*
* @param string $sql sql语句
* @return array
*/
public function return_array_column_as_val($sql, $column){
$arr = array();
$query = $this->query($sql);
while($row = $this->fetch_assoc($query)){
$arr[] = $row[$column];
}
$this->free_result($query);
return $arr;
}
/**
* 返回指定列名为key,指定列名为val的数组
*
* @param string $sql sql语句
* @return array
*/
public function return_array_key_val($sql, $column_key, $column_val){
$arr = array();
$query = $this->query($sql);
while($row = $this->fetch_assoc($query)){
$arr[$row[$column_key]] = $row[$column_val];
}
$this->free_result($query);
return $arr;
}
/**
* 插入数据库
*
* @param string $tbName 数据表名
* @param array $values 要插入的数据,其中索引必须与数据表列名一一对应。
* @return resource|false
*/
public function insert($tbName, $values){
$sql = "INSERT INTO `{$tbName}` ( ";
$columnArr = $valArr = array();
foreach ($values as $key => $value){
$columnArr[] = "`{$key}`";
$valArr[] = is_null($values) ? 'NULL' : "'{$value}'";
}
$sql .= implode(', ', $columnArr);
$sql .= " ) VALUES ( ";
$sql .= implode(', ', $valArr);
$sql .= " )";
//echo $sql;exit;
if($this->query($sql)){
return $this->insert_id();
}
return false;
}
public function insert_data($tbName, $values){
return $this->insert($tbName, $values);
}
/**
* 更新数据
*
* @param string $tbName 数据表名
* @param array $values 要插入的数据,其中索引必须与数据表列名一一对应。
* @param string $condition 条件,不带where
* @param string|array $expansion 额外要更新的数据,如:'views = views+1'或者array('views = views+1', 'posts = post+2')
* @return resource|false
*/
public function update($tbName, $values, $condition='', $expansion=''){
$sql = "UPDATE `{$tbName}` SET ";
$sqlArr = array();
foreach ($values as $key => $value){
$sqlArr[] = "`{$key}` = '{$value}'";
}
$sql_update_col = implode(', ',$sqlArr);
$sql .= $sql_update_col;
if($expansion){
if(is_array($expansion)){
$sql .= ($sql_update_col?', ':'').implode(', ', $expansion);
}else {
$sql .= ($sql_update_col?', ':'').$expansion;
}
}
if($condition)
$sql .= " WHERE " . $condition;
//echo $sql;
return $this->query($sql);
}
public function update_data($tbName, $values, $condition='', $expansion=''){
return $this->update($tbName, $values, $condition, $expansion);
}
} ;