连接mysql 类_MySQL连接数据库的一个类

1 <?php2 class mysql{3 private $host; //主机名称

4

5 private $user; //数据库用户名

6

7 private $pass; //数据库密码

8

9 private $data; //数据库名

10

11 private $conn; //数据库连接标识符

12

13 private $sql; //SQL语句

14

15 private $code; //数据库编码

16

17 private $result; //数据结果集

18

19

20 private $errLog = true; //是否开启错误日志,默认开启

21

22 private $showErr = true; //是否显示所有的错误,具有安全隐患,默认开启23

24

25 //构造函数,进行类的初始化

26 public function __construct($host,$user,$pass,$data,$code='utf8',$conn='conn'){27 $this->host = $host;28

29 $this->user = $user;30

31 $this->pass = $pass;32

33 $this->data = $data;34

35 $this->code = $code;36

37 $this->conn = $conn;38

39

40 //对数据库进行初始化连接

41 $this->connect();42

43 }44

45

46

47

48 //连接数据库

49 public functionconnect(){50 //判断是否为永久连接

51 if($this->conn = 'pconn'){52 $this->conn = @mysql_pconnect($this->host,$this->user,$this->pass);53 }else{54 //临时连接

55 $this->conn = @mysql_connect($this->host,$this->user,$this->pass);56 }57

58 //判断是否连接成功

59 if(!$this->conn){60 $this->show_error('连接服务器失败!');61 }62

63 //选择数据库

64 $this->select_db($this->data);65

66 //设置数据库执行编码

67 $this->query('SET NAMES '.$this->code);68 }69

70

71 //选择数据库

72 public function select_db($data){73 $result = @mysql_select_db($data);74

75 //如果选择失败

76 if(!$result){77 $this->show_error('无法连接数据库'.$data);78 }79

80 //返回是否连接成功

81 return $result;82 }83

84

85 /******************************************************************86 -- 函数名:query($sql)87 -- 作 用:数据库执行语句,可执行查询添加修改删除等任何sql语句88 -- 参 数:$sql sql语句(必填)89 -- 返回值:布尔90 -- 实 例:无91 *******************************************************************/

92

93 public function query($sql){94 //判断SQL语句是否为空

95 if(empty($sql)){96 $this->show_error('SQL语句为空!');97 }98

99 //两个空格以上的用两个空格代替

100 $this->sql = preg_replace('/ {2,}/',' ',trim($sql));101

102 //结果集

103 $this->result = mysql_query($sql,$this->conn);104

105 //判断是否执行成功

106 if(!$this->result){107 $this->show_error('SQL语句有误',true);108 }109

110 //返回结果集

111 return $this->result;112 }113

114

115 /******************************************************************116 -- 函数名:create_db($data)117 -- 作 用:创建添加新的数据库118 -- 参 数:$data 数据库名称(必填)119 -- 返回值:字符串120 -- 实 例:无121 *******************************************************************/

122

123 public function create_db($data){124 $this->query('CREATE DATABASE IF NOT EXISTS `'.$data.'` ');125 }126

127

128 //查询服务器下的所有数据库

129 public functionshow_databases(){130 $result = $this->query('SHOW DATABASES');131

132 //定义数组获取结果集

133 $databases = array();134

135 while($row = mysql_fetch_assoc($result)){136 $databases[] = $row['Database'];137 }138

139 //返回数组

140 return $databases;141 }142

143 //查询数据库下所有的表

144 public function show_tables($data=''){145 //判断是否有传入数据库

146 if(!empty($data)){147 $data = ' FROM '.$data;148 }149

150 $databases = $this->query('SHOW TABLES'.$data);151

152 //定义数组获取所有的表

153 $tables = array();154

155 while($row = $this->fetch_array($databases,MYSQL_NUM)){156 $tables[] = $row[0];157 }158

159 //返回数组$tables;

160 return $tables;161

162 }163

164 /******************************************************************165 -- 函数名:get_num_rows($tableName)166 -- 作 用:获取结果集总数167 -- 参 数:$tableName 表名称168

169 -- 返回值:int170 -- 实 例:无171 *******************************************************************/

172

173 public function get_num_rows($tableName){174 //获取表所有字段

175 $fields = $this->get_fields($tableName);176

177 //拼接SQL语句

178 $sql = "SELECT COUNT('{$fields['pri']}') AS 'total' FROM `{$tableName}`";179

180 echo $sql;181

182 //执行SQL语句

183 $result = $this->query($sql);184

185 $result = $this->fetch_array($result,MYSQL_ASSOC);186

187 $total = $result['total'];188

189

190 return $total;191

192 }193

194 /******************************************************************195 -- 函数名:get_fields($tableName)196 -- 作 用:获取表的所有字段名称197 -- 参 数:$tableName 新表名(必填)198 -- 返回值:数组199 -- 实 例:无200 *******************************************************************/

201 public function get_fields($tableName){202 $sql = "DESC {$tableName}";203

204 $result = $this->query($sql);205

206 //定义数组存放所有获取到的表字段名称

207 $fields = array();208

209 while($row = $this->fetch_array($result,MYSQL_ASSOC)){210 if($row['Key'] == 'PRI'){211 $fields['pri'] = $row['Field'];212 }else{213 $fields[] = $row['Field'];214 }215 }216

217 return $fields;218

219 }220

221 /******************************************************************222 -- 函数名:insert($tableName,$data)223 -- 作 用:获取表的所有字段名称224 -- 参 数:$tableName 新表名(必填)225 $data 需要插入的字段和值的数组226 键对应的是字段227 如:$data('name'=>'zhangsan','age'=54);228 -- 返回值:布尔值229 -- 实 例:无230 *******************************************************************/

231

232 public function insert($tableName='',$data=''){233 //判断用户传递的是否是数组

234 if(!is_array($data)){235

236 $array = explode(',',$data);237

238 //定义数组存放字段名和值

239 $data = array();240

241 foreach($array as $k=>$v){242 list($key,$value) = explode('=',$v);243

244 $data[$key] = $value;245 }246 }247

248 //获取这个表的字段结构

249 $table_fields = $this->get_fields($tableName);250

251 //需要遍历数组中的值,如果对应的字段存在才插入表中

252 foreach($data as $k=>$v){253 if(in_array($k,$table_fields)){254 //拼接要插入的字段

255 $_fields .= $k.',';256

257 //拼接要插入的值

258 $_values .= "'".$v."'".',';259 }260 }261

262 //需要将插入字段右边边多余的,去除

263 $_fields = rtrim($_fields,',');264

265 //需要将插入的值右边多余的,去除

266 $_values = rtrim($_values,',');267

268 //拼装SQL语句

269 $sql = "INSERT INTO {$tableName} ({$_fields}) VALUES ($_values)";270

271 //执行SQL语句

272 $this->query($sql);273

274 //返回受影响的行数

275 return $this->affected_rows();276

277

278

279 }280

281 /******************************************************************282 -- 函数名:delete($tableName,$where)283 -- 作 用:删除指定的数据284 -- 参 数:$tableName 表名(必填)285 $where 删除条件286 -- 返回值:int 受影响的行数287 -- 实 例:无288 *******************************************************************/

289 public function delete($tableName,$where){290 //判断删除条件是否为空

291 if(empty($where)){292 $this->show_error("请指定删除条件!");293 }294

295 //拼接SQL语句

296 $sql = "DELETE FROM `{$tableName}` WHERE {$where}";297

298 //执行SQL语句

299 $this->query($sql);300

301 //返回受影响的行数

302 return $this->affected_rows();303

304

305 }306

307 /******************************************************************308 -- 函数名:update($tableName,$data,$where)309 -- 作 用:更新指定的数据310 -- 参 数:$tableName 表名(必填)311 $data 要更新的字段和值312 $where 更新的条件313 -- 返回值:int 受影响的行数314 -- 实 例:无315 *******************************************************************/

316 public function update($tableName,$data,$where){317 //判断是否有指定更新条件

318 if(empty($where)){319 $this->show_error("未指定更新条件!");320 }321

322 //判断用户传入的更新是否是数组

323 if(!is_array($data)){324

325 $array = explode(',',$data);326

327 //定义数组获取字段名称和值

328 $data = array();329

330

331 foreach($array as $v){332 list($key,$value) = explode('=',$v);333

334 //将获取到的键和值存入数组

335 $data[$key] = $value;336 }337 }338

339 //获取表的所有字段

340 $fields = $this->get_fields($tableName);341

342 //开始遍历数组,并检查数据表中是否存在该字段

343 foreach($data as $k=>$v){344 if(in_array($k,$fields)){345 $_fields .= $k."='".$v."',";346 }347 }348

349 //去掉拼接值右边多余的,号

350 $_fields = rtrim($_fields,',');351

352 //拼接SQL语句

353 $sql = "UPDATE `{$tableName}` SET {$_fields} WHERE {$where}";354

355 //执行SQL语句

356 $this->query($sql);357

358 //返回受影响的行数

359 return $this->affected_rows();360

361

362 }363

364

365 /******************************************************************366 -- 函数名:last_insert_id()367 -- 作 用:获取表中最后插入的ID号368 -- 参 数:369 -- 返回值:int370 -- 实 例:无371 *******************************************************************/

372 public functionlast_insert_id(){373 return mysql_insert_id($this->conn);374 }375

376

377 /******************************************************************378 -- 函数名:affected_rows()379 -- 作 用:返回结果集执行后受影响的行数380 -- 参 数:381 -- 返回值:布尔值382 -- 实 例:无383 *******************************************************************/

384 public functionaffected_rows() {385 return mysql_affected_rows($this->conn);386 }387

388 /******************************************************************389 -- 函数名:copy_tables($tb1,$tb2,$where)390 -- 作 用:复制表391 -- 参 数:$tb1 新表名(必填)392 $tb2 待复制表的表名(必填)393 $type 复制条件(选填) 1.表示复制结构和内容,默认 2.表示复制结构394 -- 返回值:布尔395 -- 实 例:无396 *******************************************************************/

397 public function copy_tables($table1,$table2,$type=1){398 if(empty($table1)){399 $this->show_error('请填写新表名称!');400 }401

402 if(empty($table2)){403 $this->show_error('请填写要复制的表名称!');404 }405

406 switch($type){407 case 1:

408 $sql = "CREATE TABLE `{$table1}` SELECT * FROM `{$table2}`";409

410 $this->query($sql);411

412 break;413

414 case 2:

415 $sql = "create TABLE `{$table1}` SELECT * FROM `{$table2}` WHERE 1=2";416

417 $this->query($sql);418

419 break;420

421 default:

422 $sql = "CREATE TABLE `{$table1}` SELECT * FROM `{$table2}`";423

424 $this->query($sql);425

426 break;427 }428

429 }430

431 /*****************************************************************432 --函数名:drop_table($tableName)433 --作 用:从数据库中删除某张表434 --参 数:$tableName 要删除的表名称435 --返回值:布尔436 --实 例:$DB->drop_table('user');437 *****************************************************************/

438 public function drop_table($tableName){439 $result = $this->query("DROP TABLE IF EXISTS {$tableName}");440

441 var_dump($result);442 }443

444

445 /*****************************************************************446 --函数名:select($table,$fields,$where,$order,$limit)447 --作 用:从表中查询数据,并返回结果集448 --参 数:$table 查询的表名称449 $fields 查询的字段名称450 $where 查询的字段名称451 $limit 查询多少条452 --返回值:布尔453 --实 例:$DB->drop_table('user','*','id>20','20');454 *****************************************************************/

455 public function select($table,$fields="",$where="",$order="",$limit=""){456 //获取表结构

457 $_fields = $this->get_fields($table);458

459 $fields = empty($fields) ? '*' : $fields;460

461 $where = empty($where) ? "" : "WHERE {$where}";462

463 $limit = empty($limit) ? "" : "LIMIT {$limit}";464

465 $order = empty($order) ? "ORDER BY {$_fields['pri']}" : "ORDER BY {$order}";466

467 $sql = "SELECT {$fields} FROM `{$table}` {$where} {$order} {$limit}";468

469 echo $sql;470 return $this->query($sql);471 }472

473

474 /******************************************************************475 -- 函数名:fetch_array($Table,$Condition)476 -- 作 用:根据从结果集取得的行生成关联数组477 -- 参 数:$result 结果集(选填)478 $type 数组类型,可以接受以下值:MYSQL_ASSOC,MYSQL_NUM 和 MYSQL_BOTH(选填)479 -- 返回值:布尔480 -- 实 例:$DB->Del('mydb','id=1')481 *******************************************************************/

482

483 public function fetch_array($result='',$type="MYSQL_BOTH"){484 if(empty($result)){485 $result = $this->result;486 }487

488 //如果结果集不存在

489 if(!$result){490 $this->show_error("未获取大查询结果集",true);491 }492

493 //echo $type;

494

495 return mysql_fetch_array($result,$type);496 }497

498

499 /******************************************************************500 -- 函数名:get_info($num)501 -- 作 用:取得 MySQL 服务器信息502 -- 参 数:$num 信息值(选填)503 -- 返回值:字符串504 -- 实 例:无505 *******************************************************************/

506 public function get_info($num){507 switch($num){508 //获取mysql服务器信息

509 case 1:

510 return mysql_get_server_info();511

512 break;513

514 //获取mysql主机信息

515 case 2:

516 return mysql_get_host_info();517

518 break;519

520 //获取mysql协议信息

521 case 3:

522 return mysql_get_proto_info();523

524 break;525

526 default:

527 return mysql_get_client_info();528

529 break;530 }531 }532

533

534

535 //获取客户端的真实IP地址

536 public functiongetip(){537 if($_SERVER['HTTP_X_FORWARDED_FOR']){538 return $_SERVER['HTTP_X_FORWARDED_FOR'];539 }elseif($_SERVER['HTTP_CLIENT_IP']){540 return $_SERVER['HTTP_CLIENT_IP'];541 }elseif($_SERVER['REMOTE_ADDR']){542 return $_SERVER['REMOTE_ADDR'];543 }elseif(getenv('HTTP_X_FORWARDED_FOR')){544 return getenv('HTTP_X_FORWARDED_FOR');545 }elseif(getenv('HTTP_CLIENT_IP')){546 return getenv('HTTP_CLIENT_IP');547 }elseif(getenv('REMOTE_ADDR')){548 return getenv('REMOTE_ADDR');549 }550

551 //如果没有获取到IP返回null

552 return null;553 }554

555

556 /******************************************************************557 -- 函数名:show_error($message,$sql)558 -- 作 用:输出显示错误信息559 -- 参 数:$msg 错误信息(必填)560 $sql 显示错误的SQL语句,在SQL语句错误时使用(选填)561 -- 返回值:字符串562 -- 实 例:无563 *******************************************************************/

564

565 public function show_error($msg='',$sql=false){566 $err = '['.mysql_errno().']'.mysql_error();567

568 if($sql){569 $sql = 'SQL语句:'.$this->sql;570 }571

572 //开启了错误日志记录后

573 if($this->errLog){574 //定义错误日志存放目录

575 $dirs = 'error/';576

577 //错误日志的名称

578 $fileName = date('Y-m-d').'.log';579

580 //拼接路径

581 $filePath = $dirs.$fileName;582

583 //判断路径是否存在

584 if(!is_dir($dirs)){585 $dirs = explode('/',$dirs);586

587 $temp = '';588

589 foreach($dirs as $dir){590 $temp .= $dir.'/';591

592 if(!is_dir($temp)){593 mkdir($temp,0777) or die('__无法建立目录'.$temp.',自动取消记录错误信息');594 }595 }596

597 $filePath = $temp.$fileName;598 }599

600 $text="错误事件:".$msg."\r\n错误原因:".$err."\r\n".($sql?$sql."\r\n":'')."客户端IP:".$this->getip()."\r\n记录时间:".date('Y-m-d H:i:s')."\r\n\r\n";601

602 $log='错误日志:__'.(error_log($text,3,$filePath)?'此错误信息已被自动记录到日志'.$fileName:'写入错误信息到日志失败');603

604

605 //如果有开启显示错误日志

606 if($this->showErr){607 echo '

608

609 错误信息提示610 错误事件:'.$err.'611 错误原因: '.$msg.'612 '.$sql.'613 '.$log.'614 ';615

616 //终止程序运行

617 exit();618

619 }620

621

622 }623

624 }625

626

627 //释放结果集

628 public functionfree(){629 mysql_free_result($this->result);630 }631

632 //关闭数据库连接

633 public functionclose(){634 mysql_close($this->conn);635 }636

637

638 //析构函数

639 public function__desctruct(){640 $this->free();641

642 $this->close();643 }644

645

646

647

648

649

650

651 }652

653

654 ?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值