ホームページ  >  記事  >  バックエンド開発  >  PHP ディスカッション コア クラス関数分析_PHP チュートリアル

PHP ディスカッション コア クラス関数分析_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:43:13973ブラウズ


Javaコード

/**
 * [Discuz!] (C)2001-2099 Comsenz Inc.
 * これはフリーウェアではありません。使用にはライセンス条項が適用されます
 *
 * $Id: class_core.php 6914 2010-03-26 12:52:36Z cnTeacher $
 */

///TODO は IP の禁止やアクセスの禁止など、完了すべき機能です
//TODO 禁止 IP
//TODO アクセス禁止

///DZ72 と同様に、すべてのファイルが最初にコア ファイルをロードする必要があることを確認します
定義('IN_DISCUZ', true);
/**
* コアエンジンについて説明します
*他の処理コードで使用される変数は、このコアを新規作成する前に設定しないでください。設定しないと、自動的にクリアされます
*
​*/
クラス discuz_core {

// データベース ストレージ エンジン
var $db = null;
// メモリバッファオブジェクト
var $mem = null;
// セッションオブジェクト
var $セッション = null;
// プログラム構成
var $config = 配列();
// $_G 配列マッピング
var $var = 配列();
// キャッシュされた配列をロードします
var $cachelist = 配列();
// 初期化するかどうか
var $init_setting = true //設定
; var $init_user = true //ユーザー
; var $init_session = true;//セッション
var $init_cron = true;//タスク計画
var $init_misc = true;//その他の関数
var $init_memory = true;//メモリ

// 初期化されているかどうか
var $initiated = false;
var $スーパーグローバル = 配列(
'グローバル' => 1、
'_GET' = 1、
'_POST' = 1、
'_REQUEST' = 1、
'_COOKIE' = 1,
'_SERVER' = 1、
'_ENV' = 1、
'_FILES' = 1,
);

関数&インスタンス() {
静的 $object
If(空($object)) {
$object = new discuz_core(); }
$object を返します。 }

関数 discuz_core() {
$this->_init_env(); $this->_init_config(); $this->_init_input(); $this->_init_output(); }

関数 init() {
If(!$this->開始) {
$this->_init_db(); $this->_init_memory(); $this->_init_user(); $this->_init_session(); $this->_init_setting(); $this->_init_cron(); $this->_init_misc(); }
$this->開始 = true;}

関数 _init_env() {

error_reporting(E_ALL ^ E_NOTICE); // エラー報告(E_ALL); ///php 5.3 より前では、マジック クオート マッチング (自動エスケープ) はオフになっています
If(phpversion() set_magic_quotes_runtime(0); }

/// プログラムのメイン ディレクトリはコア ファイルに基づいて決定されます。以前は -7 (インクルードの下にあることを意味します) でしたが、現在は 12 (source/class の下にあることを意味します) です。 定義('DISCUZ_ROOT', substr(dirname(__FILE__), 0, -12)); ///dz72 と同様に、マジッククオートを設定します (自動エスケープ、一重引用符と二重引用符のバックスラッシュ)
定義('MAGIC_QUOTES_GPC', function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()); ///文字コード変換関数が存在するかどうかを判定する
定義('ICONV_ENABLE', function_exists('iconv')); ///アジア文字のトランスコーディング機能は存在しますか? アジア文字の処理では mb_ で始まる文字の方が効率的であるため、最初は mb_ をトランスコーディングに使用する必要があると判断されます。 定義('MB_ENABLE', function_exists('mb_convert_encoding')); ///出力キャッシュ圧縮関数があるかどうか、この関数の目的は、ブラウザーがページ圧縮をサポートしていることを確認した後、この関数を使用してすべての出力コンテンツを圧縮することです。そうでない場合は、直接送信されます
定義('EXT_OBGZIP', function_exists('ob_gzhandler'));
///DZ72 と同じですが、現在のタイムスタンプは定数として定義されており、より効率的でグローバルを必要としません。
define('TIMESTAMP', time()); ///デフォルトのタイムゾーンを取得します
discuz_core::timezone_set();
/// function_core.php をロードします。関数は global.func.php に似ていると推定されます
If(!define('DISCUZ_CORE_FUNCTION') && !@include(DISCUZ_ROOT.'./source/function/function_core.php')) {
$this->error('function_core.php が見つかりません'); }

//ブラウザがスパイダーかどうかを判断します
define('IS_ROBOT', checkrobot());
// グローバル変数をクリーンアップします
///すべてクリーンアップされ、すべての変数がメモリから完全にログアウトされました
foreach ($GLOBALS as $key = $value) {
If (!isset($this->スーパーグローバル[$key])) {
$GLOBALS[$key] = unset($GLOBALS[$key]);                                                                          }

// グローバル変数を設定します
///前のステップと組み合わせて、必要な変数のみを残して初期化します。
これはかなり非情ですが、少し注意していれば、初期化されていない変数によってセキュリティ上の問題が発生することはありません
グローバル $_G; $_G = array(
//パブリックグローバル定義
'uid' = 0、
'ユーザー名' = '',
            '管理者' = 0,
            'groupid' = 1,
            'sid' = ',
            'formhash' = '',
            「タイムスタンプ」 = タイムスタンプ、
            'starttime' = dmicrotime(),
            'clientip' = $this->_get_client_ip(),
            「リファラー」 = ''、
            'charset' = '',
            'gzipcompress' = '',
            'authkey' = '',
            'timenow' = array(),
 
            'PHP_SELF' = '',
            'siteurl' = '',
 
            //公用全局数組定义
            'config' = array(),
            '設定' = array(),
            'メンバー' = array(),
            'グループ' = array(),
            'cookie' = array(),
            'スタイル' = array(),
            'キャッシュ' = array(),
            'セッション' = array(),
            'lang' = array(),
            'my_app' = array(),//默认应用
            'my_userapp' = array(),//用户自追加应用
 
            //论坛全局定义
            'fid' = 0,
            'tid' = 0,
            'フォーラム' = array(),
            'rssauth' = '',
 
            //全局定义
            'home' = array(),
            'space' = array(),
 
            //ポータル全局定义
            'ブロック' = array(),
            '記事' = array(),
 
            //アクション
            'アクション' = 配列(
                'アクション' = APPTYPEID、
                'fid' = 0,
                'tid' = 0,
            )
        ); 
        // 相对主目录の相对地址及び文件名
$_G['PHP_SELF'] = htmlspecialchars($_SERVER['PHP_SELF'] ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME']); //基本的なスクリプト名。各機能スクリプトのホームページの前に定義されます
//たとえば、forum.php では CURSCRIPT をフォーラムとして定義しますが、forum_forumdisplay.php はフォーラムに属しているため定義されていません
$_G['basescript'] = CURSRIPT; //サイトURL
$_G['siteurl'] = htmlspecialchars('http://'.$_SERVER['HTTP_HOST'].preg_replace("//+(api)?/*$/i", '', substr($_G[ 'PHP_SELF'], 0, strrpos($_G['PHP_SELF'], '/'))).'/');
///$_G のマッピング、つまりスーパーグローバル変数
$this->var = & $_G;
}

関数 _init_input() {

//注意 グローバル変数の挿入は禁止されています
///dz72 と同様に、GLOBALS=xxx を使用したインジェクションは禁止されています
If (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS'])) {
エラー('request_tainting')
}

If(!empty($_GET['rewrite'])) {
$query_string = '?mod='; $param =explode('-', $_GET['rewrite']); $query_string .= $_GET['mod'] = $param[0]; array_shift($param); $paramc = count($param); for($i = 0;$i $_REQUEST[$param[$i]] = $_GET[$param[$i]] = $param[$i + 1]; $query_string .= '&'.$param[$i].'='.$param[$i + 1];                                                                        $_SERVER['QUERY_STRING'] = $query_string; unset($param, $paramc, $query_string); }

// スラッシュ処理。マジッククオート処理 (自動エスケープ) がない場合は、GET/POST/COOKIE/FILES で一重引用符、二重引用符、および null バックスラッシュを手動でエスケープします
If(!MAGIC_QUOTES_GPC) {
$_GET = ダッドスラッシュ($_GET); $_POST = パパスラッシュ($_POST); $_COOKIE = パパスラッシュ($_COOKIE); $_FILES = ダッズラッシュ($_FILES); }

//Cookie 処理
///Cookieプレフィックスがconfigの設定値と一致しているか確認し、一致していれば$cookie配列の値に変換します
$prelength = strlen($this->config['cookie']['cookiepre']); foreach($_COOKIE as $key = $val) {
If(substr($key, 0, $prelength) == $this->config['cookie']['cookiepre']) {
$this->var['cookie'][substr($key, $prelength)] = $val;                                                                       }

$_GET['diy'] = empty($_GET['diy']) '' : $_GET['diy'];
///$_GET と $_POST は、インデックスと同じ名前に接頭辞 "gp_" を付けた変数に変換されます
///たとえば、$_GET['username'] は $gp_username を直接使用して
にアクセスします foreach(array_merge($_POST, $_GET) as $k = $v) {
$this->var['gp_'.$k] = $v; }

///$_GET['mod'] に基づいて m の値を決定します。$this->var はグローバル配列、gp_ は前のステートメントの追加のプレフィックスです
$this->var['mod'] = empty($this->var['gp_mod']) '' : htmlspecialchars($this->var['gp_mod']); ///ajax を使用する場合は、post 値または get と xmlhttprequest が同時に有効かどうかを判断します
$this->var['inajax'] = empty($this->var['gp_inajax']) 0 : ($_SERVER['REQUEST_METHOD'] == 'GET' && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' || $_SERVER['REQUEST_METHOD'] == 'POST'
? ///現在のページ番号
$this->var['page'] = empty($this->var['gp_page']) 1 : max(1, intval($this->var['gp_page'])); ///Cookie の SID 値を決定します
$this->var['sid'] = $this->var['cookie']['sid'] = isset($this->var['cookie']['sid']) htmlspecialchars ? ($this->var['cookie']['sid']) : ''; }

///初期化設定
関数 _init_config() {
///設定ファイルをロードする
$_config = 配列(); @include DISCUZ_ROOT.'./config/config_global.php'; If(空($_config)) {
エラー('config_notfound')
}
///キーを決定します。値が空の場合、キーはデフォルトで Cookie プレフィックスの md5 値とデータベース名になります。それ以外の場合は、設定ファイル内の値になります
///authkey キーは、sid やその他のパラメーターの暗号化と復号化に重要なパラメーターです
$_config['security']['authkey'] = empty($config['security']['authkey']) md5($_config['cookie']['cookiepre'].$_config['db' ][1]['dbname']) : ($config['security']['authkey']);
$this->config = & $_config; ///Discuz のデバッグ
If(empty($this->config['debug']) || !file_exists(libfile('function/debug'))) {
define('DISCUZ_DEBUG', false); } elseif($this->config['debug'] === 1 || $this->config['debug'] === 2 || !empty($_REQUEST['debug']) && $ _REQUEST['デバッグ'] === $this->config['デバッグ']) {
define('DISCUZ_DEBUG', true); If($this->config['debug'] == 2) {
error_reporting(E_ALL);                                                                        }

$GLOBALS['_G']['config'] = & $this->config; ///ブラウザのバージョンを参照して、キーの二次 md5 暗号化を実行します
$GLOBALS['_G']['authkey'] = md5($this->config['security']['authkey'].$_SERVER['HTTP_USER_AGENT']); }

関数 _init_output() {
///設定で xss クロスサイト スクリプティング防御モードがオンになっており、URL に「<」や「"」などの不正な文字が含まれている場合、リクエストは拒否されます
If($this->config['security']['urlxssdefend'] && !empty($_SERVER['REQUEST_URI'])) {
$temp = urldecode($_SERVER['REQUEST_URI']); If(strpos($temp, '<') !== false || strpos($temp, '"') !== false) {
error('request_tainting');                                                                          }

///ob_gzhandler が存在する場合、出力キャッシュ圧縮が有効になります
If($this->config['output']['gzip'] && EXT_OBGZIP) {
ob_start('ob_gzhandler'); setglobal('gzipcompress', true); } else {
ob_start(); setglobal('gzipcompress', false); }

///HTML ページのエンコーディングとその他のエンコーディングを決定します
If($this->config['output']['forceheader']) {
@header('Content-Type: text/html; charset='.$this->config['output']['charset']); }

setglobal('charset', $this->config['output']['charset']); define('CHARSET', $this->config['output']['charset']); }

///ロボットのアクセスを拒否します
関数拒否ロボット() {
If(IS_ROBOT) {
exit(header("HTTP/1.1 403 禁止")); }
}

///クライアント IP を取得します、
関数 _get_client_ip() {
$clientip = ''; ///環境変数 client ip に値があり、文字長が不明より大きい場合、その変数は有効であり、client ip であると判断されることを意味します
If(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
$clientip = getenv('HTTP_CLIENT_IP'); ///それ以外の場合は、現在閲覧しているユーザーのゲートウェイ IP アドレスを取得します
} elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
$clientip = getenv('HTTP_X_FORWARDED_FOR'); ///ユーザーのコンピューターの IP アドレス
} elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
$clientip = getenv('REMOTE_ADDR'); } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
$clientip = $_SERVER['REMOTE_ADDR']
}

///数字とドットで構成される 7 ~ 15 桁の文字かどうかを判断します
Preg_match("/[d.]{7,15}/", $clientip, $clientipmatches); $clientip = $clientipmatches[0] : '不明'; $clientip を返します。 }

関数 _init_db() {
///データベースオブジェクトを生成する
$this->db = & DB::object(); ///設定ファイルを読み込み、データベースに接続します
$this->db->set_config($this->config['db']); $this->db->connect(); }

関数 _init_session() {

$this->session = new discuz_session();
If($this->init_session)
                                                            ///受信 sid、クライアント IP、uid は、古いユーザーと新しいユーザーを分類するためのセッション判定メカニズムとして使用されます。 、セッションテーブルを確認するか、そうでない場合は
を作成します $this->session->init($this->var['cookie']['sid'], $this->var['clientip'], $this->var['uid' ]); $this->var['sid'] = $this->session->sid; $this->var['session'] = $this->session->var;
If($this->var['sid'] != $this->var['cookie']['sid']) {
dsetcookie('sid', $this->var['sid'], 86400);                                                                       
// 初回ログイン時に最終アクセス時刻を更新し、ユーザーの最終アクション時刻を 10 分ごとに更新します
if($this->var['uid'] && ($this->session->isnew || ($this->session->get('lastactivity') + 600)
$ this&gt; session-&gt;
$update = array('lastip' = $this->var['clientip'], 'lastactivity' = TIMESTAMP); If($this->セッション->isnew) {
$update['lastvisit'] = タイムスタンプ;                                                                                     メンバーシップステータスを更新します
DB::update('common_member_status', $update, "uid='".$this->var['uid']."'");                                                                        }
}

    function _init_user() {
 
        if($this->init_user) {
            if($auth = getglobal('auth', 'cookie')) {
                $auth = maddslashes(explode("t", authcode($auth, 'DECODE'))); 
            }
            list($discuz_pw, $discuz_uid) = 空($auth) || count($auth)  
            if($discuz_uid) {
                $user = getuserbyuid($discuz_uid); 
            }
 
            if(!empty($user) && $user['password'] == $discuz_pw) {
                $this->var['member'] = $user; 
            } その他 {
                $user = 配列(); 
                $this->_init_guest(); 
            }
 
            $this->cachelist[] = 'usergroup_'.$this->var['member']['groupid']; 
            if($user && $user['adminid'] 0 && $user['groupid'] != $user['adminid']) {
                $this->cachelist[] = 'admingroup_'.$this->var['member']['adminid']; 
            }
 
        } その他 {
            $this->_init_guest(); 
        }
 
        if(empty($this->var['cookie']['lastvisit'])) {
            $this->var['member']['lastvisit'] = TIMESTAMP - 3600; 
            dsetcookie('lastvisit', TIMESTAMP - 3600, 86400 * 30); 
        } その他 {
            $this->var['member']['lastvisit'] = empty($this->var['cookie']['lastvisit']); 
        }
 
        setglobal('uid', getglobal('uid', 'member')); 
        setglobal('ユーザー名',addslashes(getglobal('ユーザー名', 'メンバー'))); 
        setglobal('管理者', getglobal('管理者', 'メンバー')); 
        setglobal('グループid', getglobal('グループid', 'メンバー')); 
    }
 
    function _init_guest() {
        setglobal('member', array( 'uid' = 0, 'username' = '', 'groupid' = 7, 'credits' = 0, 'timeoffset' = 9999)); 
    }
 
    function _init_cron() {
        if($this->init_cron && $this->init_setting) {
            if($this->var['cache']['cronnextrun'] <= TIMESTAMP) {
                discuz_cron::run(); 
            }
        }
    }
 
    function _init_misc() {
 
        if(!$this->init_misc) {
            false を返します。 
        }
        // 调入核心语言包
        lang('コア'); 
 
        //处理全局時間区设置
        if($this->init_setting && $this->init_user) {
            if(!isset($this->var['member']['timeoffset']) || $this->var['member']['timeoffset'] == 9999 || $this->gt; var['member']['timeoffset'] === '') {
                $this->var['member']['timeoffset'] = $this->var['setting']['timeoffset']; 
            }
        }
 
        $timeoffset = $this->init_setting ? $this->var['member']['timeoffset'] : $this->var['setting']['timeoffset']; 
        $this->var['timenow'] = array(
            'time' = dgmdate(TIMESTAMP),
            'オフセット' = $timeoffset = 0 ? ($timeoffset == 0 ? '' : '+'.$timeoffset) : $timeoffset
        ); 
        $this->timezone_set($timeoffset); 
 
        $this->var['formhash'] = formhash(); 
        define('FORMHASH', $this->var['formhash']); 
 
        // 定义风格常量
        if(is_array($this->var['style'])) {
            foreach ($this->var['style'] as $key = $val) {
                $key = strtoupper($key); 
                if(!define($key) && !is_array($val)) {
                    定義($key, $val); 
                }
            }
        }
 
        //论坛开关检查
        if($this->var['setting']['**losed'] && !(in_array($this->var['mod'], array('logging', 'seccode')) || getglobal('管理者', 'メンバー') == 1)) {
            $closedreason = DB::result_first("SELECT svalue FROM ".DB::table('common_setting')." WHERE skey='closedreason'"); 
            showmessage($closedreason ? $closedreason : 'board_closed', NULL, array(), array('login' = 1)); 
        }
 
        $this->var['tpp'] = $this->var['setting']['topicperpage'] ? intval($this->var['setting']['topicperpage']) : 20; 
        $this->var['ppp'] = $this->var['setting']['postperpage'] ? intval($this->var['setting']['postperpage']) : 10; 
 
        if($this->var['setting']['nocacheheaders']) {
            @header("有効期限: -1"); 
            @header("キャッシュ制御: ストアなし、プライベート、事後チェック = 0、事前チェック = 0、最大期間 = 0"、FALSE); 
            @header("プラグマ: キャッシュなし"); 
        }
 
        $lastact = TIMESTAMP."t".htmlspecialchars(basename($this->var['PHP_SELF']))."t".htmlspecialchars($this->var['mod']); 
        dsetcookie('lastact', $lastact, 86400); 
 
    }
 
    function _init_setting() {
 
        if($this->init_setting) {
 
            if(empty($this->var['setting'])) {
                $this->cachelist[] = '設定'; 
            }
 
            if(empty($this->var['style'])) {
                $this->cachelist[] = 'style_default'; 
            }
 
            if(!isset($this->var['cache']['cronnextrun'])) {
                $this->cachelist[] = 'cronnextrun'; 
            }
        }
 
        !empty($this->cachelist) &&loadcache($this->cachelist); 
 
        if(!is_array($this->var['setting'])) {
            $this->var['設定'] = array(); 
        }
        if($this->var['member'] && $this->var['member']['adminid'] 0 && $this->var['member']['groupid'] != $this->var['member']['adminid'] && !empty($this->var['cache']['admingroup_'.$this->var['member']['adminid ']])) {
            $this->var['group'] = array_merge($this->var['group'], $this->var['cache']['admingroup_'.$this->var['メンバー']['管理者']]); 
        }
    }
 
    function _init_memory() {
        $this->mem = new discuz_memory(); 
        if($this->init_memory) {
            $this->mem->init($this->config['memory']); 
        }
        $this->var['memory'] = $this->mem->type; 
    }
 
    関数 timezone_set($timeoffset = 0) {
        if(function_exists('date_default_timezone_set')) {
            @date_default_timezone_set('Etc/GMT'.($timeoffset 0 ? '-' : '+').(abs($timeoffset))); 
        }
    }
 
    関数エラー($msg, $halt = true) {
        $this->error_log($msg); 
        $msg をエコー; 
        $halt && exit(); 
    }
 
    関数 error_log($message) {
        $time = date("Y-m-d H:i:s", TIMESTAMP); 
        $file = DISCUZ_ROOT.'./data/log/errorlog_'.date("Ym").'.txt'; 
        $message = "n#{$time}:t".str_replace(array("t", "r", "n"), " ", $message); 
        error_log($message, 3, $file); 
    }
 
}
 
/**
* MySQL クラスのサポートについて説明します
*
​*/
クラス db_mysql
{
    var $tablepre; 
    var $version = ''; 
    var $querynum = 0; 
    var $curlink; 
    var $link = array(); 
    var $config = array(); 
    var $sqldebug = array(); 
 
    関数 db_​​mysql($config = array()) {
        if(!empty($config)) {
            $this->set_config($config); 
        }
    }
 
    function set_config($config) {
        $this->config = &$config; 
        $this->tablepre = $config['1']['tablepre']; 
    }
 
    関数 connect() {
 
        if(empty($this->config) || empty($this->config[1])) {
            $this->halt('notfound_config'); 
        }
 
        foreach ($this->config as $id = $config) {
            $this->link[$id] = $this->_dbconnect(
            $config['dbhost'],
            $config['dbuser'],
            $config['dbpw']、
            $config['dbcharset'],
            $config['dbname'],
            $config['pconnect']
            ); 
        }
        $this->curlink = $this->link[1]; 
    }
 
    function _dbconnect($dbhost, $dbuser, $dbpw, $dbcharset, $dbname, $pconnect) {
        $link = null; 
        $func = empty($pconnect) ? 'mysql_connect' : 'mysql_pconnect'; 
        if(!$link = @$func($dbhost, $dbuser, $dbpw, 1)) {
            $this->halt('notconnect'); 
        } その他 {
            $this->curlink = $link; 
            if($this->version() '4.1') {
                $serverset = $dbcharset ? 'character_set_connection='.$dbcharset.'、character_set_results='.$dbcharset.'、character_set_client=binary' : ''; 
                $serverset .= $this->version() '5.0.1' ? ((empty($serverset) ? '' : ',').'sql_mode=''') : ''; 
                $serverset && mysql_query("SET $serverset", $link); 
            }
            $dbname && @mysql_select_db($dbname, $link); 
        }
        $link を返します。 
    }
 
    関数テーブル名($テーブル名) {
        $this->tablepre.$tablename を返します。 
    }
 
    関数 select_db($dbname) {
        return mysql_select_db($dbname, $this->curlink); 
    }
 
    関数 fetch_array($query, $result_type = MYSQL_ASSOC) {
        return mysql_fetch_array($query, $result_type); 
    }
 
    関数 fetch_first($sql) {
        return $this->fetch_array($this->query($sql)); 
    }
 
    関数 result_first($sql) {
        return $this->result($this->query($sql), 0); 
    }
 
    関数クエリ($sql, $type = '') {
 
        if(定義('DISCUZ_DEBUG') && DISCUZ_DEBUG) {
            $starttime = dmicrotime(); 
        }
        $func = $type == 'UNBUFFERED' && @function_exists('mysql_unbuffered_query') ? 
        'mysql_unbuffered_query' : 'mysql_query'; 
        if(!($query = $func($sql, $this->curlink))) {
            if(in_array($this->errno(), array(2006, 2013)) && substr($type, 0, 5) != 'RETRY') {
                $this->connect(); 
                return $this->query($sql, 'RETRY'.$type); 
            }
            if($type != 'SILENT' && substr($type, 5) != 'SILENT') {
                $this->halt('query_error', $sql); 
            }
        }
 
        if(定義('DISCUZ_DEBUG') && DISCUZ_DEBUG) {
            $this->sqldebug[] = array($sql,number_format((dmicrotime() - $starttime), 6), debug_backtrace()); 
        }
 
        $this->querynum++; 
        $クエリを返す; 
    }
 
    関数影響を受ける_rows() {
        return mysql_affected_rows($this->curlink); 
    }
 
    関数エラー() {
        return (($this->curlink) ? mysql_error($this->curlink) : mysql_error()); 
    }
 
    関数 errno() {
        return intval(($this->curlink) ? mysql_errno($this->curlink) : mysql_errno()); 
    }
 
    関数結果($query, $row = 0) {
        $query = @mysql_result($query, $row); 
        $クエリを返す; 
    }
 
    関数 num_rows($query) {
        $query = mysql_num_rows($query); 
        $クエリを返す; 
    }
 
    関数 num_fields($query) {
        mysql_num_fields($query) を返します; 
    }
 
    関数 free_result($query) {
        mysql_free_result($query) を返します。 
    }
 
    関数 insert_id() {
        return ($id = mysql_insert_id($this->curlink)) = 0 ? $id : $this->result($this->query("SELECT last_insert_id()"), 0); 
    }
 
    関数 fetch_row($query) {
        $query = mysql_fetch_row($query); 
        $クエリを返す; 
    }
 
    関数 fetch_fields($query) {
        mysql_fetch_field($query) を返します; 
    }
 
    関数 version() {
        if(empty($this->version)) {
            $this->version = mysql_get_server_info($this->curlink); 
        }
        $this->バージョンを返します; 
    }
 
    関数 close() {
        return mysql_close($this->curlink); 
    }
 
    関数 halt($message = '', $sql = '') {
        グローバル $_G; 
        $dberror = $this->error(); 
        $dberrno = $this->errno(); 
        $phperror = '

'; 
        foreach (debug_backtrace() as $error) {
            $error['file'] = str_replace(DISCUZ_ROOT, '', $error['file']); 
            $error['class'] = isset($error['class']) ? $error['クラス'] : ''; 
            $error['type'] = isset($error['type']) ? $error['type'] : ''; 
            $error['function'] = isset($error['function']) ? $error['関数'] : ''; 
            $phperror .= ""; 
        }
        $phperror .= '
ファイル関数
$error[ファイル]$error[行]$error[クラス]$error[type] ]$error[関数]()
'; 
        $helplink = "http://faq.comsenz.com/?type=mysql&dberrno=".rawurlencode($dberrno)."&dberror=".rawurlencode($dberror); 
        @header('Content-Type: text/html; charset='.$_G['config']['output']['charset']); 
        echo '
'。 
        error('db_error', array(
            '$message' = error('db_'.$message, array(), true),
            '$info' = $dberror ? error('db_error_message', array('$dberror' = $dberror), true) : '',
            '$sql' = $sql ? error('db_error_sql', array('$sql' = $sql), true) : '',
            '$errorno' = $dberrno ? error('db_error_no', array('$dberrno' = $dberrno), true) : '',
            '$helplink' = $helplink,
            )、 真実); 
        echo "PHP バックトレース
$phperror
"; 
        出口(); 
    }
 
}
 
/**
* プログラム呼び出しを容易にするために、Discuz CORE の DB オブジェクトのメインメソッドを二次カプセル化
*
​*/
クラス DB
{
 
    /**
* テーブル名を返します (pre_$table)
*
* @param 元のテーブル名 $table
* @return preの後に名前を追加します
​​*/
    関数テーブル($table) {
        $a = & DB::object(); 
        return $a->table_name($table); 
    }
 
    /**
     * 删除一条または多条记录
     *
     * @param string $table 原始表名
     *@pa

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。