网络编程
位置:首页>> 网络编程>> 数据库>> 操作mysql数据库的类

操作mysql数据库的类

 来源:asp之家 发布时间:2010-03-13 12:53:00 

标签:mysql,数据库,类

适用环境: PHP5.2.x / mysql 5.0.x

  1. class Mysql {

  2.     private $server = "";

  3.     private $user = "";

  4.     private $password = "";

  5.     private $database = "";

  6.     private $linkMode = 1;

  7.     private $link_id = 0;

  8.     private $query_id = 0;

  9.     private $query_times = 0;

  10.     private $result = array ();

  11.     private $fetchMode = MYSQL_ASSOC;

  12.     private $err_no = 0;

  13.     private $err_msg;

  14.     private $character;

  15.     //======================================

  16.     // 函数: mysql()

  17.     // 功能: 构造函数

  18.     // 参数: 参数类的变量定义

  19.     // 说明: 构造函数将自动连接数据库

  20.     // 如果想手动连接去掉自动连接函数

  21.     //======================================

  22.     public function __construct($server, $user, $password, $database, $character = "UTF8", $linkMode = 0) {

  23.         if (empty ( $server ) || empty ( $user ) || empty ( $database ))

  24.             $this->halt ( "提交的数据库信息不完整!请检查服务器地址,用户和数据库是否正确有效" );

  25.         

  26.         $this->server = $server;

  27.         $this->user = $user;

  28.         $this->password = $password;

  29.         $this->database = $database;

  30.         $this->linkMode = $linkMode;

  31.         $this->character = $character;

  32.         $this->connect ();

  33.     }

  34.     //======================================

  35.     // 函数: connect($server,$user,$password,$database)

  36.     // 功能: 连接数据库

  37.     // 参数: $server 主机名, $user 用户名

  38.     // 参数: $password 密码, $database 数据库名称

  39.     // 返回: 0:失败

  40.     // 说明: 默认使用类中变量的初始值

  41.     //======================================

  42.     public function connect($server = "", $user = "", $password = "", $database = "") {

  43.         $server = $server ? $server : $this->server;

  44.         $user = $user ? $user : $this->user;

  45.         $password = $password ? $password : $this->password;

  46.         $database = $database ? $database : $this->database;

  47.         

  48.         $this->link_id = $this->linkMode ? mysql_pconnect ( $server, $user, $password, $database ) : mysql_connect ( $server, $user, $password, $database );

  49.         

  50.         if (! $this->link_id) {

  51.             $this->halt ( "数据库连接失败!请检查各项参数!" );

  52.             return 0;

  53.         }

  54.         

  55.         if (! mysql_select_db ( $database, $this->link_id )) {

  56.             $this->halt ( "无法选择数据库" );

  57.             return 0;

  58.         }

  59.         

  60.         if ($this->character != "GBK" && $this->character != "UTF8") {

  61.             $this->halt ( "输入的编码模式不正确!" );

  62.             return 0;

  63.         }

  64.         

  65.         $this->query ( 'SET NAMES ' . $this->character );

  66.         return $this->link_id;

  67.     }

  68.     //======================================

  69.     // 函数: query($sql)

  70.     // 功能: 数据查询

  71.     // 参数: $sql 要查询的SQL语句

  72.     // 返回: 0:失败

  73.     //======================================

  74.     public function query($sql) {

  75.         $this->query_times ++;

  76.         $this->query_id = mysql_query ( $sql, $this->link_id );

  77.         if (! $this->query_id) {

  78.             $this->halt ( "<font color=red>" . $sql . "</font> 语句执行不成功!" );

  79.             return 0;

  80.         }

  81.         

  82.         return $this->query_id;

  83.     }

  84.     //======================================

  85.     // 函数: setFetchMode($mode)

  86.     // 功能: 设置取得记录的模式

  87.     // 参数: $mode 模式 MYSQL_ASSOC, MYSQL_NUM, MYSQL_BOTH

  88.     // 返回: 0:失败

  89.     //======================================

  90.     public function setFetchMode($mode) {

  91.         if ($mode == MYSQL_ASSOC || $mode == MYSQL_NUM || $mode == MYSQL_BOTH) {

  92.             $this->fetchMode = $mode;

  93.             return 1;

  94.         } else {

  95.             $this->halt ( "错误的模式." );

  96.             return 0;

  97.         }

  98.     }

  99.     //======================================

  100.     // 函数: fetchRow()

  101.     // 功能: 从记录集中取出一条记录

  102.     // 返回: 0: 出错 record: 一条记录

  103.     //======================================

  104.     public function fetchRow() {

  105.         $this->record = mysql_fetch_array ( $this->query_id, $this->fetchMode );

  106.         

  107.         return $this->record;

  108.     }

  109.     //======================================

  110.     // 函数: fetchAll()

  111.     // 功能: 从记录集中取出所有记录

  112.     // 返回: 记录集数组

  113.     //======================================

  114.     public function fetchAll() {

  115.         $arr [] = array ();

  116.         

  117.         while ( $this->record = mysql_fetch_array ( $this->query_id, $this->fetchMode ) )

  118.             $arr [] = $this->record;

  119.         

  120.         mysql_free_result ( $this->query_id );

  121.         return $arr;

  122.     }

  123.     //======================================

  124.     // 函数: getValue()

  125.     // 功能: 返回记录中指定字段的数据

  126.     // 参数: $field 字段名或字段索引

  127.     // 返回: 指定字段的值

  128.     //======================================

  129.     public function getValue($filed) {

  130.         return $this->record [$filed];

  131.     }

  132.     //======================================

  133.     // 函数: getquery_id()

  134.     // 功能: 返回查询号

  135.     //======================================    

  136.     public function getquery_id() {

  137.         return $this->query_id;

  138.     }

  139.     //======================================

  140.     // 函数: affectedRows()

  141.     // 功能: 返回影响的记录数

  142.     //======================================    

  143.     public function affectedRows() {

  144.         return mysql_affected_rows ( $this->link_id );

  145.     }

  146.     //======================================

  147.     // 函数: recordCount()

  148.     // 功能: 返回查询记录的总数

  149.     // 参数: 无

  150.     // 返回: 记录总数

  151.     //======================================    

  152.     public function recordCount() {

  153.         return mysql_num_rows ( $this->query_id );

  154.     }

  155.     //======================================

  156.     // 函数: getquery_times()

  157.     // 功能: 返回查询的次数

  158.     // 参数: 无

  159.     // 返回: 查询的次数

  160.     //======================================    

  161.     public function getquery_times() {

  162.         return $this->query_times;

  163.     }

  164.     //======================================

  165.     // 函数: getVersion()

  166.     // 功能: 返回mysql的版本

  167.     // 参数: 无

  168.     //======================================    

  169.     public function getVersion() {

  170.         $this->query ( "select version() as ver" );

  171.         $this->fetchRow ();

  172.         return $this->getValue ( "ver" );

  173.     }

  174.     //======================================

  175.     // 函数: getDBSize($database, $tblPrefix=null)

  176.     // 功能: 返回数据库占用空间大小

  177.     // 参数: $database 数据库名

  178.     // 参数: $tblPrefix 表的前缀,可选

  179.     //======================================    

  180.     public function getDBSize($database, $tblPrefix = null) {

  181.         $sql = "SHOW TABLE STATUS FROM " . $database;

  182.         if ($tblPrefix != null) {

  183.             $sql .= " LIKE '$tblPrefix%'";

  184.         }

  185.         $this->query ( $sql );

  186.         $size = 0;

  187.         while ( $this->fetchRow () )

  188.             $size += $this->getValue ( "Data_length" ) + $this->getValue ( "Index_length" );

  189.         return $size;

  190.     }

  191.     //======================================

  192.     // 函数: halt($err_msg)

  193.     // 功能: 处理所有出错信息

  194.     // 参数: $err_msg 自定义的出错信息

  195.     //=====================================    

  196.     public function halt($err_msg = "") {

  197.         if ($err_msg == "") {

  198.             $this->errno = mysql_errno ();

  199.             $this->error = mysql_error ();

  200.             echo "<b>mysql error:<b><br>";

  201.             echo $this->errno . ":" . $this->error . "<br>";

  202.             exit ();

  203.         } else {

  204.             echo "<b>mysql error:<b><br>";

  205.             echo $err_msg . "<br>";

  206.             exit ();

  207.         }

  208.     }

  209.     //======================================

  210.     // 函数: insertID()

  211.     // 功能: 返回最后一次插入的自增ID

  212.     // 参数: 无

  213.     //======================================    

  214.     public function insertID() {

  215.         return mysql_insert_id ();

  216.     }

  217.     //======================================

  218.     //函数:close()

  219.     //功能:关闭非永久的数据库连接

  220.     //参数:无

  221.     //======================================

  222.     public function close() {

  223.         $link_id = $link_id ? $link_id : $this->link_id;

  224.         mysql_close ( $link_id );

  225.     }

  226.     //======================================

  227.     // 函数: sqlSelect()

  228.     // 功能: 返回组合的select查询值

  229.     // 参数: $tbname 查询的表名

  230.     // 参数: $where 条件

  231.     // 参数: $fields 字段值

  232.     // 参数: $orderby 按某字段排序

  233.     // 参数: $sort 正序ASC,倒序DESC,$orderby 不为空是有效

  234.     // 参数: $limit 取得记录的条数,0,8

  235.     // 返回: 查询语句

  236.     //======================================

  237.     function sqlSelect($tbname, $where = "", $limit = 0, $fields = "*", $orderby = "", $sort = "DESC") {

  238.         $sql = "SELECT " . $fields . " FROM " . $tbname . ($where ? " WHERE " . $where : "") . ($orderby ? " ORDER BY " . $orderby . " " . $sort : "") . ($limit ? " limit " . $limit : "");

  239.         return $sql;

  240.     }

  241.     //======================================

  242.     // 函数: sqlInsert()

  243.     // 功能: Insert插入数据函数

  244.     // 参数: $taname 要插入数据的表名

  245.     // 参数: $row 要插入的内容 (数组)

  246.     // 返回: 记录总数

  247.     // 返回: 插入语句

  248.     //======================================

  249.     function sqlInsert($tbname, $row) {

  250.         foreach ( $row as $key => $value ) {

  251.             $sqlfield .= $key . ",";

  252.             $sqlvalue .= "'" . $value . "',";

  253.         }

  254.         return "INSERT INTO " . $tbname . "(" . substr ( $sqlfield, 0, - 1 ) . ") VALUES (" . substr ( $sqlvalue, 0, - 1 ) . ")";

  255.     }

  256.     //======================================

  257.     // 函数: sqlUpdate()

  258.     // 功能: Update更新数据的函数

  259.     // 参数: $taname 要插入数据的表名

  260.     // 参数: $row 要插入的内容 (数组)

  261.     // 参数: $where 要插入的内容 的条件

  262.     // 返回: Update语句

  263.     //======================================    

  264.     function sqlUpdate($tbname, $row, $where) {

  265.         foreach ( $row as $key => $value ) {

  266.             $sqlud .= $key . "= '" . $value . "',";

  267.         }

  268.         return "UPDATE " . $tbname . " SET " . substr ( $sqlud, 0, - 1 ) . " WHERE " . $where;

  269.     }

  270.     //======================================

  271.     // 函数: sqlDelete()

  272.     // 功能: 删除指定条件的行

  273.     // 参数: $taname 要插入数据的表名

  274.     // 参数: $where 要插入的内容 的条件

  275.     // 返回: DELETE语句

  276.     //======================================    

  277.     function sqlDelete($tbname, $where) {

  278.         if (! $where) {

  279.             $this->halt ( "删除函数没有指定条件!" );

  280.             return 0;

  281.         }

  282.         return "DELETE FROM " . $tbname . " WHERE " . $where;

  283.     }

  284.     

  285.     //======================================

  286.     //函数:checkSql SQL语句的过滤

  287.     //功能:过滤一些特殊语法

  288.     //参数:$db_string 查询的SQL语句

  289.     //参数:$querytype 查询的类型

  290.     //======================================

  291.     function checkSql($db_string, $querytype = 'select') {

  292.         $clean = '';

  293.         $old_pos = 0;

  294.         $pos = - 1;

  295.         

  296.         //如果是普通查询语句,直接过滤一些特殊语法

  297.         if ($querytype == 'select') {

  298.             $notallow1 = "[^0-9a-z@._-]{1,}(union|sleep|benchmark|load_file|outfile)[^0-9a-z@.-]{1,}";

  299.             

  300.             //$notallow2 = "--|/*";

  301.             if (eregi ( $notallow1, $db_string )) {

  302.                 exit ( "<font size='5' color='red'>Safe Alert: Request Error step 1 !</font>" );

  303.             }

  304.         }

  305.         

  306.         //完整的SQL检查

  307.         while ( true ) {

  308.             $pos = strpos ( $db_string, ''', $pos + 1 );

  309.             if ($pos === false) {

  310.                 break;

  311.             }

  312.             $clean .= substr ( $db_string, $old_pos, $pos - $old_pos );

  313.             while ( true ) {

  314.                 $pos1 = strpos ( $db_string, ''', $pos + 1 );

  315.                 $pos2 = strpos ( $db_string, '\', $pos + 1 );

  316.                 if ($pos1 === false) {

  317.                     break;

  318.                 } elseif ($pos2 == false || $pos2 > $pos1) {

  319.                     $pos = $pos1;

  320.                     break;

  321.                 }

  322.                 $pos = $pos2 + 1;

  323.             }

  324.             $clean .= '$s$';

  325.             $old_pos = $pos + 1;

  326.         }

  327.         $clean .= substr ( $db_string, $old_pos );

  328.         $clean = trim ( strtolower ( preg_replace ( array ('~s+~s' ), array (' ' ), $clean ) ) );

  329.         

  330.         //老版本的Mysql并不支持union,常用的程序里也不使用union,但是一些黑客使用它,所以检查它

  331.         if (strpos ( $clean, 'union' ) !== false && preg_match ( '~(^|[^a-z])union($|[^[a-z])~s', $clean ) != 0) {

  332.             $fail = true;

  333.         }


  334.         //发布版本的程序可能比较少包括--,#这样的注释,但是黑客经常使用它们

  335.         elseif (strpos ( $clean, '/*' ) > 2 || strpos ( $clean, '--' ) !== false || strpos ( $clean, '#' ) !== false) {

  336.             $fail = true;

  337.         }


  338.         //这些函数不会被使用,但是黑客会用它来操作文件,down掉数据库

  339.         elseif (strpos ( $clean, 'sleep' ) !== false && preg_match ( '~(^|[^a-z])sleep($|[^[a-z])~s', $clean ) != 0) {

  340.             $fail = true;

  341.         } elseif (strpos ( $clean, 'benchmark' ) !== false && preg_match ( '~(^|[^a-z])benchmark($|[^[a-z])~s', $clean ) != 0) {

  342.             $fail = true;

  343.         } elseif (strpos ( $clean, 'load_file' ) !== false && preg_match ( '~(^|[^a-z])load_file($|[^[a-z])~s', $clean ) != 0) {

  344.             $fail = true;

  345.         } elseif (strpos ( $clean, 'into outfile' ) !== false && preg_match ( '~(^|[^a-z])intos+outfile($|[^[a-z])~s', $clean ) != 0) {

  346.             $fail = true;

  347.         }


  348.         //老版本的MYSQL不支持子查询,我们的程序里可能也用得少,但是黑客可以使用它来查询数据库敏感信息

  349.         elseif (preg_match ( '~([^)]*?select~s', $clean ) != 0) {

  350.             $fail = true;

  351.         }

  352.         if (! empty ( $fail )) {

  353.             exit ( "<font size='5' color='red'>Safe Alert: Request Error step 2!</font>" );

  354.         } else {

  355.             return $db_string;

  356.         }

  357.     }

  358.     //======================================

  359.     //函数:析构函数

  360.     //功能:释放类,关闭非永久的数据库连接

  361.     //参数:无

  362.     //======================================

  363.     public function __destruct() {

  364.         $this->close ();

  365.     }

  366. }

  367. ?>



0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com