本文章是一款比較實例的php 連接mysql數據庫的連接類,比起一般的php mysql數據庫函數要實用方法了很多,操作維護起來也很簡單,只要處理這一個文伯就KO了,實例類代碼如下:
- /*
- ?+-----------------------------------------------------------------------
- | 文件概要:php連接mysql數據庫
- | 文件名稱:mysql.class.php
- | 創建時間:2010-9-7
- +-----------------------------------------------------------------------
- */
- class mysql {
- private $server; //服務器名
- private $user; //數據庫用戶名
- private $password; //數據庫密碼
- private $database; //數據庫名
- private $link; //mysql連接標識符
- private $charset = "utf8"; //數據庫編碼,默認為utf8
- /*=====================================================
- * 方法:__construct
- * 功能:構造函數
- * 參數:$server,$user,$password,$database,$charset
- * 說明:實例化時自動連接數據庫.
- ====================================================*/
- function __construct($server, $user, $password, $database, $charset) {
- $this->server = $server;
- $this->user = $user;
- $this->password = $password;
- $this->database = $database;
- $this->charset = $charset;
- $this->connect();
- }
- /*====================================================
- * 方法:connect
- * 功能:連接數據庫
- * 參數:無
- * 說明:連接mysql服務器,連接數據庫,設置字符編碼
- ===================================================*/
- function connect() {
- $this->link = mysql_connect($this->server, $this->user, $this->password) or die($this->error("數據庫服務器連接出錯!"));
- mysql_select_db($this->database, $this->link) or die($this->error("數據庫連接出錯!"));
- mysql_query("set names '$this->charset'");
- }
- /*===================================================
- * 方法:query
- * 功能:執行sql
- * 參數:$sql
- * 說明:對傳過來的sql語句執行,并返回結果$result資源標識符
- ==================================================*/
- function query($sql) {
- $result = mysql_query($sql, $this->link);
- if (!$result) {
- $this->error($sql . "語句執行失敗!");
- return false;
- } else {
- return $result;
- }
- }
- /*===================================================
- * 方法:fetcharray
- * 功能:從結果集中取一行做為數組
- * 參數:$result資源標識符
- * 說明:需要提供sql語句執行返回的資源標識符
- ==================================================*/
- function fetcharray($result) {
- return mysql_fetch_array($result);
- }
- /*===================================================
- * 方法:fetchall
- * 功能:從結果集中取出所有記錄做為二維數組$arr
- * 參數:$result資源標識符
- * 說明:循環取所有記錄保存為$arr
- ==================================================*/
- function fetchall($result) {
- $arr[] = array ();
- while ($row = mysql_fetch_array($result)) {
- $arr[] = $row;
- }
- mysql_free_result($result);
- return $arr;
- }
- /*===================================================
- * 方法:numrows
- * 功能:統計結果集中記錄數
- * 參數:$result資源標識符
- * 說明:統計行數
- ==================================================*/
- function numrows($result) {
- return mysql_num_rows($result);
- }
- /*===================================================
- * 方法:numfields
- * 功能:統計結果集中字段數
- * 參數:$result資源標識符
- * 說明:統計字段數
- ==================================================*/
- function numfields($result) {
- return mysql_num_fields($result);
- }
- /*===================================================
- * 方法:affectedrows
- * 功能:取得前一次mysql操作所影響的記錄行數
- * 參數:無
- * 說明:取得前一次mysql操作所影響的記錄行數
- ==================================================*/
- function affectedrows() {
- return mysql_affected_rows($this->link);
- }
- /*===================================================
- * 方法:version
- * 功能:取得mysql版本
- * 參數:無
- * 說明:取得當前數據庫服務器mysql的版本
- ==================================================*/
- function version() {
- return mysql_get_server_info();
- }
- /*===================================================
- * 方法:insertid
- * 功能:取得上一步insert操作產生的id
- * 參數:無
- * 說明:取得上一步insert操作產生的自增字段id
- ==================================================*/
- function insertid() {
- return mysql_insert_id($this->link);
- }
- /*===================================================
- * 方法:checksql
- * 功能:檢查sql語句
- * 參數:sql語句
- * 說明:關閉非永久數據庫連接
- ==================================================*/
- function checksql($db_string, $querytype = 'select') {
- $clean = '';
- $old_pos = 0;
- $pos = - 1;
- //如果是普通查詢語句,直接過濾一些特殊語法
- if ($querytype == 'select') {
- $notallow1 = "[^0-9a-z@._-]{1,}(union|sleep|benchmark|load_file|outfile)[^0-9a-z@.-]{1,}";
- //$notallow2 = "--|/*";
- if (eregi ( $notallow1, $db_string )) {
- exit ( "<font size='5' color='red'>safe alert: request error step 1 !</font>" );
- }
- }
- //完整的sql檢查
- while ( true ) {
- $pos = strpos ( $db_string, ''', $pos + 1 );
- if ($pos === false) {
- break;
- }
- $clean .= substr ( $db_string, $old_pos, $pos - $old_pos );
- while ( true ) {
- $pos1 = strpos ( $db_string, ''', $pos + 1 );
- $pos2 = strpos ( $db_string, '', $pos + 1 );
- if ($pos1 === false) {
- break;
- } elseif ($pos2 == false || $pos2 > $pos1) {
- $pos = $pos1;
- break;
- }
- $pos = $pos2 + 1;
- }
- $clean .= '$s$';
- $old_pos = $pos + 1;
- }
- $clean .= substr ( $db_string, $old_pos );
- $clean = trim ( strtolower ( preg_replace ( array ('~s+~s' ), array (' ' ), $clean ) ) );
- //老版本的mysql并不支持union,常用的程序里也不使用union,但是一些黑客使用它,所以檢查它
- if (strpos ( $clean, 'union' ) !== false && preg_match ( '~(^|[^a-z])union($|[^[a-z])~s', $clean ) != 0) {
- $fail = true;
- }
- //發布版本的程序可能比較少包括--,#這樣的注釋,但是黑客經常使用它們
- elseif (strpos ( $clean, '/*' ) > 2 || strpos ( $clean, '--' ) !== false || strpos ( $clean, '#' ) !== false) {
- $fail = true;
- }
- //這些函數不會被使用,但是黑客會用它來操作文件,down掉數據庫
- elseif (strpos ( $clean, 'sleep' ) !== false && preg_match ( '~(^|[^a-z])sleep($|[^[a-z])~s', $clean ) != 0) {
- $fail = true;
- } elseif (strpos ( $clean, 'benchmark' ) !== false && preg_match ( '~(^|[^a-z])benchmark($|[^[a-z])~s', $clean ) != 0) {
- $fail = true;
- } elseif (strpos ( $clean, 'load_file' ) !== false && preg_match ( '~(^|[^a-z])load_file($|[^[a-z])~s', $clean ) != 0) {
- $fail = true;
- } elseif (strpos ( $clean, 'into outfile' ) !== false && preg_match ( '~(^|[^a-z])intos+outfile($|[^[a-z])~s', $clean ) != 0) {
- $fail = true;
- }
- //老版本的mysql不支持子查詢,我們的程序里可能也用得少,但是黑客可以使用它來查詢數據庫敏感信息
- elseif (preg_match ( '~([^)]*?select~s', $clean ) != 0) {
- $fail = true;
- }
- if (! emptyempty ( $fail )) {
- exit ( "<font size='5' color='red'>safe alert: request error step 2!</font>" );
- } else {
- return $db_string;
- }
- }
- /*===================================================
- * 方法:close
- * 功能:關閉連接
- * 參數:無
- * 說明:關閉非永久數據庫連接
- ==================================================*/
- function close() {
- mysql_close($this->link);
- }
- /*===================================================
- * 方法:error
- * 功能:提示錯誤
- * 參數:$err_msg
- * 說明:對給出的錯誤提示內容給予echo
- ==================================================*/
- function error($err_msg = "") {
- if ($err_msg == "") {
- echo "errno:" . mysql_errno . "</br>";
- echo "error:" . mysql_error . "</br>";
- } else {
- echo $err_msg;
- }
- }
- /*===================================================
- * 方法:__destruct
- * 功能:析構函數
- * 參數:無
- * 說明:釋放類,關閉連接
- ==================================================*/
- function __destruct() {
- $this->close();
- }
- }
- //數據庫連接函數
- function conn_db(){
- $link_db=new mysql(web_server,web_user,web_pwd,web_db,"utf8");//開源代碼Vevb.com
- return $link_db;
- }
新聞熱點
疑難解答