若是使用tp, 則導入:外部的css和js, 可使用tp的簡化方式:javascript
import標籤, 指明 type屬性, 和file屬性.
type指明是css仍是js, 默認是js能夠不寫.
file指明文件的時候, 路徑直接從 /Public/寫起, 並且不用寫擴展名, 由於前面已經指明瞭文件類型的
因爲 import是相似 Think的命名空間函數, 因此 在寫路徑的時候, 要用點號而不用 斜槓;php
load 或 css js標籤
這個就很簡單直接了:
直接就只是一個 href屬性就好了. 直接寫完整路徑就行了.
獲取 系統輸入變量值 (這裏僅僅是針對 系統變量的 "獲取輸入值")html
即便你不寫過濾函數, tp也給你定義了 默認 的過濾函數: 'DEFAULT_FILTER' => 'htmlspecialchars'.因此它 的安全機制就在這裏. 固然你也能夠本身寫本身的過濾函數.前端
一般的寫法是: I('post.editorValue'). 系統變量的 類型不分大小寫, 而變量自己 要嚴格區分大小寫. get和post能夠用param來表示, 而默認的類型就是param, 因此若是是get或post, 能夠不寫變量類型, 直接就是 I('變量名稱').java
有兩種方法,
一是, 從 ueditor.all.js的 23910行 - 到 - 24038行, 註釋掉, 就行了: 即註釋掉 UE.plugin.register('autosave', function()...
二是, 將saveInterval 的時間設置得 大些
如 設置: `saveInterval: (606024*1000) (單位是ms)mysql
關於Xss攻擊和xss白名單過濾
跨站腳本攻擊(也稱爲XSS)指利用網站漏洞從用戶那裏惡意盜取信息。 用戶在瀏覽網站、使用即時通信軟件、甚至在閱讀電子郵件時,一般會點擊其中的連接。 攻擊者經過在連接中插入惡意代碼,就可以盜取用戶信息。 攻擊者一般會用十六進制(或其餘編碼方式)將連接編碼,以避免用戶懷疑它的合法性。 網站在接收到包含惡意代碼的請求以後會產成一個包含惡意代碼的頁面, 而這個頁面看起來就像是那個網站應當生成的合法頁面同樣。 許多流行的留言本和論壇程序容許用戶發表包含HTML和javascript的帖子。 假設用戶甲發表了一篇包含惡意腳本的帖子,那麼用戶乙在瀏覽這篇帖子時, 惡意腳本就會執行,盜取用戶乙的session信息jquery
人們常常將跨站腳本攻擊(Cross Site Scripting)縮寫爲CSS, 但這會與層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆。 所以有人將跨站腳本攻擊縮寫爲XSS。若是你聽到有人說 「我發現了一個XSS漏洞」,顯然他是在說跨站腳本攻擊。linux
過濾xss 一般的 javascript腳本攻擊, 是過濾掉 雙引號和 尖括號, 可是也不是徹底的, 還有不少種方法進行 xss攻擊.css3
也就是說, 當你點擊一個外部的(cross site)站點時, 這個 頁面會執行一些js腳本, 而這個腳本會"悄悄的"執行, 它不會有什麼輸出和彈出框, 可是實際上它的代碼 是在和你的站點之間進行交互, 如發生數據, 請求和響應信息, 從而盜取你的站點上的cookie / session 中的信息...
爲何表單元素的jquery選擇器要直接用冒號 :選擇器?
由於表單元素用input type="..."的較多, 若是仍是用屬性選擇器, 就會顯得比較麻煩, 因此就直接用 冒號選擇符來選擇了, 如: $(':submit')
注意, ueditor提供的api等函數, 是供前端頁面使用的, 後臺php頁面是沒有辦法使用這些函數api的
在使用一些外部的框架的時候, 若是要"排錯/debug/修改功能"時, 能夠 在外部css/js中調整, 也能夠 直接修改 源代碼!
ue和um的區別? um是ue的精簡版, 主要用在百度貼吧, 其中ue使用的是iframe結構, 而um使用的是div的 結構! 如今使用的較多的是 v1.4.3版本
overflow: 並非一個固定的總體, 能夠分別設置: overflow-x, overflow-y: auto;
如何判斷是否有最後一行的空格?
在editplus或vim中有行號的狀況下, 若是有空格的空行, 是會顯示行號的
對於php文件, 惟一的是 要在 文件的開頭, 加上 <?php
標籤就行了
正則表達式中的 \s \S \b 的區別?
\b表示 border, 邊界, 包括 單詞/字符的 "開頭, 結尾, 空格 回車等 位置", 注意匹配的是位置,不是真的字符, 它不匹配字符的;
\s表示 space, 空格, 是要匹配 "空格字符"的
.點號表示的是任意字符.
表示的是任意個數(包括0個, 即沒有)
所以, 若是沒有字數限制的話就是 : (.) 如 a(.*)b能夠匹配: ab, a1b, a12b, ...
而 大寫的\S則表示 否認的 意思, 即 \S表示 非空字符...
->add($data);
可是一般的作法是 先建立數據對象, 而後再 直接調用 空 參數的add, 或 save方法: $M->data($data)->add();
數組的方式有 兩種定義: 一種是 採用中括號的方式, 如 $data['msger'] = $msger; ....
的方式, 另外一種是 採用 數組定義的方式: $data =array('msger' => $msger, ....);
可是好像 第一種方式比較經常使用, 可是二者的結果很明顯是同樣的!
tp數據庫操做對字段 的過濾和選擇,使用 field方法, 一是, 在select的時候, 使用field方法, 只是查詢 你須要的字段, $M->field('f1, f2,f3')->select();
field字段也支持as別名, 對於複雜的別名/聚合函數操做, 就使用數組的方式; 另外一種是 和create方法結合使用, 建立數據對象: if($M->field('f1,f2,..) ->create()){$M -> add(); 或 $M -> save(); .....};
這樣即便post有不少字段, 操做時也只有過濾後的字段 被寫入. 這樣就實現了一種安全機制..
關於註冊/登陸/發表 等操做成功時, 是否須要給予提示?
建議是:不要提示註冊成功, 直接引導用戶到 想要進行的操做就行了...
用來註冊的 from,當註冊成功後,再顯示提示信息沒有任何意義。
你能夠用 不少方法來讓引導用戶 讓他知道已經註冊成功了,好比,原來不能下載的,下載連接出現了,原來不能看的內容,如今顯示出來了能夠。用戶註冊就是爲了繼續他未能完成的操做。
$this->display();
顯示對應的 html頁面, 不然的話, 會出現" 觸發啓動 迅雷" 等莫名其妙 的問題?! $this->success('跳轉提示', '$jumpUrl跳轉地址', '等待時間$waitTime' );
最重要的就是這裏的 跳轉地址了;調用的模板 的參考起始位置是::: 同一個控制器如, AnnController , 所對應的 View視圖目錄/控制器名稱目錄Ann/下的模板文件.
, 老是在同一控制器對應的視圖View/ControllerName/目錄下的html頁面;用tp的where方法時, 條件一般用 $condition 或 $map 來表示, 支持 字符串 和 數組方式, 若是條件中, 有變量的話, 最好仍是用 數組的方式. 並且, 使用sprintf的方式, 是爲了 格式檢查, 增長額外的 安全性, 那麼這時, where方法就包含兩個參數了, 一個是 "格式字符串", 另外一個是 傳遞的 變量數組...: $M -> where('id=%d and username=%s and passwd=%s', array($id, $username, $passwd))
html中可使用 頁面中的 javascript的變量值.
調用success方法的時候, 自動會調用 ThinkPHP/Tpl/dispatch_jump.tpl, 並將你設置的success參數, 做爲模板變量, 傳遞到 ThinkPHP/Tpl/dispatch_jump.tpl 生成內容輸出. 同時, 若是你處理提交的頁面, 還調用了 display方法, 那麼對應的 方法的視圖html內容, 還會接着輸出.
對於Application來講, 咱們使用的是mvc模式, 提供的是View視圖目錄.HI 而對於Thinkphp來講, 他的目錄使用的是 模板 模板技術, 因此目錄是Tpl. 即 應用程序只有View沒有Tpl, 而Thinkphp只有Tpl沒有View
根下包含的是:
可是前面提到的那些, 都是跟 核心庫 平級的內容.
核心的Library庫目錄, 包括: 行爲Behavior(實際上就是面向切面的設計模式, 就是對於全部的類對象, 都是一致的 "行爲", 封裝起來的東西), 開源組織提供的庫Org(主要包括Net, Util工具類庫), Think提供的核心庫, 第三方開發商提供的類庫Vendor.
THINK_PATH, 是 ThinkPHP框架的路徑; 不是 Library/Think的路徑~
LIB_PATH, 是Thinkphp下的庫路徑, = THINK_PATH.'Library'.'/';
BEHAVIOR_PATH
CORE_PATH, 這個纔是Controller,Model, Session等支持mvc模式的類庫, 即 Library目錄下的 Think目錄!
VENDOR_PATH
thinkphp中的 "系統變量"?
$
, 而在value屬性後面須要帶value值的時候, 就要使用系統變量的值: 就要加上 $
, 即<empty name="Think.post.some_var" value="$Think.get.var2"> ....</else> ...</empty>
若是客戶端沒有使用ajax提交, 那麼在Controller中即便你調用了ajaxReturn, 也只是返回了數據, 也只是直接顯示在當前方法對應的html頁面中。
可使用login, logout或對應的一組: logon, logoff. 並且, login等寫在一塊兒的, 一般做爲名詞,分開寫的log in等一般做爲動詞...
==================================
$.post(url,[data],[callback],[type])
經過遠程 HTTP(get、POST)請求"載入信息", 他的目的只是爲了(在頁面html已經載入了的狀況下,)而不從新刷新/從新載入當前頁面的狀況下,再次向遠程頁面請求 載入一些 額外的信息.(一般是和頁面中的一些jquery 點擊事件相結合使用)。
最重要的是,js方法中的缺省值跟C/C++等語言中的缺省值,使用方法是不一樣的, 後者必須按順序, 缺省值必須在最後。 而js的缺省值,是能夠不按順序的,若是有多個缺省值,前面的缺省值沒必要/不是必需要 寫出來的。
$.post();
{'arr[]': [1,2,3]}
的形式key:content
的方式實際上, jquery對文檔dom的處理也是比較簡單的.
若是用jquery來做ajax就很是簡單, 省略隱藏包裝了不少的細節:
$.ajax(url,[settings]);
, 另外一種更直接, 就是一個settings, 把url都放入到settings中去了, 即: $.ajax([settings]);
ajax返回的類型有: xml, html, script, json, text.用得較多的是後面的四種,xml用得比較少:
_ 純粹的文字,字符串, 用text?
load, 若是要傳遞參數, 默認的方式是Post!
$.ajax, 就使用1個參數, option/settings. 把url也融合進去.
注意區別 : type. dataType, data三個參數的區別, 比較容易混淆...
注意區分ajax的選項參數, 比較接近, 容易混淆
type和datatype:
type是指http 傳遞的方法, 是get仍是post?
dataType: 是指返回的數據類型text, html等等
而data: 則是要傳輸的數據, 可使用{key1: val1, key2: val2}的方式, 也可使用 url地址傳值的方式: data:"k1=v1&k2=v2" ,注意這裏使用的就是等號不是冒號了!
在寫完 url後, 立刻就是寫這三個類型的值: type, dataType, data.
匯合 merge($this->config, $config), 其中 $this->config 是類對象 成員protected config 是默認的設置. 固然還有其餘的一些設置...如useImgBg, useZh,...
配置的時候, 能夠用 $config數組
, 也能夠用動態設置 成員變量的方法. 即先new對象, 而後,設置這個對象的成員變量.是由於Verify類中, 有一個公共函數: public function __set($name, $value)
這樣就保證了在外部 用 $Verify -> attribute = value
的形式時, 調用這個 public的魔法函數.
注意區別php和C++類在定義成員函數 上的不一樣, C++雖然也可能夠直接在類中聲明 並 定義 成員方法, 可是那一般只限於 inline內聯方法, 主要的仍是,先聲明, 而後在類的外部進行實現. 而php的成員方法/函數, 是不用聲明, 並且是在 類的內部 直接實現的.
NOW_TIME: 是thinkphp中定義的 時間戳 常量, 表示當前的時間戳....
獲取session中的 驗證碼: $secode=session[$key]; $secode['verify_time']....
因爲使用了mvc, 從而使得"視圖"和"控制器"分離, 即html頁面和php邏輯分離, 避免了html頁面夾雜php代碼的狀況.
php等支持對象的語言中, 雖然默認的訪問權限是public, 可是爲了嚴謹和效率, 應該明確的寫出 訪問權限是public仍是protected private等.無論是成員變量仍是成員函數都應該是這樣.
注意 Verify::check方法, 返回的是boolean,即驗證碼是否正確. 而entry方法, 返回的是void, 直接就生成繪製出了 驗證碼圖像.
其實thinkphp的架構仍是比較"簡單"的, 或者更準確的說, 是:很明晰清楚的:
Michigan: [misig2n],密歇根, 密執安州, 湖, 區.
Wisconsin: 威斯康星州, 威斯康辛州.
Philip Katz: 卡茲. zip算法的創始人.
PKzip就是卡茲zip
ARC收費壓縮->pkArc->幾周後 PKZip ->自由軟件戰勝商業公司的傳奇.
PKZIP創建和統治了DOS時代的壓縮標準。直到Windows的誕生,使用卡茲創造的壓縮算法的軟件Winzip的出現更使ZIP格式成爲Internet的傳輸標準,ZIP格式也成爲壓縮文檔的事實標準。
gzip是gnu下的linux的壓縮工具.
能夠調用imgageCreate(int x_size, int y_size)建立一個空白文件, 而後, 輸出imagePng(...), 實際上, 能夠直接使用 TP的 Library\Think\Image類來使用php的繪圖函數, 它把php的原生函數作了封裝..
可是要注意到是: 輸出image的時候, 要用header函數作類型聲明: Content-type: image/png...不然若是是text/html, 則不會輸出圖像, 而是輸出的圖像的二進制編碼亂碼.
winzip: 比winrar的壓縮速度快2倍, 可是不支持rar和iso格式...
class IndexAction extends BaseAction { public function _initialize(){ // 若是子類存在initialize,則不執行父類的內容 parent::_initialize(); // 加上這一句,才執行父類的初始化函數 echo "hello I am child"; }
在寫zen coding / emmet的時候, 它的寫法徹底就是參考 jquery的 選擇器的寫法來的, 包括: 標籤名,類, id, 屬性選擇器等, 這裏要說的是, 在寫inuput這樣的表單元素時, 要寫表單的類型, 能夠直接使用 input:text/password等形式, 而不是採用 [type=text]等的屬性樣式. 並且 emmet還會給你添加一個 id 和 name在開頭和結尾...
<p><input id="" type="text" name=""></p> // input的屬性通常要寫的是這三個屬性, 並且順序是: id, type, name, 這三個是有講究的: 第一個id, 是供前臺js用的; <p><input id="" type="password" name=""></p> // 最後一個name是供後臺 post/get獲取表單值用的.
<php new... entry.../php> 這種方式的
在tp3.2.3, 中, 生成驗證碼的方法 跟3.1 不一樣, 3.1是要 import('ORG.Util.Image'); 而後 調用 Image::buildImageVerify(...)
, 而3.2.3 , 則直接將Verify這個類, 放在了 TP\Library\Think這個namespace中, 直接就是一個 類: Verify, 經過這個 類的方法 entry來生成 驗證碼了, 在3.2.3中, 有Library\ORG\Util, 可是已經沒有 Image這個類了! 卻是在 \Think下, 有Image這個類, 提供對圖片的縮放/水印, 裁剪等操做...
最重要的是, 要了解 這個 模板 替換常量: _ _URL_ _ 和 _ _APP_ _
namespace Behavior; class MyCustBehavior { // 全部的行爲擴展 的入口執行函數 必須是: public function run (&$foo){ .... // 一般在這裏引用, 類的private 函數或 protected 函數.... } }
public function run(&$content){...$this->templateContentReplace($content)...
$replace = array(....)
, 它的實質上, 是一些 URL 地址的 替換! 主要是用來 在 引用/ success/form表單的頁面跳轉/ 驗證碼等圖像地址引用時的 一些頁面地址.. 包括了從 根網站 到 當前頁面 的地址, 的所有替換: __ROOT__, __APP__, __PUBLIC__, __MODULE__ __CONTROLLER__ 這個controller的URL地址, 就等於 __URL___, 這裏記住了, 常常看到的__URL___就是 __CONTROLLER__ 當前控制器所在的 瀏覽器地址欄的地址URL __SELF__, 這個self, 是對 __SELF__這個變量作了一次 htmlentities函數處理 所以, 使用得較多的是, __URL__, 固然也可使用__CONTROLLER__
關於驗證碼的資源文件, 都是在 \Think\Verify\目錄下的, 包括: 中文字體文件夾: zhttfs, 英文字體文件ttfs, 背景圖片文件夾: bgs, 默認的驗證碼使用的是, useNoise => true, useCurve => true, 默認的是使用噪點使用曲線, curve曲線使用的是 正弦曲線, 中文字體使用 zhttfs字體文件才能正常顯示!
注意, 3.2.3的驗證碼字符類型, 默認的就是從 codeSet=>'2345678abc..'中去獲取的, 沒有0, 1, 9 避免跟字母0, l等相混淆, 因此3.2.3 就沒有全是英文字符, 全是數字, 數字和英文字符混合的說法了...自動的就是 從數字和英文字符集中隨機抽取.... 若是使用中文, 就要設置, useZh => true, 那麼就會自動的從中文字符集中選取: zhSet=...
onpaste ="return false; ondragenter =" return false;"
就表示阻止粘貼, 阻止拖放文字... onclick = "submitClick(); return false;
就表示阻止默認的提交行爲....這種用法具備 通用性...style="ime-mode: disabled;"
參考: https://www.lidaren.com/archives/1240 http://www.jb51.net/web/78327.html
可是, 使用ime-mode: disabled; 是 css3 的用法, 有些瀏覽器是不兼容的, 如windows下的ff, 設置使用了 `style="-moz-ime-mode: disabled;" 都不能禁止輸入中文, 所以, 要將樣式表和js 結合起來使用: