日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

tp剩余未验证内容-7

發(fā)布時(shí)間:2025/3/18 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 tp剩余未验证内容-7 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

bash腳本中 的 set -e表示 exit immediately if a simple command returns a non-zero value.主要是為了防止錯(cuò)誤被忽略.會(huì)被立即退出, 但是最好在開發(fā)結(jié)束后, 刪除這個(gè)指令, 以免留下隱患.

有四種命令提示符, 有PS1, 自然就有 PS2 PS3 PS4, 分別表示 PS2即 在后續(xù)的命令下一行的提示符(continu'ation interactive prompt), PS3是在select選項(xiàng)時(shí) 的提示符, PS4是調(diào)試時(shí)的提示符.

shell中要進(jìn)行算術(shù)運(yùn)算, 有5種方法: (因?yàn)槟J(rèn)的算術(shù)運(yùn)算符號(hào)+-*/ 都不會(huì)被直接當(dāng)做運(yùn)算符, 而只是當(dāng)做普通字符來(lái)看待, 所以需要特殊處理)

  • 使用算術(shù)擴(kuò)展: $(( ... )); $[...]
  • 使用外部命令expr expr 1 + 2 注意有空格(特殊符號(hào)要用* 轉(zhuǎn)義)
  • 使用內(nèi)部命令: let 1+2 或 declare -i c=1+2
    外部命令,就是外部存在的 可以執(zhí)行的文件, 可以用 which命令看得到的, 根shell無(wú)關(guān)的; 所謂內(nèi)部命令,就是 shell本身提供的命令(函數(shù)), 用which是查看不到?jīng)]有的.

shell的調(diào)試?

  • 直接用 sh -x ./foo.sh 命令, 其中 -x就是調(diào)試的意思 還有其他一些選項(xiàng) : sh -n只是檢查文件是否有語(yǔ)法錯(cuò)誤; sh -c "..." 表示文件從字符串中讀取.
  • 或者直接將調(diào)試選項(xiàng)寫在sh文件中的 #!bin/bash -xv???
  • 或者在文件中, 在要開始調(diào)試的 位置 寫上 set -x 但是要注意, 只有set -x之后的命令才會(huì)調(diào)試, 這個(gè)之前的命令不會(huì)被調(diào)試.
  • 所謂調(diào)試就是 會(huì)將每一次/ 每一步 step by step 執(zhí)行的語(yǔ)句 先顯示出來(lái), 并且會(huì)將執(zhí)行語(yǔ)句中的變量用當(dāng)前值 替換; 然后輸出命令執(zhí)行的結(jié)果. 而且執(zhí)行語(yǔ)句前加上+號(hào)

$_SERVER['HTTP_REFERER']為什么為空?

  • referer的正確拼寫是 referrer, 所以前者其實(shí)是一種歷史的錯(cuò)誤遺留
  • http_referer是header請(qǐng)求頭的一部分, 通常會(huì)帶在向web服務(wù)器發(fā)生的信息中, 告訴服務(wù)器我是從 哪個(gè)頁(yè)面鏈接而來(lái)的. 可以給服務(wù)器一些額外的信息, 便于其他一些處理.
  • http_refer完全依賴于瀏覽器自身, 有的瀏覽器是沒(méi)有設(shè)置這個(gè)變量的. 你就得不到它.

  • 但是, 在很多情況下http_referer會(huì)無(wú)效, null. 比如你 直接訪問(wèn)一個(gè)頁(yè)面的時(shí)候, 或從收藏夾中訪問(wèn)頁(yè)面的時(shí)候,
    所以一般來(lái)說(shuō),只有通過(guò) <a> 超鏈接 </a> 或者: location.href=...跳轉(zhuǎn), 以及 POST 或 GET 表單 提交訪問(wèn)的頁(yè)面, $_SERVER['HTTP_REFERER']才有效。

  • 由于 $_SERVER['HTTP_REFERER'] 對(duì) POST 表單訪問(wèn)也是有效的,因此在表單數(shù)據(jù)處理頁(yè)面 一定程度上 可以通過(guò)校驗(yàn) $_SERVER['HTTP_REFERER'] 來(lái)防止表單數(shù)據(jù)的惡意提交。但該方法并不能保證表單數(shù)據(jù)的絕對(duì)正確,即對(duì)表單數(shù)據(jù)的真實(shí)性檢測(cè)并不能完全依賴于 $_SERVER['HTTP_REFERER'] 。

========================

所以, 在tp中, 操作成功或失敗的提示 跳轉(zhuǎn)是用 success和error. $this->success/errror('跳轉(zhuǎn)提示信息', 跳轉(zhuǎn)的地址_默認(rèn)是http_referer, 跳轉(zhuǎn)等待時(shí)間)

使用js 使html中的數(shù)字遞減?

  • 一個(gè)頁(yè)面中, 包含多個(gè)head, body, html等標(biāo)簽雖然不規(guī)范, 但是仍然可以解析顯示的.
  • js獲取一個(gè)元素的屬性?
  • setInterval和clearInterval?
  • 快速調(diào)用一個(gè)函數(shù)的方法.
<script type="text/javascript"> (function(){ var wait = document.getElementById('wait'),href = document.getElementById('href').href; var interval = setInterval(function(){var time = --wait.innerHTML;if(time <= 0) {location.href = href;clearInterval(interval);}; }, 1000); })(); </script>

關(guān)于tp?
tp的文件上傳 在"專題"中.
tp使用 "類" 的思想: 先new一個(gè) 類對(duì)象, 然后讓 類對(duì)象與實(shí)際要操作(上傳)的文件相關(guān)聯(lián), 然后通過(guò)操作這個(gè) 已經(jīng)關(guān)聯(lián)了的類對(duì)象實(shí)現(xiàn)對(duì)該文件的各種操作.

  • 實(shí)際上,這也是 "類"的一個(gè)基本思想. 一個(gè)類對(duì)象(泛泛的), 必須跟具體的實(shí)物(生活中的個(gè)體) 相關(guān)聯(lián). (類的對(duì)象, 跟具體的實(shí)物/事物相關(guān)聯(lián)的 過(guò)程, 正是所謂的 類對(duì)象的實(shí)例化/初始化). 實(shí)例化后, 這個(gè)類對(duì)象 就代表該具體的 人/事物了, 對(duì)該對(duì)象的操作, 就是對(duì)該人/事物的操作!
  • 如果類對(duì)象, 沒(méi)有跟具體的實(shí)物相關(guān)聯(lián), 那么它實(shí)際上是沒(méi)有意義的, 也是沒(méi)有用處的. 比如一張 銀行卡"對(duì)象", 在沒(méi)有跟某個(gè)具體的人(儲(chǔ)戶)相關(guān)聯(lián)的時(shí)候, 即沒(méi)有"開卡"的時(shí)候, 這張卡其實(shí)是沒(méi)有用的,你隨便怎樣處置都是可以的. 但是如果你有一張十萬(wàn)元的卡, 跟你的儲(chǔ)存信息/存儲(chǔ)資金 相關(guān)聯(lián)了, 如果你丟失了, 又是怎樣的一種情景呢?
  • 而上面所說(shuō)的, 類(對(duì)象)沒(méi)有跟具體的 事物相關(guān)聯(lián), 只是規(guī)定了這個(gè)類 可以具有的功能和特征, 這種類, 其實(shí)也是有用的, 它就是只是作為一種協(xié)議, 一種規(guī)定, 就是一種 "接口", "接口"都是抽象的, 即泛泛而論的東西, 不能跟具體的某個(gè) 實(shí)物相關(guān)聯(lián), 因此, 它是接口, 不能被 "實(shí)例化""初始化"



tp中的array數(shù)組, 是應(yīng)用得最廣泛的. 可以說(shuō)凡是能用 "字符串"的地方, 幾乎都可以用數(shù)組來(lái) 表示, 用數(shù)組來(lái)操作, 而且都推薦用數(shù)組, (因?yàn)閿?shù)組更安全??)


tp的orm就是, 對(duì)數(shù)據(jù)庫(kù)的操作, 不再用原始的/原生的 mysql/mysqli函數(shù)(面向過(guò)程)來(lái)處理, 而是用 模型(跟數(shù)據(jù)庫(kù)的表相對(duì)應(yīng))的類/對(duì)象來(lái)操作, 用對(duì)象的方法比如find,select add save等進(jìn)行增刪改查的操作.

其中, add和save方法, 需要先創(chuàng)建 插入和更新的 數(shù)據(jù)對(duì)象$data(實(shí)際上就是要插入/更新到表中的 記錄)
這種創(chuàng)建數(shù)據(jù)對(duì)象的方法, 有兩種, 一是 create()方法, 一是data()方法. 兩個(gè)方法的相同點(diǎn)是: 都可以/都支持多種數(shù)據(jù)來(lái)源, 包括從 數(shù)組, 其他數(shù)據(jù)對(duì)象甚至 普通對(duì)象來(lái)創(chuàng)建; 不同點(diǎn)是: create的功能更強(qiáng)大, 不但支持創(chuàng)建的數(shù)據(jù)對(duì)象的自動(dòng)驗(yàn)證和自動(dòng)完成($_validate和$_auto), 而且還可以 自動(dòng)地從 $_POST數(shù)組創(chuàng)建數(shù)據(jù)對(duì)象.

  • 創(chuàng)建的數(shù)據(jù)對(duì)象是保持在 內(nèi)存中, 并沒(méi)有馬上寫入到數(shù)據(jù)庫(kù)中, 要直到使用 add()方法和save()方法才會(huì)寫入數(shù)據(jù)庫(kù).
  • 所以, create的數(shù)據(jù)對(duì)象, 你是可以直接顯示dump出它的內(nèi)容的; 而且還可以繼續(xù)修改.

在進(jìn)行數(shù)據(jù)庫(kù)相關(guān)的操作時(shí), 一定要首先設(shè)置 數(shù)據(jù)庫(kù)配置.

  • 因?yàn)槟阍趧?chuàng)建 模型對(duì)象 $User = M('user') 的時(shí)候, 就需要數(shù)據(jù)庫(kù)配置, 如果沒(méi)有配置/沒(méi)有正確配置, 就會(huì)報(bào)錯(cuò).
  • 首先去加載 Frame\Library\Think\Db.class.php, 執(zhí)行第一個(gè)靜態(tài)方法去獲取數(shù)據(jù)庫(kù)類的實(shí)例static public function getInstance($config=array()) 參數(shù)就是$config數(shù)據(jù)庫(kù)連接配置!
  • tp錯(cuò)誤的統(tǒng)一輸出形式用 : E(L('_NO_DB_DRIVER_') . ':'. $class), E函數(shù)的原型是 E($msg, $code); 所以所有的錯(cuò)誤提示內(nèi)容, 都要放在整個(gè) E() 函數(shù)的括號(hào)內(nèi) 錯(cuò)誤函數(shù)是 拋出了一個(gè) 異常 throw new Exception($msg, $code); 所以: E函數(shù)后的所有內(nèi)容 都將 停止執(zhí)行, 直接從 E()函數(shù)處退出了, 而且是調(diào)用 統(tǒng)一的 異常輸出模板.
  • 注意配置的下標(biāo)名稱是: 由于DB本身就有 '數(shù)據(jù)庫(kù)' 的意思, 數(shù)據(jù)庫(kù)的名稱 配置項(xiàng) 是 'DB_NAME' 不是DB_DATABASE, 數(shù)據(jù)庫(kù)密碼是DB_PWD, 不是 DB_PASSWD.
  • 數(shù)據(jù)庫(kù)類型要明確寫成, 因?yàn)樵?convention.php中, 沒(méi)有默認(rèn)的數(shù)據(jù)庫(kù)類型配置


tp表單在提交的時(shí)候, 有兩種方式過(guò)濾字段,

一是使用 field函數(shù),( 要注意, field方法沒(méi)有復(fù)數(shù), 所以其參數(shù)也是 一個(gè) 字符串. 另外field是指定 接收的/生效的字段, 不是 將被過(guò)濾被丟棄的字段 ) 然后用create()創(chuàng)建,
二是配置 insertFields, updateFields兩個(gè)的值,
**即使設(shè)置了表單 的字段映射, 但是在 后面的所有 連貫操作的 field方法中, 表示 參數(shù)的 字段都 應(yīng)該是實(shí)際的數(shù)據(jù)表字段, 而不是 字段映射, 不是表單中的 字段域, 否則 當(dāng)定義了字段映射時(shí), 又使用 filed('表單字段'), 那么就會(huì)出現(xiàn) create的數(shù)據(jù)對(duì)象 為空 empty的 錯(cuò)誤!

要注意, 如果要設(shè)置 $insertFields 和 $updateFields的值, 以及要實(shí)現(xiàn)自動(dòng)驗(yàn)證和自動(dòng)完成, 都要 創(chuàng)


建 自定義的 模型類, 不能直接使用標(biāo)準(zhǔn) 的模型類的基類.

甚至于, 即使一個(gè)大型的很多文件 需要同時(shí)編輯的場(chǎng)合下, 用一個(gè) vim窗口界面都是可以勝任的, 首先它的打開速度很快, 其次可以分成多個(gè)(比如4~5)個(gè)子窗口來(lái)同時(shí)編輯多個(gè)文件, 最重要的是, 每一個(gè)子窗口都可以 保存多個(gè) 曾經(jīng)打開的 文件的緩沖, 在每一個(gè)子窗口都可以使用 ctrl+^ 來(lái)切換緩沖的文件.

tp多個(gè)配置文件?

  • 你可以將所有的配置雜七雜八地放到同一個(gè)配置文件中, 比如/Application/Home/Conf/config.php中, 但是如果配置比較多, 比較繁雜的話,就會(huì) 顯得比較凌亂. 所以將配置分門別類的放在各自的/ 單獨(dú)的 配置文件, 然后 "包含它們" 是一個(gè)比較好的.
  • 你也不能單單的把 某個(gè)方面的 配置文件 "放到" '扔到' conf目錄下就行, 那樣的話, tp也不會(huì)知道 你的文件就是配置文件啊, 所以需要給 tp "說(shuō) 一聲, 告知一下 注冊(cè)一下", 就是要在 "主"配置文件中 說(shuō)一下: 比如 'load_ext_config' => 'mylang'
  • 自己擴(kuò)展的配置文件,比如mylang.php是放在跟你包含 說(shuō)明的配置文件相同目錄下, 比如 在 Home/Conf/config.php中配置load_ext_config, 那么擴(kuò)展配置也就放在Home/Conf中, 而且擴(kuò)展配置 說(shuō)明中 不要帶.php擴(kuò)展名

tp的配置盡量用 小寫字母, 因?yàn)椴还艽髮戇€是小寫, 最后都要轉(zhuǎn)變?yōu)樾? 雖然為了好看,"推薦"用小寫. 但是在實(shí)際開發(fā)中, 一切都是 以 "效率" 為最高原則的.

tp如何配置自己的 語(yǔ)言文件?? 參考https://www.jb51.net/article/47624.htm http://www.cnblogs.com/yuwensong/p/4156383.html

這個(gè)還是比較復(fù)雜的, 通常是不需要的.如果確實(shí)要這樣做, 步驟是:(但是好像有錯(cuò)誤???)

1.在/App/Home/Conf/config.php配置中, 追加 'LANG_SWITCH_ON' => true, //開啟語(yǔ)言包功能 'LANG_AUTO_DETECT' => true, // 自動(dòng)偵測(cè)語(yǔ)言'DEFAULT_LANG' => 'zh-cn', // 默認(rèn)語(yǔ)言 'LANG_LIST' => 'en-us,zh-cn,zh-tw', //必須寫可允許的語(yǔ)言列表'VAR_LANGUAGE' => 'l', // 默認(rèn)語(yǔ)言切換變量 2.在Home/Conf目錄中創(chuàng)建一個(gè)php文件, 比如: tag.php 內(nèi)容如下

<?php
return array(
// 添加下面一行定義即可
'app_begin' => array('CheckLang')
);

3.把框架中的 Extend/Behavior/CheckLangBehavior.class.php 文件復(fù)制到 Home/lib/Behavior/中(完整版的thinkphp包才有,沒(méi)有的話請(qǐng)自行創(chuàng)建) 4.然后就是 創(chuàng)建對(duì)應(yīng)的語(yǔ)言項(xiàng)文件了, 在 /App/Home/下創(chuàng)建對(duì)應(yīng)的三個(gè)語(yǔ)言文件夾: zh-cn, en-us, zh-tw. 然后再在這些語(yǔ)言目錄中創(chuàng)建對(duì)應(yīng)的語(yǔ)言文件, 文件名必須設(shè)置為common.php?? 5.最后就是 引用/使用 語(yǔ)言配置了, 在模板文件中, 使用 `{$Think.lang.語(yǔ)言項(xiàng)}` 在后臺(tái)控制器中, 用L()方法來(lái)引用.

==================================================================

如果dump一個(gè)對(duì)象的話, 將輸出這個(gè)對(duì)象的所有內(nèi)容, 包括對(duì)象的 所有成員變量和所有的成員方法.

關(guān)于數(shù)據(jù)對(duì)象data和模型對(duì)象$User的區(qū)別?

  • $User是 通過(guò)M, D等方法創(chuàng)建的模型對(duì)象. 有兩個(gè)方面的作用, 一個(gè)是 關(guān)于模型的所有方法操作, 如add, select, save, delete等都必須通過(guò)這個(gè)對(duì)象完成; 另一個(gè)作用是, 其本身也可以 保持/保存 一些"數(shù)據(jù)", (這些數(shù)據(jù)不是指 模型類本身定義時(shí)所包含的成員等, 而是指 包含 將要寫入到數(shù)據(jù)庫(kù)表中 "記錄"內(nèi)容).
  • 數(shù)據(jù)對(duì)象, 是指 模型類$User 所包含的 表記錄 數(shù)據(jù). $User獲得 表記錄數(shù)據(jù)有兩種途徑, 使用 data()方法, 或者使用 create()方法.
    一方面, 你可以直接 echo出 對(duì)象$User所包含的表記錄字段, 比如: echo $User->name;
    另一方面, 你還可以接收 create方法的返回對(duì)象 $var_data = $User->create() , 這樣你就可以很直觀地dump出 $var_data 查看數(shù)據(jù)了

數(shù)據(jù)表的select操作, 不只是可以選擇記錄, 而且可以完成復(fù)雜的 字段運(yùn)算等

where子句,不但能根據(jù)條件選擇篩選記錄, 而且 在 id自增的時(shí)候 可以用來(lái)選擇最前/最后/中間 N條記錄: ... where id > Max(id)....
通常來(lái)說(shuō), where, limit等的操作耗時(shí) 比order的耗時(shí) 要小, 應(yīng)該盡量避免 order操作??
在非mysql的選擇子句中,最前面N條記錄 可以用 top子句 , 但是 mysql沒(méi)有top子句! 只能使用limit子句. 參考 http://www.cnblogs.com/freeliver54/archive/2008/07/23/1249232.html

  • limit子句的格式是: limit 因?yàn)槭莖ffset偏移, 所以總是比起始記錄位置小1. 比如: 選擇從第10條到20條的記錄, 應(yīng)該是: limit 9, 11 從第10條開始的共10條記錄: limit 9, 10
  • mysql沒(méi)有直接選取 最后N條 的子句.**

male和female不只是指人, 還可以用來(lái)指 雄性動(dòng)物或 雄性植物(雄株) . man和woman通常用來(lái)指成年男人和女人. 也就是說(shuō) male包括 man和boy. female的fe.

create在 創(chuàng)建數(shù)據(jù)對(duì)象時(shí), 會(huì) 驗(yàn)證數(shù)據(jù)源的合法性(會(huì)自動(dòng)過(guò)濾 數(shù)據(jù)表中沒(méi)有的字段!). 所以即使表單中有 多余的/不是數(shù)據(jù)表中的字段信息, 也不用管, 因?yàn)?非數(shù)據(jù)表字段會(huì)自動(dòng)過(guò)濾/丟棄,不會(huì)出現(xiàn)在 創(chuàng)建的數(shù)據(jù)對(duì)象中.

  • 模型類對(duì)表單中的 字段映射: 目的, 因?yàn)槟J(rèn)的在創(chuàng)建數(shù)據(jù)對(duì)象時(shí), 是要求 表單中的 字段name要和 數(shù)據(jù)表中的字段名稱 相同, 否則會(huì)報(bào)錯(cuò). 但是那樣會(huì)在表單中暴露數(shù)據(jù)表的字段,引起安全問(wèn)題. 所以 通過(guò)字段映射, 讓在表單中的字段名稱 => 映射到 數(shù)據(jù)表中的字段名. (這樣即實(shí)現(xiàn)了 從表單到 數(shù)據(jù)表的數(shù)據(jù)對(duì)象創(chuàng)建, 又隱藏了數(shù)據(jù)表自動(dòng)名, 多了一點(diǎn)安全保護(hù)).
  • 字段映射的方式是: 在自定義模型類 中添加protected $_map=array('表單字段名' => '數(shù)據(jù)表字段名'); 注意是把 表單字段 映射為 數(shù)據(jù)表字段, 不可能是反過(guò)來(lái)吧,本身你就要隱藏?cái)?shù)據(jù)表字段呢, 你難道還想 主動(dòng)暴露到表單中來(lái)嗎?

  • 使用字段映射: 即使使用了字段映射, 并不會(huì) 自動(dòng) 影響 查詢結(jié)果, 查詢結(jié)果中的 記錄中的 字段名稱仍然是 原來(lái)的數(shù)據(jù)表中的字段名稱, 不會(huì)是 "表單"字段名. 除非你在配置中設(shè)置了 read_data_map' => true, 或者使用 D('user') -> parseFieldsMap($data_result)方法手動(dòng) 轉(zhuǎn)換.

  • 在$User->create() 后, 里面的數(shù)據(jù)對(duì)象就已經(jīng)被 映射了, 即原來(lái)表單中的字段就已經(jīng)自動(dòng)轉(zhuǎn)換為數(shù)據(jù)表中的字段了,(這個(gè)是create所作的工作之一),所以接下來(lái)就可以用 連貫操作 add了 .

字符為空 和 not null 是不同的! 當(dāng)表單中的input域(比如姓名) 沒(méi)有填入內(nèi)容的時(shí)候, 傳遞到$_post的是 ""空字符串, 不是not null. 所以 它是合法的, 會(huì)被add添加到數(shù)據(jù)表中.

$_POST是: array (size=2)'username' => string '' (length=0) //這里明確給出了是: string , 而且是 '', 不是 null!'gender' => string 'm' (length=1)

在數(shù)據(jù)表中, 字段field也叫做 column列. 在定義表/修改表結(jié)構(gòu)的時(shí)候, 格式是: col_name colomn_specification/col_definition 即 列名 然后是對(duì)列的定義/說(shuō)明/描述 (多個(gè)定義單詞直接用空格分隔).

===============================================================

要想一次性的關(guān)閉多個(gè) 已經(jīng)打開的緩沖區(qū), (而不用一個(gè)一個(gè)地去關(guān)閉), 使用 冒號(hào)命令: bufdo bd其中 bufdo是指 針對(duì)所有的 緩沖區(qū)執(zhí)行的命令.

關(guān)于sql語(yǔ)句中 各子句的執(zhí)行順序? 參考 主要是這個(gè): http://www.cnblogs.com/Qian123/p/5669259.html 和http://www.cnblogs.com/Qian123/p/5669259.html 明確了sql語(yǔ)句的執(zhí)行過(guò)程, 你對(duì)數(shù)據(jù)庫(kù)的執(zhí)行過(guò)程和原理就會(huì)更深入, 也會(huì)避免一些使用上的錯(cuò)誤, 比如:

  • sql語(yǔ)句中, 任何一個(gè) "關(guān)鍵字(單詞/詞組)"都是一個(gè)子句, 包括: from -> on -> join -> where -> group by -> having -> select -> disctinct -> order by-> limit
  • select子句雖然在最前面, 但并不是第一個(gè)執(zhí)行, 它是在第8步才執(zhí)行的. 而只有在select 子句中 才能定義 字段(列)的alias,(from子句中可以定義表的別名) 所以在第8步select子句之前都是不能使用 列的別名的, 只有在這之后, 即第9步distinct 第10步order by子句中使用列的別名
  • 最先執(zhí)行的總是 from子句, 最后執(zhí)行的總是 limit子句. 所以 在from子句中定義 的表的 alias別名, 可以在 其后的(從第2步后)所有子句中都可以使用, 包括隨后的where子句中就可以使用表的別名.
  •  mysql中 的所有別名, 包括 表的別名, 和 字段的別名 都可以加上 as, 也可以省略 as.
  • 通常每一步子句 得到的是一個(gè) 虛擬表virtual table(即虛表VT), 從 VT1~ VT9, 但是在第10步, 即order by子句, 返回的并不是一個(gè) 虛表vt, 而是 一個(gè)游標(biāo) 即VC(virtual cursor). 所以凡是包含 order by子句的 查詢句都不能作為 "表的表達(dá)式)(即在 凡是需要一個(gè) 表的表達(dá)式的地方, 都不能包含order by子句) 表的表達(dá)式其實(shí)就是 一個(gè)虛表vt.
  • distinct子句 的原理 是 在內(nèi)存中, 利用一個(gè) 臨時(shí)表來(lái) 得到一個(gè) vt的

  • 要理解select子句的過(guò)程: 查詢/選擇 結(jié)果字段, 其實(shí)并不是直接拿著 這些要顯示的字段到數(shù)據(jù)表里面去"挑選"記錄.實(shí)際上, 在select之前, 已經(jīng)做了大量的工作, 已經(jīng)經(jīng)過(guò)/得到了多個(gè) 步驟的 VT虛表的迭代過(guò)程了. 已經(jīng)準(zhǔn)備好了 查詢結(jié)果的(包含所有字段)的 多個(gè)記錄了. select子句的作用 僅僅是 挑選要顯示/要返回的 部分字段(但是其他字段其實(shí)還是存在的, 因?yàn)榧词乖?其后的 distinct/order by 等步驟中, 虛表VT10/11 其實(shí)還是一直存在的, 在內(nèi)存中), 所以在 select子句后, 還可以使用 order by子句按 非select字段進(jìn)行排序的.
  • 在order by子句前, 整個(gè)過(guò)程的vt都是 無(wú)序的. 只有當(dāng)你確實(shí)需要有序的, 需要排序的結(jié)果集時(shí), 才用order by. order by很耗資源和時(shí)間, 要慎用.
  • mysql中的統(tǒng)計(jì)函數(shù), 比如max, min, sum, avg, 也叫 分組函數(shù)(group functions). 也就是說(shuō), 只有在 執(zhí)行了group by子句后, 其他子句才能使用: 即在第5步后 才能使用 分組(統(tǒng)計(jì))函數(shù). 而where子句是在 group by子句之前執(zhí)行的, 所以 在 where 子句中, 就不能使用 group子句中才能使用的 統(tǒng)計(jì)函數(shù). 比如 where score>=average(score)??  就會(huì)報(bào)錯(cuò): "invalid use of group functins"

  • 分組后, 在分組記錄中, 我們可以 select出關(guān)于分組的統(tǒng)計(jì)信息, 也可以select 原數(shù)據(jù)表中的非統(tǒng)計(jì)信息(即普通字段信息), 雖然分組操作的目的通常是要 select出統(tǒng)計(jì)信息. 如果分組后 select的是 非統(tǒng)計(jì)字段信息,則 在第9 步(select步驟)總是顯示的/保留的是 相同分組中 排在最前面的那個(gè)記錄的 字段信息. (但是 在分組后所得的虛擬表VT(第5步時(shí))分組中的 其他記錄/信息仍然是保留的. 是按分組字段的不同 挨著挨著排列的(類似于excel中的分組), 所以, 一直到第8步select的時(shí)候 還可以用 count, max等統(tǒng)計(jì)函數(shù)對(duì)所有 記錄 和 相關(guān)字段進(jìn)行統(tǒng)計(jì) )

關(guān)于分組后的顯示結(jié)果?

+------+-------------+-------+-------+---------------+---------+---------+------+------+----------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +------+-------------+-------+-------+---------------+---------+---------+------+------+----------------------------------------------+ | 1 | SIMPLE | user | range | PRIMARY | PRIMARY | 4 | NULL | 7 | Using where; Using temporary; Using filesort | +------+-------------+-------+-------+---------------+---------+---------+------+------+----------------------------------------------+ 1 row in set (0.00 sec)

關(guān)于explain中的說(shuō)明?

  • type是指查詢的范圍, 是整個(gè)記錄ALL, 還是有條件/范圍的, 通常where子句屬于 type=range的. 如果查詢條件中包含了主鍵 那么在explain中會(huì)顯示primary key. extra是說(shuō)會(huì)用到哪些 "額外" 操作. group by分組, 會(huì)使用到臨時(shí)表temporary和其結(jié)果會(huì)自動(dòng) 按分組字段 升序排序??(隱含一個(gè) order by group_column asc)?? 所以explain中, 會(huì)有 using filesort. 凡是有 (或者是 隱含有) order by 排序的操作, 都會(huì)有 using filesort的 執(zhí)行計(jì)劃. 比如 group by的分組操作, 就暗含了 分組后的記錄 按 分組字段 asc 升序排列的 操作.

在要實(shí)現(xiàn)一些比較 復(fù)雜的 查詢功能時(shí), 都會(huì)使用 "子查詢". 子查詢主要有兩個(gè)作用: 得到的 可以是一個(gè) 表的表達(dá)式, 用來(lái)作為中間表/臨時(shí)表, 也可以得到的是一個(gè) 數(shù)值, 用在where等子句中. 所以, "子查詢"的使用還是 很多的!

當(dāng)要求id最大值時(shí), 慎用select Max(id) ... 而是用索引來(lái)做, 比如: 創(chuàng)建id的索引(show index from table_name), 然后用 select... order by id desc limit 1 來(lái)代替, 這樣效率更高

  • 在用group by分組后, 可以使用 分組函數(shù)(統(tǒng)計(jì)函數(shù))比如max, min, sum等 確實(shí)能夠 對(duì)每一組的數(shù)據(jù) 進(jìn)行 最大值等的統(tǒng)計(jì), 而不會(huì)只針對(duì)所有記錄進(jìn)行統(tǒng)計(jì). 因?yàn)閟elect子句在 group by子句后執(zhí)行.
  • 但是 group by和max等統(tǒng)計(jì)函數(shù)一起使用時(shí)要注意: 如果包含了非統(tǒng)計(jì)數(shù)據(jù)(比如普通字段的值), 由于分組后, 總是取第一條記錄的普通字段的值,這樣 當(dāng)?shù)谝粭l記錄的普通字段值和該分組的最大值等統(tǒng)計(jì)值一起 并列組成一條記錄時(shí), 就可能發(fā)生誤解,跟實(shí)際情況不符. 比如統(tǒng)計(jì)分組中的最大值, 但是這個(gè)最大值并不一定就是 第一條記錄的用戶 正好具有該最大值.
    此時(shí)有兩種解決方案,
    參考: https://blog.csdn.net/john_hongming/article/details/42742965
    一是, 先將原來(lái)的表 按照要求Max/min的字段 進(jìn)行排序, 升序或降序, 反正要保證 出現(xiàn)/保留在 分組里面的" 包含普通字段的那條記錄" 要在 第一個(gè)記錄位置就好. 得到一個(gè) (中間表/表的表達(dá)式) 然后對(duì)這個(gè)中間表進(jìn)行 分組.
    二是: 使用where in ...
MariaDB [test]> select * from user where score in (select max(score) from user group by gender); +------------+-----------+--------+-------+ | id | name | gender | score | +------------+-----------+--------+-------+ | 0000000002 | 孫徐連 | w | 98 | | 0000000010 | 王的徐 | m | 97 | +------------+-----------+--------+-------+ 2 rows in set (0.00 sec)MariaDB [test]>

對(duì)mysql而言, 當(dāng)創(chuàng)建了主鍵后, (最常用的是id), 會(huì)自動(dòng)地給 主鍵創(chuàng)建 索引 (所以, 不必重復(fù)地 去創(chuàng)建索引). show index from user;

  • 給數(shù)據(jù)表創(chuàng)建主鍵時(shí), 要注意對(duì)主鍵的設(shè)置加以程序安全性的保護(hù), 因?yàn)橐环矫?增刪改查主要就是根據(jù)主鍵來(lái)進(jìn)行的; 另一方面,主鍵也 比較容易暴露泄露 數(shù)據(jù)庫(kù)的信息.
    數(shù)據(jù)表的 索引的創(chuàng)建很方便, 很簡(jiǎn)單, 不會(huì)給數(shù)據(jù)表帶來(lái)負(fù)擔(dān). 但是, 索引在查詢方面 可以帶來(lái)很大的速度提升. 所以, 在實(shí)際項(xiàng)目中, 通常應(yīng)該 給 要查詢的 字段 (不只是主鍵字段) 比如'name'字段創(chuàng)建索引. 另外, 在 可能出錯(cuò), 根據(jù)某個(gè)字段進(jìn)行 排錯(cuò)時(shí)的字段 也可以給它創(chuàng)建索引.

"every derived(派生的/繼承的/衍生的/導(dǎo)出的...) table must have its own alias" 就是說(shuō), 在 mysql中, 任何 中間表(表的表達(dá)式)/臨時(shí)表都必須有一個(gè) 別名,而不管你會(huì)不會(huì)用到這個(gè)別名.

  • 但并不是所有的 中間查詢/臨時(shí)查詢/放在括號(hào)中的查詢, 都要用 表的別名. 這個(gè)只是針對(duì) 需要 "表"的時(shí)候, 只是在 derived table, 是table , 只是在 from子句 后面的中間表, 才需要用 別名. 而在 where子句 是不需要表 的別名的! 因?yàn)?where子句中 只是需要一個(gè) 數(shù)據(jù)/數(shù)值/集合,用來(lái)滿足where的 >, in, between等表達(dá)式而已.

having 和where的區(qū)別?

  • 兩者在語(yǔ)法上的寫法是一樣的, 都是條件篩選, 只不過(guò)where是對(duì) 表的 "列"進(jìn)行篩選, 因此where表達(dá)式中只能 出現(xiàn)表的列字段, 而having是對(duì) 查詢結(jié)果進(jìn)行篩選.
  • having可以單獨(dú)使用, 不一定總是 必須 跟 group by一起使用!
  • having 是對(duì) (可以分組 也可能不分組 group by ->) select之后的結(jié)果 進(jìn)行條件篩選. 所以 , 可以使用 select子句中的 所有別名, 包括字段運(yùn)算后的別名.
  • 在select語(yǔ)句中, 字段被 看成是 "變量" , 所以 可以對(duì)字段進(jìn)行 算術(shù)運(yùn)算的. 比如 查找成績(jī)?cè)?0分以上的記錄: select id, name as '姓名', score-60 as chazhi from score having chazi>30;
    ??? 難道having子句 是在 select子句后執(zhí)行的??
MariaDB [test]> select id, name as '姓名', score-60 as chazi from user where chazi>30; ERROR 1054 (42S22): Unknown column 'chazi' in 'where clause' // 很明顯, where只是針對(duì) 字段來(lái)判斷的, 如果是select中的 運(yùn)算表達(dá)式, 則會(huì)報(bào)錯(cuò), "未知的字段"MariaDB [test]> select id, name as '姓名', score-60 as chazi from user having chazi>30; +------------+-----------+-------+ | id | 姓名 | chazi | +------------+-----------+-------+ | 0000000001 | 孫以的 | 34 | | 0000000002 | 孫徐連 | 38 | | 0000000010 | 王的徐 | 37 | +------------+-----------+-------+ 3 rows in set (0.00 sec)MariaDB [test]>

group by和order by的一起使用?

  • 要求, order by中的字段, 必須是 出現(xiàn)在group by子句clause中.
  • order by子句必須放在 group by子句的后面
  • group by默認(rèn)也要進(jìn)行排序, 多個(gè)字段進(jìn)行分組或排序時(shí), 字段順序必須固定, 不是隨便寫的.

===================================

終端terminal shell是一個(gè)集成環(huán)境, 在里面運(yùn)行的任何程序包括 vim, mysql, 等都是子程序, 都可以使用 shell統(tǒng)一的 菜單/快捷鍵設(shè)置操作, 比如 復(fù)制/粘貼等. 消除其他行, 到最頂端, 使用 ctrl_L

====================================

tp的功能也不是盡善盡美(實(shí)際上世上也沒(méi)有盡善盡美的東西吧), 還有一些bug的.

在 項(xiàng)目App/Runtime/Home/目錄下的 那些php文件, 實(shí)際上就是 View目錄下的 "模板" 的編譯結(jié)果文件(所謂編譯, 就是將模板中的php代碼 解析成普通的html后)

關(guān)于布局模板

  • (模板)布局layout是tp的功能, 實(shí)現(xiàn)布局的方式是用 模板, 這個(gè)模板叫" 布局模板" . 不管哪一個(gè)框架的模板布局, 還是很有用的. 它是生成 基本框架都相同的多個(gè)頁(yè)面的一種快速方法: 把多個(gè)頁(yè)面中, 相同的要素(結(jié)構(gòu))比如頁(yè)面的頭部, 菜單欄, 頁(yè)腳等內(nèi)容是基本相同的, 提取出來(lái), 然后多個(gè)頁(yè)面中只有 主體內(nèi)容 不同的部分進(jìn)行組裝. 沒(méi)有必要每一個(gè)頁(yè)面都完整的寫一遍, 這個(gè)正是 符合軟件 "結(jié)構(gòu)化/模塊化+重用" 的思想.

  • 布局模板的實(shí)現(xiàn)有三種方式, 其中第二種方式, 是使用 layout標(biāo)簽, 這個(gè)標(biāo)簽的使用方法 ,跟其他html標(biāo)簽一樣, 也是指定相應(yīng)的屬性就好了
    layout標(biāo)簽不需要任何配置;
    layout標(biāo)簽的屬性有 name(使用哪個(gè)布局模板), 和 replace(布局模板中的替換字符串)
    頭部增加(好像不一定是要在 head中, 在body中定義也是可以的! 而且 layout標(biāo)簽甚至可以在body內(nèi)容的最下面/最后面書寫都是可以的. 但是一定要在配置中, 關(guān)閉 LAYOUT_ON設(shè)置,否則 布局不會(huì)成功, 不會(huì)應(yīng)用 布局模板!!! ):<layout name="Layout/newlayout" replace="{__REPLACE__}" />
    使用了layout標(biāo)簽后, 同樣的, 是把 當(dāng)前模板文件的內(nèi)容 替換到 布局模板中的 {REPLACE}

  • 使用include標(biāo)簽 中的 layout標(biāo)簽, 可以實(shí)現(xiàn)模板標(biāo)簽的嵌套.

  • 在convention.php配置中, 關(guān)于布局(模板) 的配置 有3個(gè):

'TMPL_LAYOUT_ITEM' => '{__CONTENT__}', // 布局模板的內(nèi)容替換標(biāo)識(shí)'LAYOUT_ON' => false, // 是否啟用布局'LAYOUT_NAME' => 'layout', // 當(dāng)前布局名稱 默認(rèn)為layout
  • 這個(gè)是整體/全局配置, 對(duì)整個(gè)項(xiàng)目中的所有模板文件 都有效的.
    但是, 是可以來(lái)調(diào)節(jié)的,并不是說(shuō), 只要開啟layout_on=>true后, 就必須/不得不 使用布局功能了. 實(shí)際上, 即使開啟了layout功能后, 仍然有兩者方法來(lái)關(guān)閉: 一是 在 需要 關(guān)閉的模板頁(yè)面中, 加上 {_ _NOLAYOUT_ _ } ; 二是 在 控制器的操作中 使用 全局函數(shù)layout(是框架中的functions.php文件中的函數(shù)), 比如 layout(true), layout(false)禁用布局功能, layout('layout/new_layout') 而且使用全局函數(shù)layout時(shí)是不需要開啟layout_on=>true 這個(gè)配置的.

要注意, 布局模板的位置默認(rèn)的 跟普通模板文件的位置一樣, 即布局模板 文件是: /AppName/Home/View/layout.html, 注意默認(rèn)的是View目錄下的 layout.html, 而如果有的配置設(shè)置了 模板的子目錄位置時(shí), 就要重新指定 "layout_name" 了.

轉(zhuǎn)載于:https://www.cnblogs.com/bkylee/p/9303769.html

總結(jié)

以上是生活随笔為你收集整理的tp剩余未验证内容-7的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。