最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

php多數(shù)據(jù)庫支持的應用程序設計第2/2頁

 更新時間:2008年08月12日 12:26:47   作者:  
以前做PHP應用,多數(shù)是單數(shù)據(jù)庫數(shù)據(jù)查詢和更新,頂多也是主從數(shù)據(jù)庫的支持,實現(xiàn)起來相對簡單。主從數(shù)據(jù)庫的問題在于,當會話存儲在數(shù)據(jù)庫的時候,同步將可能出現(xiàn)問題,也就是說有可能出現(xiàn)會話的中斷。

首先以單例摸式創(chuàng)建DB類:
復制代碼 代碼如下:

<?php
if (!defined("DB_FETCH_ASSOC")) {
    define("DB_FETCH_ASSOC", 1);
}

if (!defined("DB_FETCH_ROW")) {
    define("DB_FETCH_ROW", 2);
}

if (!defined("DB_FETCH_ARRAY")) {
    define("DB_FETCH_ARRAY", 3);
}

if (!defined("DB_FETCH_DEFAULT")) {
    define("DB_FETCH_DEFAULT", DB_FETCH_ASSOC);
}
class DB {
    function DB($dsn, $db_key, $p_conn, $fetch_mode) {
        $this->dsn        = $dsn;
        $this->db_key     = $db_key;
        $this->sql        = '';
        $this->sqls       = array();
        $this->u_sqls     = array();
        $this->q_sqls     = array();
        $this->u_conn     = null;
        $this->q_conn     = null;
        $this->p_conn     = $p_conn;
        $this->fecth_mode = $fetch_mode;
        $this->query_num  = 0;
        $this->update_num = 0;
    }

    function &init(& $dsn, $db_key, $p_conn = false, $fetch_mode = DB_FETCH_DEFAULT) {
        static $db;
        $db_key = explode('.', $db_key);
        $db_key = "['" . implode("']['" , $db_key) . "']";
        eval('$flag = isset($db' . $db_key . ');');
        eval("\$db_info = \$dsn['db_info']" . $db_key . ";");
        if (!$flag) {
            $obj = new DB($db_info, $db_key, $p_conn, $fetch_mode);
            eval('$db' . $db_key . ' = $obj;');
            unset($obj);
        }
        return $db;
    }
}
$db = &DB::init($configs, 'blog.0');
print_r($db);
?>

  從上面打印結果可以看出,blog數(shù)據(jù)庫集群的第一組數(shù)據(jù)庫服務器被載入到$this->dsn中了。這個下面就是簡單的數(shù)據(jù)COPY的主從服務器,所以可以使用隨機數(shù)來指定到某一臺服務器。以下是一個簡單的隨機數(shù)實現(xiàn):
復制代碼 代碼如下:

class DB {
    //....

    function connectDB($type = "master") {
        if ($type == "master") {
            $db_host = $this->dsn["master"]["db_host"];
            $db_name = $this->dsn["master"]["db_name"];
            $db_user = $this->dsn["master"]["db_user"];
            $db_pass = $this->dsn["master"]["db_pass"];
            $this->u_conn = mysqli_connect($db_host, $db_user, $db_pass);
            $this->selectDB($db_name, $this->conn);
            if (!$this->u_conn) {
                $message = "Update DataBase Connect False : ($db_host, $db_user, ******) !";
                $this->error($message, 0);
            }
        } else {
            if (empty($_COOKIE[$_configs['cookie_prefix'] . 'db_no'])) {
                $db_no = array_rand($this->dsn["db_info"]["slave"]);
            } else {
                $db_no = $_COOKIE[$_configs['cookie_prefix'] . 'db_no'];
            }
            $db_info = $this->dsn["slave"][$db_no];
            $db_host = $db_info["db_host"];
            $db_name = $db_info["db_name"];
            $db_user = $db_info["db_user"];
            $db_pass = $db_info["db_pass"];
            $this->q_conn = mysqli_connect($db_host, $db_user, $db_pass);

            if (!$this->q_conn) {
                if (!$this->u_conn) {
                    $this->connectDB();
                }
                $this->q_conn = $this->u_conn;
                if (!$this->q_conn) {
                    $message = "Query DataBase Connect False : ($db_host, $db_user, ******) !";
                    $this->error($message, 0);
                }
            } else {
                $this->selectDB($db_name, $this->q_conn);
            }
        }
    }

    function selectDB($db_name, $conn) {
        if ($db_name != null) {
            if(! mysqli_select_db($conn, $db_name)) {
                $code = mysqli_errno($conn);
                $message = mysqli_error($conn);
                $this->error($message, $code);
            }
            return true;
        }
        return false;
    }

    function query($sql, $limit = 1, $quick = false) {
        if ($limit != null) {
            $sql = $sql . " LIMIT " . $limit;
        }
        $this->sqls[] = $sql;
        $this->q_sqls[] = $sql;
        $this->sql = $sql;

        if (empty($this->q_conn)) {
            $this->connectDB("slave");
        }
        $this->qrs = mysqli_query($this->q_conn, $sql, $quick ? MYSQLI_USE_RESULT : MYSQLI_STORE_RESULT);
        if (!$this->qrs) {
            $code = mysqli_errno($this->q_conn);
            $message = mysqli_error($this->q_conn);
            $this->error($message, $code);
        }
        $this->query_num++;
        return $this->qrs;
    }

    function update($sql) {
        $this->sql = $sql;
        $this->sqls[] = $this->sql;
        $this->u_sqls[] = $this->sql;
        if ($this->u_conn == null) {
            $this->connectDB("master");
        }

        $this->urs = mysqli_query($this->u_conn, $sql, MYSQLI_USE_RESULT);
        $this->update_num++;

        if (!$this->urs) {
            return false;
        } else {
            return true;
        }
    }
}

  至此,基本框架已經出來了,來看看調用方法: <?php
// 連接到第一組會話服務器
$db = &DB::init($configs, 'session.0');
//  執(zhí)行一次查詢
$db['session'][0]->query('SELECT ...');

//  再次連接BLOG服務器
$db = &DB::init($configs, 'blog.1');
//  執(zhí)行一次更新
$db['blog'][1]->update('UPDATE ...');

//  再次調用會話更新
$db['session'][0]->update('INSERT ...');
?>

相關文章

  • php將時間差轉換為字符串提示

    php將時間差轉換為字符串提示

    通過傳入數(shù)據(jù)庫中存儲的文章發(fā)表時的UNIX時間戳,來轉化為例如 幾分鐘前,幾小時前,幾天前 這樣的提示。如微博
    2011-09-09
  • PHP編程一定要改掉的5個不良習慣

    PHP編程一定要改掉的5個不良習慣

    在項目的每一次提交之后,我都會進行大量代碼審查,會經??吹揭恍┲貜统霈F(xiàn)的錯誤。以下這五個錯誤應該要及時糾正,這是糾正它們的方法。
    2020-09-09
  • PHP自定義函數(shù)獲取URL中一級域名的方法

    PHP自定義函數(shù)獲取URL中一級域名的方法

    這篇文章主要介紹了PHP自定義函數(shù)獲取URL中一級域名的方法,涉及字符串與數(shù)組相關操作技巧,需要的朋友可以參考下
    2016-08-08
  • PHP生成可點擊刷新的驗證碼簡單示例

    PHP生成可點擊刷新的驗證碼簡單示例

    這篇文章主要介紹了PHP生成可點擊刷新的驗證碼,結合簡單實例形式分析了php驗證碼的實現(xiàn)與調用顯示方法,涉及js動態(tài)調用驗證碼php文件的相關技巧,需要的朋友可以參考下
    2016-05-05
  • PHP實現(xiàn)的觀察者模式實例

    PHP實現(xiàn)的觀察者模式實例

    這篇文章主要介紹了PHP實現(xiàn)的觀察者模式,結合具體實例形式分析了php觀察者模式的定義與使用方法,需要的朋友可以參考下
    2017-06-06
  • PHP 采集心得技巧

    PHP 采集心得技巧

    今天給大家共享一下我的采集代碼! 思路: 采集程序的思路很簡單大體可以分為以下幾個步驟
    2009-05-05
  • PHP中使用grpc服務的教程詳解

    PHP中使用grpc服務的教程詳解

    這篇文章主要為大家詳細介紹了PHP中使用grpc服務的教程相關知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-03-03
  • php繪圖中顯示不出圖片的原因及解決

    php繪圖中顯示不出圖片的原因及解決

    php繪圖首先要確認gd庫是否啟用,到php.ini文件中,找到extension=php_gd2.dll將前面的;去掉,重新啟動服務器
    2014-03-03
  • php下正則來匹配dede模板標簽的代碼

    php下正則來匹配dede模板標簽的代碼

    用正則來匹配dede的標簽,對于以后想實現(xiàn)dedecms那樣的模板標簽的朋友與想研究dedecms模板標簽的朋友可以參考下。
    2010-08-08
  • 如何在PHP程序中防止盜鏈

    如何在PHP程序中防止盜鏈

    php下用cookes實現(xiàn)防盜鏈的效果代碼
    2008-04-04

最新評論

永春县| 松溪县| 乌兰浩特市| 沙河市| 东山县| 关岭| 万宁市| 吉安县| 杂多县| 祁阳县| 环江| 固始县| 西乡县| 时尚| 嘉兴市| 定日县| 呼玛县| 罗山县| 九寨沟县| 奈曼旗| 沙田区| 肇源县| 永吉县| 长兴县| 涿鹿县| 平阴县| 杭州市| 上虞市| 鄂尔多斯市| 蓬溪县| 夏河县| 广宗县| 通江县| 灵山县| 中方县| 肇州县| 哈密市| 通山县| 潜山县| 静宁县| 双流县|