MysqlHandler.class.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. <?php
  2. /**
  3. * 数据库操作类
  4. */
  5. class MysqlHandler {
  6. private $host; // 主机地址
  7. private $port; // 端口
  8. private $user; // 授权用户
  9. private $pwd; // 密码
  10. private $database; // 数据库名称
  11. private $db_charset; // 数据库字符集
  12. private $conn; // 数据库连接资源
  13. //构造函数,与类名同名
  14. /**
  15. * 参数$conf 是配置数组,通过配置,初始化并创建一个数据库连接
  16. */
  17. public function MysqlHandler($conf) {
  18. $this->host = $conf['host'];
  19. $this->port = $conf['port'];
  20. $this->user = $conf['user'];
  21. $this->pwd = $conf['pwd'];
  22. $this->database = $conf['db_name'];
  23. if(empty($conf['db_charset'])){
  24. $this->db_charset = 'utf8';
  25. } else {
  26. $this->db_charset = strtolower($conf['db_charset']);
  27. }
  28. $this->init_connect();
  29. $this->select_db();
  30. }
  31. /**
  32. * 初始化数据库连接 无返回值
  33. */
  34. private function init_connect() {
  35. $server = $this->host.":".$this->port;
  36. $this->conn = mysqli_connect($server, $this->user, $this->pwd,$this->database);
  37. if (mysqli_connect_errno($this->conn))
  38. {
  39. echo "连接 MySQL 失败: " . mysqli_connect_error();
  40. }
  41. }
  42. /**
  43. * 选择要访问的数据库
  44. */
  45. private function select_db() {
  46. $set_sql = "set character set ".$this->db_charset;
  47. mysqli_query($this->conn,$set_sql);
  48. $set_sql = " set names ".$this->db_charset;
  49. mysqli_query($this->conn,$set_sql);
  50. }
  51. /**
  52. * 执行查询语句。返回结果集二维数组
  53. * SELECT,SHOW,EXPLAIN 或 DESCRIBE
  54. */
  55. public function query($sql) {
  56. $rs = mysqli_query ($this->conn,$sql);
  57. //$this->save_log($sql);
  58. if(mysqli_num_rows($rs)>0) {
  59. while ($row = mysqli_fetch_array($rs, MYSQLI_ASSOC)) {
  60. $records_arr[] = $row;
  61. }
  62. return $records_arr;
  63. } else {
  64. return null;
  65. }
  66. }
  67. /**
  68. * 查询单个记录的第一列,例如
  69. * @param string $sql
  70. */
  71. public function query_first_column($sql) {
  72. if(strrpos(strtolower($sql),'union')!== false){
  73. Log::save_run_log($sql, 'hacker');
  74. }
  75. $rs = mysqli_query ($this->conn,$sql);
  76. if(mysqli_num_rows($rs)>0) {
  77. if ($row = mysqli_fetch_array($rs, MYSQL_ASSOC)) {
  78. foreach ($row as $key => $val){
  79. return $val;
  80. }
  81. return null;
  82. } else {
  83. return null;
  84. }
  85. } else {
  86. return null;
  87. }
  88. }
  89. /**
  90. * 执行数据库操作脚本语句 返回成功或失败 : TRUE OR FALSE
  91. * update
  92. */
  93. public function execute_sql($sql){
  94. return $this->exe_sql_and_log($sql);
  95. }
  96. /**
  97. * 执行插入操作返回数据id或失败 : ID OR FALSE
  98. * insert
  99. */
  100. public function insert_sql($sql){
  101. $rs = $this->exe_sql_and_log($sql);
  102. if($rs){
  103. $id = mysqli_insert_id($this->conn);
  104. return $id;
  105. }else{
  106. return false;
  107. }
  108. }
  109. /**
  110. * 返回成功或失败 : TRUE OR FALSE
  111. */
  112. private function exe_sql_and_log($sql) {
  113. $rs = mysqli_query($this->conn,$sql);
  114. $this->save_log($sql);
  115. if($rs){
  116. return true;
  117. }else{
  118. return false;
  119. }
  120. }
  121. /**
  122. * tostring 方法,查看本实例的连接参数。
  123. */
  124. public function to_string(){
  125. return "host:$this->host|port:$this->port|user:$this->user|pwd:$this->pwd|database:$this->database|chartset:$this->db_charset <br>";
  126. }
  127. public function save_log($sql){
  128. $info = mysqli_errno($this->conn) . "|$sql|" . mysqli_error($this->conn);
  129. Log::save_run_log($info, 'db');
  130. }
  131. public function close(){
  132. mysqli_close($this->conn);
  133. }
  134. }
  135. ?>