第一天,仔細學習了下:common.inc.php(Discuz6.1.0核心文件)01

 



  1. <?php?

  1. /*?
  2. April?18,2012?
  3. discuz二次開發學習?
  4. author:xuqin?
  5. 不能為了完成任務去做一件事,要舉一反三,融會貫通的去學習。?
  6. */?
  7. error_reporting(0);?
  8. /*?
  9. ?*?error_reporting(0);?//抑制所有的出錯信息?
  10. ?*?error_reporting(E_ALL);//顯示所有的出錯信息?
  11. ?*/?
  12. ?
  13. set_magic_quotes_runtime(0);?
  14. /*?
  15. ?*?set_magic_quotes_runtime(0);?//關閉魔法引用?
  16. ?*?set_magic_quotes_runtime(1);?//開啟魔法引用?
  17. ?*?什么事魔術引號??
  18. ?*?當打開時,所有的?'(單引號),"(雙引號),\(反斜線)和?NULL?字符都會被自動加上一個反斜線進行轉義。?
  19. ?*?這和?addslashes()?作用完全相同。?
  20. ?*?一共有三個魔術引號指令:?
  21. ?*?magic_quotes_gpc?影響到?HTTP?請求數據(GET,POST?和?COOKIE)。不能在運行時改變。在?PHP?中默認值為?on。?參見?get_magic_quotes_gpc()。?
  22. ?*?magic_quotes_runtime?如果打開的話,大部份從外部來源取得數據并返回的函數,包括從數據庫和文本文件,所返回的數據都會被反斜線轉義。該選項可在運行的時改變,在?PHP?中的默認值為?off。?參見?set_magic_quotes_runtime()?和?get_magic_quotes_runtime()。?
  23. ?*?magic_quotes_sybase?如果打開的話,將會使用單引號對單引號進行轉義而非反斜線。此選項會完全覆蓋?magic_quotes_gpc。如果同時打開兩個選項的話,單引號將會被轉義成?''。而雙引號、反斜線?和?NULL?字符將不會進行轉義。?如何取得其值參見?ini_get()。?
  24. ?*/?
  25. ?
  26. $mtime?=?explode('?',?microtime());?
  27. /*?
  28. ?*??microtime()取得Unix?時間戳和微秒數后使用explode()進行切割并存進數組變量$mtime;?
  29. ?*????eg:?
  30. ?*????echo?microtime();?//將顯示?0.29353300?1164349567?(根據時間的不同會顯示不同的數字,但格式是一樣的?
  31. ?*????$mtime[0]="0.29353300";?
  32. ?*????$mtime[1]="1164349567";?
  33. ?*/?
  34. $discuz_starttime?=?$mtime[1]?+?$mtime[0];//得到腳本開始運行的時間?
  35. ?
  36. define('SYS_DEBUG',?FALSE);//關閉debug模式?
  37. /*?
  38. ?*?編譯方式的本質區別?Debug?通常稱為調試版本,它包含調試信息,并且不作任何優化,便于程序員調試程序。Release?稱為發布版本,它往往是進行了各種優化,使得程序在代碼大小和運行速度上都是最優的,以便用戶很好地使用。?
  39. ?*/?
  40. define('IN_DISCUZ',?TRUE);//用于防止非法引用,定義一個常量表示只有DISCUZ才可以使用本腳本?
  41. define('DISCUZ_ROOT',?substr(dirname(__FILE__),?0,?-7));//定義常量DISCUZ_ROOT的值(即bbs的路徑)?
  42. define('MAGIC_QUOTES_GPC',?get_magic_quotes_gpc());//將魔術引號開啟狀態存入常量?
  43. !defined('CURSCRIPT')?&&?define('CURSCRIPT',?'');//這個寫法很特別哦!!初始化當前運行的腳本名稱為空,CURSCRIPT這個常量在很多頁面都有,意思是如果沒定義CURSCRIPT常量,?則定義CURSCRIPT為空。?
  44. ?
  45. if(PHP_VERSION?<?'4.1.0')?{//php舊版本超全局變量兼容處理,注意是引用賦值"&$"?php基礎知識哦!去復習下吧!?
  46. ????$_GET?=?&$HTTP_GET_VARS;?
  47. ????$_POST?=?&$HTTP_POST_VARS;?
  48. ????$_COOKIE?=?&$HTTP_COOKIE_VARS;?
  49. ????$_SERVER?=?&$HTTP_SERVER_VARS;?
  50. ????$_ENV?=?&$HTTP_ENV_VARS;?
  51. ????$_FILES?=?&$HTTP_POST_FILES;?
  52. }?
  53. /*?
  54. ?*??作用:當PHP版本小于4.1.0?的時候使用傳址方式獲取內置全局變量?
  55. ?*????示例:?
  56. ?*????為什么要使用傳址而不是傳值方式??
  57. ?*????要點:在變量前加?&?符號既是傳址?
  58. ?*????<?php?
  59. ?*????$a=1;?
  60. ?*????$b=$a;?
  61. ?*????$b++;?
  62. ?*????echo?"b=".$b."?a=".$a;?//顯示:b=2?a=1?可以看到?b變了,而a?卻還是沒變?
  63. ?*????
  64. ?*????echo?"<br>";?
  65. ?*????$c=1;?
  66. ?*????$d=&$c;??//注意這行??&符號?
  67. ?*????$d++;?
  68. ?*????echo?"d=".$d."?c=".$c;?//顯示:?d=2?c=2?可以看到d變了,可是c也變了?
  69. ?*?????>?
  70. ?*/?
  71. ?
  72. if?(isset($_REQUEST['GLOBALS'])?OR?isset($_FILES['GLOBALS']))?{?
  73. ????exit('Request?tainting?attempted.');?
  74. }?
  75. /*?
  76. ?*??眾所周知,當php.ini里面的register_globals=on時,各種變量都被注入代碼,例如來自?HTML?表單的請求變量。再加上?PHP?在使用變量之前是無需進行初始化的。那么就有可能導致不安全,假如有人惡意發出這么一個get請求"http://yourdomain?/unsafe.php?GLOBALS=",那么就會清除$GLOBALS變量的值而導致不安全。?
  77. ?*?
  78. ?*??register_globals是php.ini里的一個配置,這個配置影響到php如何接收傳遞過來的參數,如果你的問題是:為什么我的表單無法傳遞數據?為什么我的程序無法得到傳遞過來的變量?等等,那么你需要仔細的閱讀以下的內容。?
  79. ?*????register_globals的值可以設置為:On或者Off,我們舉一段代碼來分別描述它們的不同。?
  80. ?*????代碼:????
  81. ?*????<form?name="frmTest"?id="frmTest"?action="URL">?
  82. ?*????<input?type="text"?name="user_name"?id="user_name">?
  83. ?*????<input?type="password"?name="user_pass"?id="user_pass">?
  84. ?*????<input?type="submit"?value="login">?
  85. ?*????</form>????
  86. ?*????當register_globals=Off的時候,下一個程序接收的時候應該用$_GET['user_name']?和$_GET['user_pass']來接受傳遞過來的值。(注:當<form>的method屬性為post的時候應該用$_POST['user_name']和$_POST['user_pass'])?
  87. ?*????當register_globals=On的時候,下一個程序可以直接使用$user_name和$user_pass來接受值。?
  88. ?*????顧名思義,register_globals的意思就是注冊為全局變量,所以當On的時候,傳遞過來的值會被直接的注冊為全局變量直接使用,而Off的時候,我們需要到特定的數組里去得到它。?
  89. ?*?
  90. ?*/?
  91. ?
  92. require_once?DISCUZ_ROOT.'./include/global.func.php';//引入全局函數庫,很重要?
  93. /*?
  94. ?*??這里復習下:require;require_once();include();incdlue_once()區別?
  95. ?*?require()?
  96. ?*include()?
  97. ?*這兩一般放在代碼前面,功能除了處理失敗情況不一樣,其它都是一樣,如果包含的文件不存在時,require會停止運行發生致命錯誤提示。而include則是只顯示一警告,代碼會繼續執行。?
  98. ?*require_once()?
  99. ?*include_once()?
  100. ?*這兩一個一般放在流程控制中,除了以上錯誤處理的區別外,功能都是一樣的,跟沒有once的區別就是包含的文件已經在前包含過,第二次包含不會再被引入。?
  101. ?*/?
  102. define('IS_ROBOT',?getrobot());//定義IS_ROBOT常量,判斷瀏覽此頁面的user-agent是否為搜索引擎蜘蛛,getrobot函數見global.func.php?
  103. if(defined('NOROBOT')?&&?IS_ROBOT)?{//如果定義了此頁不能被機器人找到,但是發現訪問者是搜索引擎蜘蛛,則返回禁止信息。?
  104. ????exit(header("HTTP/1.1?403?Forbidden"));?
  105. }?
  106. ?
  107. foreach(array('_COOKIE',?'_POST',?'_GET')?as?$_request)?{//過濾提交的變量,提高安全性?
  108. ????foreach($$_request?as?$_key?=>?$_value)?{?
  109. ????????$_key{0}?!=?'_'?&&?$$_key?=?daddslashes($_value);//變量名第一個字母不能為下劃線,防止有類似偽造的"$_POST"變量產生?
  110. ????}?
  111. }?
  112. /*?
  113. ?*?addslashes()?函數在指定的預定義字符前添加反斜杠。?
  114. ?*?[單引號?(')雙引號?(")反斜杠?(\)NULL]默認情況下,PHP?指令?magic_quotes_gpc?為?on,對所有的?GET、POST?和?COOKIE?數據自動運行?addslashes()。不要對已經被?magic_quotes_gpc?轉義過的字符串使用?addslashes(),因為這樣會導致雙層轉義。遇到這種情況時可以使用函數?get_magic_quotes_gpc()?進行檢測。?
  115. ?*?stripcslashes()?函數?刪除?由?addcslashes()?函數添加的反斜杠。(也可刪除服務器開啟magic_quotes_gpc后自動添加上的反斜杠)?
  116. ?*/?
  117. ?
  118. if?(!MAGIC_QUOTES_GPC?&&?$_FILES)?{//轉義$_FILES變量,注意這里先要判斷MAGIC_QUOTES_GPC常量的狀態,如果是關閉的才進行轉義,否則會造成多次轉義?
  119. ????$_FILES?=?daddslashes($_FILES);?
  120. }?
  121. ?
  122. $charset?=?$dbcharset?=?$forumfounders?=?$metakeywords?=?$extrahead?=?$seodescription?=?'';?
  123. //全局變量初始化:初始化文件字符集,數據庫字符集,版塊創建者,SEO的論壇關鍵字、描述,頭部其他信息等變量?
  124. $plugins?=?$hooks?=?$admincp?=?$jsmenu?=?$forum?=?$thread?=?$language?=?$actioncode?=?$modactioncode?=?$lang?=?array();?
  125. /*?
  126. ?*?初始化插件,鉤子,后臺管理,js彈出菜單,版塊,帖子,語言,動作代碼,系統提示信息等數組?
  127. ?*?[鉤子]實際上是一個處理消息的程序段,通過系統調用,把它掛入系統。每當特定的消息發出,在沒有到達前臺目的窗口前,鉤子程序就先捕獲該消息,亦即鉤子函數先得到控制權。這時鉤子函數即可以加工處理(改變)該消息,也可以不作處理而繼續傳遞該消息,還可以強制結束消息的傳遞。?
  128. ?*/?
  129. require_once?DISCUZ_ROOT.'./config.inc.php';//引入系統配置文件,內含如數據庫連接信息、cookie域、UC信息等?
  130. ?
  131. $_DCOOKIE?=?$_DSESSION?=?$_DCACHE?=?$_DPLUGIN?=?$advlist?=?array();//初始化cookie,session,緩存,插件,廣告列表等數組?
  132. ?
  133. $prelength?=?strlen($cookiepre);//定義(獲取)COOKIE前綴長度$prelength為$cookiepre的長度(見config.inc)?
  134. ?
  135. foreach($_COOKIE?as?$key?=>?$val)?{?
  136. ????if(substr($key,?0,?$prelength)?==?$cookiepre)?{?
  137. ????????$_DCOOKIE[(substr($key,?$prelength))]?=?MAGIC_QUOTES_GPC???$val?:?daddslashes($val);?
  138. ????}?
  139. }?
  140. /*?
  141. ?*?從瀏覽器$_COOKIE得到$_DCOOKIE數組:如果cookie的前綴與系統配置的cookie前綴相同,則填入各cookie的值?
  142. ????????這里$_DCOOKIE各變量的名稱是不包含前綴的(例如$_COOKIE['tmp_cook1']變成了$_DCOOKIE['cook1']),同時對值進行轉義?
  143. ?*/?
  144. unset($prelength,?$_request,?$_key,?$_value);?
  145. /*?
  146. ?*?上面對COOKIE遍歷完成后,便立即銷毀$prelength等相關變量。?
  147. ?*?清空一些無用變量,如臨時的$_POST、$_GET等(因為已經在本文件前面處理中得到了很多的單獨變量)?
  148. ?*/?
  149. $inajax?=?!emptyempty($inajax);//先定義一個備用的變量吧,與ajax有關嗎??
  150. $timestamp?=?time();//獲得一個當前的時間戳變量,如:1334714617,與前面到microtime不同,time()只會得到毫秒數?
  151. ?
  152. if($attackevasive?&&?CURSCRIPT?!=?'seccode')?{?
  153. ????require_once?DISCUZ_ROOT.'./include/security.inc.php';//防御文件,根據$attackevasive設定的不同級別做相應處理。?
  154. }?
  155. /*?
  156. ?*?是否啟用攻擊防御。$attackevasive默認為0,關閉論壇防御。如果配置文件config.inc定義了論壇防御級別,且當前腳本文件名不是seccode(驗證碼?),則引入相關防御的文件?
  157. ?*/?
  158. ?
  159. require_once?DISCUZ_ROOT.'./include/db_'.$database.'.class.php';//引入數據庫處理類?
  160. ?
  161. $PHP_SELF?=?$_SERVER['PHP_SELF']???$_SERVER['PHP_SELF']?:?$_SERVER['SCRIPT_NAME'];//獲得當前執行腳本的文件相對路徑?
  162. $BASESCRIPT?=?basename($PHP_SELF);//返回路徑的文件名部分?
  163. $boardurl?=?htmlspecialchars('http://'.$_SERVER['HTTP_HOST'].preg_replace("/\/+(api|archiver|wap)?\/*$/i",?'',?substr($PHP_SELF,?0,?strrpos($PHP_SELF,?'/'))).'/');?
  164. /*?
  165. ?*?取當前url?返回bbs的url(htmlspecialchars將特殊字符”<>“等轉換為”&lt?$gt“等)仔細看下substrstrpos那段,看這樣是什么效果?
  166. ?*?strrpos()?函數查找字符串在另一個字符串中最后一次出現的位置?
  167. ?*?preg_replace()?執行一個正則表達式的搜索和替換?
  168. ?*/?
  169. ?
  170. if(getenv('HTTP_CLIENT_IP')?&&?strcasecmp(getenv('HTTP_CLIENT_IP'),?'unknown'))?{?
  171. ????$onlineip?=?getenv('HTTP_CLIENT_IP');?
  172. }?elseif(getenv('HTTP_X_FORWARDED_FOR')?&&?strcasecmp(getenv('HTTP_X_FORWARDED_FOR'),?'unknown'))?{?
  173. ????$onlineip?=?getenv('HTTP_X_FORWARDED_FOR');?
  174. }?elseif(getenv('REMOTE_ADDR')?&&?strcasecmp(getenv('REMOTE_ADDR'),?'unknown'))?{?
  175. ????$onlineip?=?getenv('REMOTE_ADDR');?
  176. }?elseif(isset($_SERVER['REMOTE_ADDR'])?&&?$_SERVER['REMOTE_ADDR']?&&?strcasecmp($_SERVER['REMOTE_ADDR'],?'unknown'))?{?
  177. ????$onlineip?=?$_SERVER['REMOTE_ADDR'];?
  178. }?
  179. /*?
  180. ?*?獲得用戶到ip地址,存入$onlineip變量?
  181. ?*?注意PHP三個獲取ip的系統變量。?
  182. ?*?HTTP_CLIENT_IP?是tcp/ip協議里得到的ip地址,apache收到請求并返回就是要返回到這個ip去。?
  183. ?*?HTTP_X_FORWARDED_FOR?要想透過代理服務器取得客戶端的真實?IP?地址。?
  184. ?*?REMOTE_ADDR?取得客戶端的?IP地址,如果客戶端是使用代理服務器來訪問,那取到的就是代理服務器的IP地址。?
  185. ?*/?
  186. ?
  187. preg_match("/[\d\.]{7,15}/",?$onlineip,?$onlineipmatches);//使用正則匹配函數得到符合格式的ip地址,看看ip是不是點分段,7-15個數字之間?
  188. $onlineip?=?$onlineipmatches[0]???$onlineipmatches[0]?:?'unknown';//如果上面獲取到符合ip格式的ip就賦值給$onlineip?
  189. unset($onlineipmatches);//立即清空?IP檢查變量,方便下次處理?
  190. ?
  191. $cachelost?=?(@include?DISCUZ_ROOT.'./forumdata/cache/cache_settings.php')???''?:?'settings';?
  192. @extract($_DCACHE['settings']);?
  193. /*?
  194. ?*?讀取論壇設置的緩存文件cache_settings.php?
  195. ?*?如果能夠正常讀到,cachelost為空,既沒有lost(丟失),這一步得到$_DCACHE['settings']數組(很重要,很多變量以后都要用到)?
  196. ?*?這一段是獲得./forumdata/cache/cache_settings.php(即緩存下的設置數組,并展開,方便以后的寫法)?
  197. ?*?將setting數組變量導入符號表,成為獨立變量的形式,前面循環$$_key?=?$value處理$_POST等也是這個原理吧?
  198. ?*/?
  199. ?
  200. if($gzipcompress?&&?function_exists('ob_gzhandler')?&&?!in_array(CURSCRIPT,?array('attachment',?'wap'))?&&?!$inajax)?{?
  201. ????ob_start('ob_gzhandler');?
  202. }?else?{?
  203. ????$gzipcompress?=?0;?
  204. ????ob_start();//輸出緩存(開啟輸出緩沖)?
  205. }?
  206. /*?
  207. ?*?$gzipcompress(是否啟用gzip)此變量來自@extract($_DCACHE['settings'])?
  208. ?*?檢查gzip是不是打開了,打開就用ob_gzhandler,沒有就用ob_start。?
  209. ?*?如果開啟了gzip壓縮,并且ob_gzhandler函數存在,并且當前腳本不是附件和wap,并且不是ajax,則開始使用ob_gzhandler壓縮,否則只進行輸出緩存而不壓縮?
  210. ?*/?
  211. ?
  212. if(!emptyempty($loadctrl)?&&?substr(PHP_OS,?0,?3)?!=?'WIN')?{?
  213. ????if($fp?=?@fopen('/proc/loadavg',?'r'))?{?
  214. ????????list($loadaverage)?=?explode('?',?fread($fp,?6));?
  215. ????????fclose($fp);?
  216. ????????if($loadaverage?>?$loadctrl)?{?
  217. ????????????header("HTTP/1.0?503?Service?Unavailable");?
  218. ????????????include?DISCUZ_ROOT.'./include/serverbusy.htm';?
  219. ????????????exit();?
  220. ????????}?
  221. ????}?
  222. }?
  223. /*?
  224. ?*?此段為在linux平臺下處理負載平衡?
  225. ?*?對于非win平臺,進行服務器負載判斷并進行操作。$loadctrl為負載臨界值。?
  226. ?*/?
  227. ?
  228. if(in_array(CURSCRIPT,?array('index',?'forumdisplay',?'viewthread',?'post',?'topicadmin',?'register',?'archiver')))?{?
  229. ????$cachelost?.=?(@include?DISCUZ_ROOT.'./forumdata/cache/cache_'.CURSCRIPT.'.php')???''?:?'?'.CURSCRIPT;?
  230. }?
  231. /*?
  232. ?*?繼續判斷當前dz緩存存在的狀況,看看index,?forumdisplay,?viewthread這些文件是不是緩存了,有的話把它裝到$cachelost這個變量中。?
  233. ?*?對不同的腳本頁面,引入不同的緩存文件?
  234. ?*/?
  235. ?
  236. $db?=?new?dbstuff;?
  237. $db->connect($dbhost,?$dbuser,?$dbpw,?$dbname,?$pconnect,?true,?$dbcharset);?
  238. $dbuser?=?$dbpw?=?$dbname?=?$pconnect?=?NULL;?
  239. /*?
  240. ?*?這里是初始化一個dbstull類的實例,也就是說前面的require_once?DISCUZ_ROOT.'./include/db_'.$database.'.class.php';在這里用上了?
  241. ?*?然后連接數據庫并清理相關變量。由此可見DZ的安全性考慮真是牛到不行了。小氣鬼!?呵呵!?
  242. ?*/?
  243. ?
  244. $sid?=?daddslashes(($transsidstatus?||?CURSCRIPT?==?'wap')?&&?(isset($_GET['sid'])?||?isset($_POST['sid']))???
  245. ????(isset($_GET['sid'])???$_GET['sid']?:?$_POST['sid'])?:?
  246. ????(isset($_DCOOKIE['sid'])???$_DCOOKIE['sid']?:?''));?
  247. /*?
  248. ?*?這里是個很長的三元運算符哦!對自定義的回話標識符進行過濾?
  249. ?*?開啟sid后,即使禁用cookie也可以登陸論壇$transsidstatus也是extract($_DCACHE['setting'])得到的,所以,熟悉cache_setting里面的變量才不會經常一頭霧水?
  250. ?*?如果開啟了$sid且是wap,且從GET或POST傳遞來$sid,則從GET或者POST中取得,否則從cookie取得?
  251. ?*/?
  252. ?
  253. $discuz_auth_key?=?md5($_DCACHE['settings']['authkey'].$_SERVER['HTTP_USER_AGENT']);?
  254. /*?定義驗證字符串,驗證鑰匙。'authkey'?=>?'0ee545SPQKK3jOP2'也是extract($_DCACHE['setting'])定義的。?
  255. ?*?$_SERVER["HTTP_USER_AGENT"]獲取客戶端瀏覽器的型號,這個不是一定準確的,是可以隨意偽造的?
  256. ?*/?
  257. ?
  258. list($discuz_pw,?$discuz_secques,?$discuz_uid)?=?emptyempty($_DCOOKIE['auth'])???array('',?'',?0)?:?daddslashes(explode("\t",?authcode($_DCOOKIE['auth'],?'DECODE')),?1);?
  259. /*?
  260. ?*?初始化變量:密碼,安全問題,用戶id,如果$_DCOOKIE['auth']為空,則初始化他們,否則解碼并讀取相應變量。?
  261. ?*?對常用變量進行賦值。$discuz_secques為用戶按安全驗證回答的哈希值。authcode()根據$authkey對輸入參數進行加密解密的操作。?
  262. ?*?這一段是用來檢查是不是$_DCOOKIE[‘auth’]存在,如果有的話就把其中存放的東西分別給$discuz_pw,?$discuz_secques,?$discuz_uid這三個變量,分別對應密碼,提示問題和uid。?
  263. ?*/?
  264. ?
  265. $newpm?=?$newpmexists?=?$sessionexists?=?$seccode?=?0;//初始化用戶的新消息,安全問題,驗證碼等變量?
  266. ?
  267. $membertablefields?=?'m.uid?AS?discuz_uid,?m.username?AS?discuz_user,?m.password?AS?discuz_pw,?m.secques?AS?discuz_secques,?
  268. ????m.adminid,?m.groupid,?m.groupexpiry,?m.extgroupids,?m.email,?m.timeoffset,?m.tpp,?m.ppp,?m.posts,?m.digestposts,?
  269. ????m.oltime,?m.pageviews,?m.credits,?m.extcredits1,?m.extcredits2,?m.extcredits3,?m.extcredits4,?m.extcredits5,?
  270. ????m.extcredits6,?m.extcredits7,?m.extcredits8,?m.timeformat,?m.dateformat,?m.pmsound,?m.sigstatus,?m.invisible,?
  271. ????m.lastvisit,?m.lastactivity,?m.lastpost,?m.newpm,?m.accessmasks,?m.editormode,?m.customshow,?m.customaddfeed';?
  272. /*?
  273. ?*?將用戶表中所有需要讀取的字段放在一個字符串中,便于后面的sql語句調用?
  274. ?*/?
  275. ?
  276. if($sid)?{//如果變量$sid存在?
  277. ????if($discuz_uid)?{//如果cookie中有用戶uid,則根據uid在數據庫session表、member表中查詢取出相關字段值?
  278. ????????$query?=?$db->query("SELECT?s.sid,?s.styleid,?s.groupid='6'?AS?ipbanned,?s.pageviews?AS?spageviews,?s.lastolupdate,?s.seccode,?$membertablefields?
  279. ????????????FROM?{$tablepre}sessions?s,?{$tablepre}members?m?
  280. ????????????WHERE?m.uid=s.uid?AND?s.sid='$sid'?AND?CONCAT_WS('.',s.ip1,s.ip2,s.ip3,s.ip4)='$onlineip'?AND?m.uid='$discuz_uid'?
  281. ????????????AND?m.password='$discuz_pw'?AND?m.secques='$discuz_secques'");?
  282. ????}?else?{//如果cookie中沒有用戶uid,則僅僅從session表中取出相關信息?
  283. ????????$query?=?$db->query("SELECT?sid,?uid?AS?sessionuid,?groupid,?groupid='6'?AS?ipbanned,?pageviews?AS?spageviews,?styleid,?lastolupdate,?seccode?
  284. ????????????FROM?{$tablepre}sessions?WHERE?sid='$sid'?AND?CONCAT_WS('.',ip1,ip2,ip3,ip4)='$onlineip'");?
  285. ????}?
  286. ????/*?
  287. ?????*?groupid='6':IP?Banned?被禁止的ip?
  288. ?????*?MySQL的幾個實用字符串函數?:?
  289. ?????*?concat()可以連接一個或者多個字符串,但是在連接字符串的時候,只要其中一個是NULL,那么將返回NULL?
  290. ?????*?concat_ws()表示concat?with?separator,即有分隔符的字符串連接,在執行的時候,不會因為NULL值而返回NULL?
  291. ?????*?group_concat()可用來行轉列,?
  292. ?????*?repeat()用來復制字符串,如select?repeat('ab',2);'ab'表示要復制的字符串,2表示復制的份數?
  293. ?????*/?
  294. ?
  295. ?????>?

?





? ? ? 本文轉自許琴 51CTO博客,原文鏈接:http://blog.51cto.com/xuqin/882308,如需轉載請自行聯系原作者




本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256938.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256938.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256938.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

acdream 1023 xor按位思考

思路&#xff1a;記答案為ans&#xff0c;統計出數列A和B在某二進制某一位上有多少個1&#xff0c;如果個數相同&#xff0c;則ans那一位上為0&#xff08;因為題目要求最小的滿足條件的值&#xff09;&#xff0c;如果不一樣&#xff08;則需要考慮那一位上異或個1&#xff09…

system的相關用法

system()—執行shell命令也就是向dos發送一條指令。 相關函數&#xff1a;fork, execve, waitpid, popen頭文件&#xff1a;#include <stdlib.h>定義函數&#xff1a;int system(const char * string); system("pause")可以實現凍結屏幕&#xff0c;便于觀察…

學習筆記(33):Python網絡編程并發編程-進程池線程池

立即學習:https://edu.csdn.net/course/play/24458/296451?utm_sourceblogtoedu 進程池與線程池&#xff1a; 一般應用在網站上&#xff0c;進程池或線程池最大的數量一般需要盡可能地大但是不要超出服務器的承載范圍 1.進程池&#xff1a; 1)concurrent.futures.ProcessP…

gulp配置實現修改js、css、html自動刷新

寫在前面&#xff1a; 本配置支持es6、less、react 1.首先 給出初始的目錄結構 給出執行gulp后的目錄結構 給出執行gulp --p后的目錄結構 2.package.json里是一個寫入。文件描述了npm包的相關配置信息&#xff08;作者、簡介、包依賴等&#xff09;和所需模塊。 {"name&qu…

作為程序員之正則表達式

目錄 正則表達式基礎語法標準字符集合自定義的字符集合多行、單行模式高級語法選擇符和分組反向引用預搜索/零寬斷言例子匹配郵箱正則表達式 基礎語法 標準字符集合 \D 和[^\d]意思一樣&#xff0c;就是與 \d 相反 REG意義\ddigital表示 0 到 9 之間任意的一個數字\wworld表示任…

javascript 的dateObj.getTime() 在為C#的獲取方式

publicstringGetTime() { Int64 retval 0; DateTime st newDateTime(1970, 1, 1); TimeSpan t (DateTime.Now.ToUniversalTime() -st); retval (Int64)(t.TotalMilliseconds 0.5); returnretval.ToString(); } 在Net中的實際測試代碼 MSScriptControl.Scri…

學習筆記(34):Python網絡編程并發編程-異步調用與回調機制

立即學習:https://edu.csdn.net/course/play/24458/296452?utm_sourceblogtoedu 1.知識點&#xff1a;&#xff08;詳細見代碼注釋&#xff09; 1&#xff09;同步調用&#xff1a; res1 pool.submit(ju,john1).result() 2&#xff09;異步調用 pool.submit(ju,john1) 3…

c和c++的結構體使用

一&#xff1a;結構體其實有兩種初始化方式 1、直接把多有的變量在其內部通過形參傳入到結構體中&#xff0c;結構體定義在程序的最開頭是個全局變量&#xff1b;這個時候參數已經傳入進來&#xff0c;在本文件中都可以直接使用該結構體的所有成員變量 2、先定義&#xff0c;…

python第三方庫安裝的各種方法(全網最全,最簡單易懂)

使用鏡像&#xff1a; pip install virtualenv -i https://pypi.douban.com/simple 國內源&#xff1a; pip install -i https://pypi.tuna.tsinghua.edu.cn/simple module_name 或 pip install -i https://pypi.douban.com/simple module_name 國內的鏡像源來加速 pip inst…

Jmeter服務器監控插件使用

Jmeter服務器監控插件使用 Jmeter-Plugins支持CPU、Memory、Swap、Disk和Network的監控&#xff0c;在測試過程中更加方便進行結果收集和統計分析。 一、準備工作&#xff1a; 1、下載Jmeter-Plugins插件&#xff0c;下載Server端ServerAgent插件&#xff1b; 2、解壓Jmeter-Pl…

以后遇見 visual studio的調試bug出錯,直接查詢錯誤代碼;高效解決調試問題

1、例如遇到&#xff1a; 嚴重性 代碼 說明 項目 文件 行 錯誤 LNK2005 "void __cdecl readFileList(class std::basic_string<char,struct std::char_traits<char>, class std::allocator<char> >,class std::vector<class s…

數據庫導入導出命令

Oracle數據導入導出imp/exp 功能&#xff1a;Oracle數據導入導出imp/exp就相當與oracle數據還原與備份。 大多情況都可以用Oracle數據導入導出完成數據的備份和還原&#xff08;不會造成數據的丟失&#xff09;。 Oracle有個好處&#xff0c;雖然你的電腦不是服務器&#xff0c…

CCNA系列課程(4)交換技術

第四節課 交換技術杜飛2009-06-28咱們今天來看一下局域網交換技術&#xff0c;也稱為層2交換技術&#xff0c;內容主要包括層2交換的工作原理、網絡環路、如何利用Spanning-Tree Protocol 來解決網絡環路、VLAN及VTP技術&#xff0c;閑話少說&#xff0c;書歸正傳。我們在…

python中yield的用法詳解——最簡單,最清晰的解釋(轉載)

首先&#xff0c;如果你還沒有對yield有個初步分認識&#xff0c;那么你先把yield看做“return”&#xff0c;這個是直觀的&#xff0c;它首先是個return&#xff0c;普通的return是什么意思&#xff0c;就是在程序中返回某個值&#xff0c;返回之后程序就不再往下運行了。看做…

extern 全局變量在不同的文件使用方法(static)

例如&#xff1a;1.c int k6&#xff1b; 想要在2.c中調用1.c的k 則在2.c中用extern k 聲明一下就可以使用了&#xff1b; int c3; ck; 但是如果1.c中是這樣定義的 static int k6; 想要在2.c中使用k時不允許的&#xff0c;static只能在本文件中使用&#xff0c;外部文件…

python學習之路基礎篇(第八篇)

一、作業&#xff08;對象的封裝&#xff09;     要點分析 1.封裝&#xff0c;對象中嵌套對象 2.pickle,load,切記&#xff0c;一定要先導入相關的類二、上節內容回顧和補充      面向對象基本知識&#xff1a; 1.類和對象的…

Ubuntu實現樹莓派交叉編譯

一、交叉編譯 在一個平臺上生成另一個平臺上的可執行代碼。為什么要大費周折的進行交叉編譯呢&#xff1f;一句話&#xff1a;不得已而為之。有時是因為目的平臺上不允許或不能夠安裝所需要的編譯器&#xff0c;而又需要這個編譯器的某些特征&#xff1b;有時是因為目的平臺上的…

python常用的第三方庫總結

通用 urllib -網絡庫(stdlib)。requests -網絡庫。grab – 網絡庫&#xff08;基于pycurl&#xff09;。pycurl – 網絡庫&#xff08;綁定libcurl&#xff09;。urllib3 – Python HTTP庫&#xff0c;安全連接池、支持文件post、可用性高。httplib2 – 網絡庫。RoboBrowser –…

ubuntu系統安裝vscode教程

方法一&#xff1a; 依次輸入如下命令 1、sudo add-apt-repository ppa:ubuntu-desktop/ubuntu-make 2、sudo apt-get update 3、sudo apt-get install ubuntu-make 4、umake ide visual-studio-code 提示輸入a即可 方法二&#xff1a; 在windows系統下載安裝包&#xff0c…

pydebugger

定義結構體from ctypes import *WORD c_ushort DWORD c_ulong LPBYTE POINTER(c_ubyte) LPTSTR POINTER(c_char) HANDLE c_void_pDEBUG_PROCESS 0x00000001 CREATE_NEW_CONSOLE 0x00000010class STARTUPINFO(Structure):_fields_ [("cb", DWORD),("lpR…