<?php
/**
* database.class.php 数据库类
* ========================================
* @Copyright (C) 2013 GCMS
* @Author guhao
* @Date 13-4-18
* ========================================
* @Version 1.0
*/
/**
* Class database 用法
* query($sql) 执行sql语句
* create_db($db_name) 创建数据库
* get_pk($tablename) 取主键
* select($tablename,$fields="*",$where="",$order="",$limit="") 查询
* insert($tablename,$data) 插入
* update($tablename,$data,$where) 更新
* delete($tablename,$where) 单个删除
* del($tablename,$ids) 根据主键批量删除
* mysql_server() 获取MySQL服务器信息
*/
class database {
private $db_host; //数据库主机
private $db_user; //数据库用户名
private $db_pwd; //数据库用户密码
private $db_charset; //数据路编码
private $db_name; //数据库名
private $conn; //数据库连接标识
private $sql; //数据库执行语句
private $row; //返回的条目数
private $result; //执行query命令的结果资源标识
private $bulletin=true; //是否开启错误记录
private $show_error=true;//显示所有错误,默认关闭
private $is_error=false;//发现错误是否立即停止,不建议开启
/**
* 构造函数
*/
public function __construct($db_host,$db_user,$db_pwd,$conn,$db_name,$db_charset){
$this->db_host = $db_host;
$this->db_user = $db_user;
$this->db_pwd = $db_pwd;
$this->db_name = $db_name;
$this->db_charset = $db_charset;
$this->conn = $conn;
$this->connect();
$this->select_db();
$this->set_charset();
}
/**
* 数据库连接
*/
public function connect(){
//判断是否为永久连接,true为永久连接,false为非永久连接
if($this->conn=true){
$this->conn = mysql_pconnect($this->db_host,$this->db_user,$this->db_pwd);
}else{
$this->conn = mysql_connect($this->db_host,$this->db_user,$this->db_pwd);
}
}
/**
* 选择数据库
*/
public function select_db(){
if(!mysql_select_db($this->db_name,$this->conn)){
if($this->show_error){
$this->show_error('数据库不可用:',$this->db_name);
}
}
}
/**
* 数据库编码设置
*/
public function set_charset(){
$this->query("set names $this->db_charset");
}
/**
* 数据库查询语句,可执行任何sql语句
*/
public function query($sql){
if($sql == ''){
$this->show_error("SQL语句错误:","SQL语句不能为空!");
}
$this->sql=$sql;
$result=mysql_query($this->sql,$this->conn);
//如果不存在结果集进行调试
if(!$result){
//调试中使用,sql语句会自动打印出来
if($this->show_error){
$this->show_error("错误的SQL语句:","$this->sql");
}
}else{
$this->result = $result;
}
return $this->result;
}
/**
* 创建添加新的数据库
*/
public function create_db($db_name){
$db = $db_name;
$sqlDB = "create database ".$db;
$this->query($sqlDB);
}
/**
* 以数组形式返回主机所有数据库名
*/
public function arr_db(){
//列出 MySQL 服务器中所有的数据库
$rsPtr = mysql_list_dbs($this->conn);
$i=0;
//返回数据库的数目
$cot=mysql_num_rows($rsPtr);
while($i<$cot){
$rs[]=mysql_db_name($rsPtr,$i);
$i++;
}
return $rs;
}
/**
* 取得记录集,获取数组-索引和关联
*/
public function fetch_array($result){
return mysql_fetch_array($result);
}
/**
* 获取关联数组
*/
public function fetch_assoc($result){
return mysql_fetch_assoc($result);
}
/**
* 获取数字索引数组
*/
public function fetch_row($result){
return mysql_fetch_row($result);
}
/**
* 获取对象数组
*/
public function fetch_object($result){
return mysql_fetch_object($result);
}
/**
* 取主键
*/
public function get_pk($tablename){
$sql="desc $tablename";//取得表结构
$result=$this->query($sql);
$pk='';
while($row=$this->fetch_assoc($result)){
if($row['Key']=='PRI'){
$pk=$row['Field'];
break;
}
}
if($pk==''){
return false;
}else{
mysql_free_result($result);
return $pk;
}
}
/**
* 取表结构
* return array
*/
public function get_field($tablename){
$sql="desc $tablename";
$result=$this->query($sql);
$num=mysql_num_rows($result);
if($num==0){
return false;
}
$ret=array();
while($row=$this->fetch_assoc($result)){
$ret[]=$row[Fidld];
}
mysql_free_result($result);
return $ret;
}
/**
* 查询
* $sql=select *(列名列表) from 表名 where $where order by $order limit $limit
*/
public function select($tablename,$fields="*",$where="",$order="",$limit=""){
$sql="select $fields from $tablename ";
if($where!=''){
$sql.=" where $where ";
}
if($order!=''){
$sql.=" order by $order ";
}else{
$pk=$this->get_pk($tablename);
$sql.=" order by $pk desc ";
}
if($limit!=''){
$sql.=" limit $limit ";
}
$result=$this->query($sql);
$num=$this->fetch_row($result);
if($num==0){
if($this->show_error){
$this->show_error("SQL语句错误:","暂时为空,没有任何内容");
}
}
$ret=array();
while($row=$this->fetch_assoc($result)){
$ret[]=$row;
}
mysql_free_result($result);
return $ret;
}
/**
* 插入数据
* $tablename 表名
* $data 需要插入的数据
* $fields 需要插入的字段名
* $value_list 需要插入的值
* return bool
*/
public function insert($tablename,$data){
$sql="insert into $tablename ";
/*$keys=array_keys($data);
$fields=implode(',',$keys);
$sql.=" ($fields) values ";*/
$value_list='';
$fields="";
foreach($data as $key=>$value){
$fields.=",'$key'";
$value_list.=",'$value'";
}
$fields=substr($fields,1);
$value_list=substr($value_list,1);
$sql.=" ($fields) values ($value_list)";
return $this->query($sql);
}
/**
* 根据条件进行更新
* $tablename 数据库表名
* $data 需要修改的数据值
* $where 修改的条件
* return bool
*/
public function update($tablename,$data,$where){
$uplist='';
foreach($data as $key=>$value){
$uplist.=",$key='$value'";
}
$uplist=substr($uplist,1);
$sql="update $tablename set $uplist where $where";
return $this->query($sql);
}
/**
* 删除
* $tablename 数据库表名
* $where 删除数据的条件
* return bool
*/
public function delete($tablename,$where){
$sql="delete from $tablename where $where";
return $this->query($sql);
}
/**
* 根据主键批量删除
* $tablename 数据库表名
* $ids 需要删除的主键
* $del_ids 需要删除的主键组成的字符串
*/
public function del($tablename,$ids){
//取主键
$pk=$this->get_pk($tablename);
if(!is_array($ids)){
$sql="delete from $tablename where $pk=$ids";
}else{
$del_ids=implode(',',$ids);
$sql="delete from $tablename where $pk in ($del_ids)";
}
return $this->query($sql);
}
/**
* 释放结果集
*/
public function free($result){
@ mysql_free_result($result);
}
/**
* 获取用户IP地址
*/
public function getip() {
if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) {
$ip = getenv("HTTP_CLIENT_IP");
} else
if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) {
$ip = getenv("HTTP_X_FORWARDED_FOR");
} else
if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) {
$ip = getenv("REMOTE_ADDR");
} else
if (isset ($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) {
$ip = $_SERVER['REMOTE_ADDR'];
} else {
$ip = "unknown";
}
return ($ip);
}
/**
* 获取MySQL服务器信息
*/
public function mysql_server($num = '') {
switch ($num) {
case 1 :
return mysql_get_server_info(); //MySQL 服务器信息
break;
case 2 :
return mysql_get_host_info(); //取得 MySQL 主机信息
break;
case 3 :
return mysql_get_client_info(); //取得 MySQL 客户端信息
break;
case 4 :
return mysql_get_proto_info(); //取得 MySQL 协议信息
break;
default :
return mysql_get_client_info(); //默认取得mysql版本信息
}
}
/**
* 错误输出
*
*/
public function show_error($message = "", $sql = "") {
if (!$sql) {
echo "<font color='red'>" . $message . "</font>";
echo "<br />";
} else {
echo "<fieldset>";
echo "<legend>错误信息提示:</legend><br />";
echo "<div style='font-size:14px; clear:both; font-family:Verdana, Arial, Helvetica, sans-serif;'>";
echo "<div style='height:20px; background:#000000; border:1px #000000 solid'>";
echo "<font color='white'>错误号:12142</font>";
echo "</div><br />";
echo "错误原因:" . mysql_error() . "<br /><br />";
echo "<div style='height:20px; background:#FF0000; border:1px #FF0000 solid'>";
echo "<font color='white'>" . $message . "</font>";
echo "</div>";
echo "<font color='red'><pre>" . $sql . "</pre></font>";
$ip = $this->getip();
if ($this->bulletin) {
$time = date("Y-m-d H:i:s");
$message = $message . "\r\n$this->sql" . "\r\n客户IP:$ip" . "\r\n时间 :$time" . "\r\n\r\n";
$server_date = date("Y-m-d");
$filename = $server_date . ".txt";
$file_path = "error/" . $filename;
$error_content = $message;
//$error_content="错误的数据库,不可以链接";
$file = "error"; //设置文件保存目录
//建立文件夹
if (!file_exists($file)) {
if (!mkdir($file, 0777)) {
//默认的 mode 是 0777,意味着最大可能的访问权
die("upload files directory does not exist and creation failed");
}
}
//建立txt日期文件
if (!file_exists($file_path)) {
//echo "建立日期文件";
fopen($file_path, "w+");
//首先要确定文件存在并且可写
if (is_writable($file_path)) {
//使用添加模式打开$filename,文件指针将会在文件的开头
if (!$handle = fopen($file_path, 'a')) {
echo "不能打开文件 $filename";
exit;
}
//将$somecontent写入到我们打开的文件中。
if (!fwrite($handle, $error_content)) {
echo "不能写入到文件 $filename";
exit;
}
//echo "文件 $filename 写入成功";
echo "——错误记录被保存!";
//关闭文件
fclose($handle);
} else {
echo "文件 $filename 不可写";
}
} else {
//首先要确定文件存在并且可写
if (is_writable($file_path)) {
//使用添加模式打开$filename,文件指针将会在文件的开头
if (!$handle = fopen($file_path, 'a')) {
echo "不能打开文件 $filename";
exit;
}
//将$somecontent写入到我们打开的文件中。
if (!fwrite($handle, $error_content)) {
echo "不能写入到文件 $filename";
exit;
}
//echo "文件 $filename 写入成功";
echo "——错误记录被保存!";
//关闭文件
fclose($handle);
} else {
echo "文件 $filename 不可写";
}
}
}
echo "<br />";
if ($this->is_error) {
exit;
}
}
echo "</div>";
echo "</fieldset>";
echo "<br />";
}
/**
* 析构函数,自动关闭数据库,垃圾回收机制
*/
public function __destruct(){
if(!empty($this->result)){
$this->free($this->result);
}
mysql_close($this->conn);
}
/**
* 防止sql注入
*/
public function inject_check($sql_str) {
$check = eregi('select|insert|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile', $sql_str);
if ($check) {
echo "输入非法注入内容!";
exit ();
} else {
return $sql_str;
}
}
//检查来路
public function checkurl() {
if (preg_replace("/https?:\/\/([^\:\/]+).*/i", "\\1", $_SERVER['HTTP_REFERER']) !== preg_replace("/([^\:]+).*/", "\\1", $_SERVER['HTTP_HOST'])) {
header("Location: http://www.dareng.com");
exit();
}
}
}