new Image(寬度,高度) $(image).attr('src', ...).load(function(){....})
load表示瀏覽器從服務器下載(裝載)對象完成, 這個load方法很重要, 能夠由瀏覽器自動判斷一個對象, 或者一個節點是否裝載、下載完成了javascript
new Image的時候, 內存緩存中 的圖像 如何裝載進來, 要加入到文檔的某個節點中來才能 生根,才能顯示??php
使用 ajax事件:瀏覽器系統會自動檢查 ajax的(全局)開始和結束, 以及每一次ajax請求的開始和結束,要把這些ajax事件註冊到你須要顯示和隱藏的節點上,這個一般是div或者下面的 圖片?css
顯示圖片的jquery方法 一般是用show, 而隱藏的時候,須要選擇恰當的方法了:html
可是, 若是你以爲hide消失得太快的話, 就要用fadeout或者用 animate的方式。 animate更靈活,它支持兩個參數,一個是效果的js對象, 另外一個是過渡的時間,多少毫秒(在jquery的效果函數中, 0 表示立刻顯示或隱藏)前端
也能夠用 一個非標準的css樣式:opacity: 透明度,等於0表示隱藏, 1 表示顯示, 這個非標準的css樣式,能夠由jquery來封裝隱藏底層差別java
jquery能夠緩存從服務器交互取得的數據, 這樣之後若是須要再次使用這些數據的時候,就直接用本地緩存,而沒必要再次從服務器上去取數據,這樣反應會更快。 使用的函數是 data. data('緩存數據的名稱',緩存數據內容data) 以及取數據的方法是:data(‘緩存名稱');mysql
要讓圖片和文字同一行顯示(並且高度一致), 對圖片使用css的float樣式??jquery
php緩存技術, (csdn thinkphp緩存技術 think2me)web
tp以及 普通瀏覽器是如何判斷 一個請求是不是 ajax請求的?ajax
:是經過 服務器變量 $_SERVER 來判斷的:
即:
define('IS_AJAX', ( (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest')|| !empty(($_POST[C('VAR_AJAX_SUBMIT')])) || !empty(($_GET[C('VAR_AJAX_SUBMIT')])) )?true:false );
if(!IS_AJAX) {$this->error('錯誤提示'); }
而後, 纔是 對 ajax 提交的處理,一般步驟是: 第一, 邏輯執行, 準備好ajax 返回的數據data: 第二, data一般是本身 組裝的數組, 這個數組 一般應該包含(固然具體是由你本身來決定的) 執行狀態status (根據不一樣的情形返回ok 或false), 具體的處理值; 第三, 調用 控制器的 ajaxReturn方法: $this -> ajaxReturn($data);
這裏返回的是數組, 在前端的時候, 就已經被 jquery的 post或 get請求轉換成json 格式的 js對象了, 就能夠直接使用 js對象的點語法 或 中括號語法 了 ???
mysqli是用面向對象的方法寫的, 而mysql是用c面向過程寫的. 因此, mysql中的函數都有前綴mysql_, 而mysqli中的對象中的成員方法則沒有這個前綴.
mysqli使用的是 持久性性 鏈接
一個簡單的例子:
$db = new mysqli('localhost', 'root', '123', 'testdb'); $res = $db -> query('select * from tablename'); $row = $res -> fetch_assoc(); echo $row['id'];
注意, mysqli中的 fetch_assoc 只是取得 結果集的 第一行數據 做爲 一個 一維數組.
protected function ajaxReturn($data,$type='',$json_option=0) { if(empty($type)) $type = C('DEFAULT_AJAX_RETURN'); switch (strtoupper($type)){ case 'JSON' : // 返回JSON數據格式到客戶端 包含狀態信息 header('Content-Type:application/json; charset=utf-8'); exit(json_encode($data,$json_option));
首先, 它是一個 protected 方法, 只能在控制器的 內部被調用;
其次, 要注意 這個函數 沒有 返回值! 它的目的, 只是對要 經過ajax返回 的數據 $data 進行 一次 "格式轉換" 而已. 其實, 你要處理客戶端的ajax請求, 徹底 能夠 不用到 這個 函數. 由於, 在 query的 $.get或 $.post的參數中, 你指定了 處理ajax請求的 服務器端方法了, 好比ajaxHandler, 那麼 你直接在控制器的 ajaxHandler方法中 進行業務處理, 組裝好 要返回的 數據(一般是數組$data), 而後你直接echo 這個數據就行了, 這個數據 就能夠在 前端被 獲取到. 或者: 在 echo以前, 你本身手動的 調用一次 json_encode, 將數組轉換爲 json形式/格式 的字符串string.
使用 jsonReturn只是 對 ajaxHandler中 要返回的數組 $data 進行了一次 "格式"包裝而已 : 首先在頭部進行了聲明:header('content-type: application/json; charset=utf8'); 而後 exit(json_encode($data, $json_option); 若是是 其餘非json格式, 則作相應的其餘處理
json_encode($value, $option); 其中的option是常量, 主要是 指示 要轉換的數據$value中 的 一些特殊符號 該如何處理. json_encode返回值是一個 string 或false.
注意 $.get或 $.post 接收到 json格式 返回的數據, 已經就是 一個 js對象了.
js的對象, 能夠用 大括號 來表示, 所以, 這個大括號{ }能夠看作是一個 集合! 能夠將js對象, 能夠看做是 不少個 屬性的 集合; 也能夠看作是 多個 key: value 鍵值對的 集合.
因此, js的對象 有多種 aliases 別名: 在用法和理解上, 就等同於 關聯數組, 字典, 映射, 哈希表, 查詢表等等, 均可以.
因此, js的對象 的屬性, 在 引用方法上, 就有 兩種方法,
一種是用 點號(點符號)來引用. 一種是用 中括號標記 來引用
可是要注意的是, 若是 使用 使用點號來引用的話, 後面的 屬性名 必須是 一個 合法的 javascript標記: 若是不是合法的js標記,好比 是以"空格, 連字符- , 或數字 開頭的"非標準的 javascript標記, 則只能使用 關聯數組 的方式: 即用中括號的方式 來 引用.
因此 有時候, 咱們可能不知道, 不肯定 屬性名是不是 合法的js標記, 推薦 從此 無論在何時, 都使用 中括號標記 來 引用 js對象的屬性. 由於在中括號中的 屬性名, 無論原來是什麼 數字/空格/仍是對象等等, 都 會被 自動轉換成 合法的js標記 字符串! 是字符串.
js對象的屬性和方法 其實 並無 明顯的區別, 方法在這裏 只是 "能夠調用"的屬性 而已.
另外: js中的 eval雖然功能強大, 可是 仍是建議 "在任什麼時候候都應該 避免使用"這是 MDN上 權威 站點上的原話.
<script> alert({$ok}); //這裏 不加引號的話, 不會彈出, 由於會報錯: {$ok} 轉換後的 變量... undefined. alert({:U()}); // 這裏必須加上 引號, 不然會 報錯: 正則表達式... </script>
實做: 用cookie 模擬網站登錄, 顯式權限, 跳轉, 退出, 時間設置爲一週, 多個頁面跟蹤用戶的cookie.
php中跳轉, 除了用框架的 redirect, success, error等 "封裝"方法, 還可使用 header方法: 即 header('location: jumpto.php'); 要注意, 只要發生 跳轉後, 執行header中的 跳轉後, 其後面的代碼就不會再繼續執行了, 相似於 die, exit等.
在原生的 php鏈接/登錄數據庫, 判斷是否成功, 方法是 : 判斷 sql 查詢 語句執行結果 $result的 屬性 num_rows 是否大於等於1.
其中 mysqli 的 fetch_assoc是獲取結果集的第一行數據.
網站登陸是 用 "登陸" login, logout, 註冊是: sign(sign up) 跟 "登錄"沒有任何關係.
若是是本身寫的 站點頁面, 沒有使用框架, 那麼 公共的 通用的內容, 就放在 common.inc.php文件中, 使用include機制 來包含. 好比數據庫鏈接的代碼.
在本身寫的頁面, 判斷 要登陸的用戶 在後臺數據庫中 是否存在, 就只是查詢 用戶的名稱(where子句中) 所對應的id是否 存在就行了. 沒必要查詢更多的額外字段, 好比: select id from user_table where name= name_in_post;
html的表格, 也有 caption 屬性, 相似於 html的title 標籤.
必定要寫 img標籤的 alt屬性(這個是在圖片 不能顯示/被禁用, 未加載進來/網速慢時 顯示的 關於圖片自己的描述文字信息) , 而img的 title屬性 則是 提供 關於這個圖片的 其餘的 輔助性的 /說明用途等 的文字信息, 即: alt和 title的 語義 是不一樣的.
在php代碼中, 即便是 原生的 php代碼中, 你能夠將 變量 $var放在 大括號中, 即{$var}, 相似於 tp的寫法. !注意不能是 將 大括號放在 $ 後, 好比: ${var}這樣是不行的, 這個是 bash的寫法. ! 可是 必須將{$var} 放在引號中, 不然會出錯. 即必須是 "{$var}" 並且, 當 使用 大括號後, 裏面的內容就根引號外面的內容 隔離了. 即這個時候, 你在 裏面任意的使用 引號, 都是能夠的, 都不會引發 引號的嵌套問題:
即 "{$post["name"]}"
的寫法是沒有問題的.
在設計mysql數據庫表/中的 用戶是否具備 某種 權限時, 可使用 數字 0/1 來表示 "沒有/有"對應的權限就行了. 這時候,這個數據類型能夠設爲 tinyint. 默認的 tinyint是 tinyint(4) 表示顯示時, 最多顯示4位數字.
zerofill是一種 字段的 屬性描述specification, 如同 unsigned. 它 而不是系統的 全局變量, 因此 你用 `show variables like '%zerofill%' 會顯示 empty.
好比 一個字段 用 zerofill描述: pay_type tinyint(4) unsigned zerofill NOT NULL DEFAULT '0000' COMMENT '支付方式:1卷皮系統 2支付寶 3銀聯 4財付通 ……',
這是一個 較好的例子, 在實際生產系統中, 定義字段的時候, 要寫完整, 好比: field_name tinyint(4) unsigned zerofill/字段數據類型屬性 not null/是否爲空 default '0000' comment '...',
數字類型括號中的數字, 根varchar(10)中的數字 其做用是不一樣的! 前者只是表示 顯示 寬度. 跟數據的存儲個數不要緊. 後者就真的表示 容許存儲的最大字符數. 注意 在mysql中 , 字符是不分("高低貴賤")的:即 一個中文字符, 英文字母, 數字, 都表示的是mysql中的 一個字符. 即varchar(10)既能夠存放10個英文字母, 也能夠存放10箇中文漢字.
要注意, 若是你插入的數據中, varchar(10)字段的內容 超過了 10, 它會自動 給你 截斷的 . 即最多給你保留 10 個 mysql字符.
mariadb 修改列, 有三種狀況, 使用不一樣的謂詞: 1. alter column column_name ... 這個是用來設置或刪除默認值的; 2. change column old_name new_col_name column_definition 這個change是用來修改 列的名稱的; 3. modify column col_name col_definition...
服務器向客戶端發送信息,依次是 狀態信息,頭信息,實際內容,所以,在setcookie ,header等函數以前, 不能有實際的內容輸出(由於這時候的輸出內容是不能被識別的,而且會引發頭部信息的錯誤。
你能夠查看cookie文本文件, 固然就能夠修改這個文件的內容. 每一個cookie 是$_COOKIE的一個元素.
同一個網站的全部cookie都是放在同一個文本文件中的. 同時,你也能夠設置單獨的 一個cookie爲一個數組.
當所有cookie過時後(刪除), 該cookie文件就 不存在了.
cookie更持久, 但容易被修改, 能夠經過加密的方式加強cookie的安全性
cookie能夠看作是商家給顧客發放的 會員卡, 本身保持, 而後購物時本身主動出示會員卡.
session更安全保存在服務器端. 但有效時間短, 一次訪問網站頁面關閉後,就失效. 可是session的id是保存在客戶端的cookie中的.
會話控制,是在多個頁面中跟蹤標記同一個用戶, 其中的session和cookie是網站開發中不可或缺的。
網站請求的http機制, 是無狀態的, 就是指 即便 是 同一個用戶 訪問同一個網站的 兩個 頁面(即便是被看作超連接跳轉)(甚至是同一個頁面的刷新), 會被看作是 兩個獨立的請求,第一個頁面的信息, 請求變量, 設置等不會被帶到 第二個頁面(或者刷新後的頁面), 所以就須要一種信息保持機制, 就像粘貼板, 記事本同樣, 當用戶第一次登陸時,把這些登陸信息 記下來, 而後 當這個用戶 在這個網站中 的任意一個頁面時, 這些用戶信息均可以被公共的使用.
保持信息, 除了用cookie和session外, 還能用其餘手段嗎? 不能! 由於: 1. get和post只能在兩個頁面之間 傳遞數據, 而 2. 文件或數據庫的保持或持久化則是全部 用戶均可以被使用. 顯然不行. 登陸等信息 只能被 同一個用戶使用.
session要手動的啓動, 可是 tp已經在框架啓動時, 幫你啓動了.
要注意的是, cookie不是實時生效的, 第一次寫入後, 要等到第二次訪問時才能生效. 所以,要想實時生效, 能夠在 form表單 提交的處理php文件中, 輸出一段script, 在提交時就自動提早刷新一次: echo '<script> window.location.href = "..." </script>'
(即刷新不僅是refresh, 有不少方法均可以實現).
凡是經過 地址欄輸入url訪問, 或者是 經過 超連接a的 get傳參跳轉的, 都是get訪問/get請求; 只有經過表單 post提交的,纔是post請求.(固然form也能夠經過get請求傳遞數據, 可是通常不會).
關於php的鼠標/按鈕操做, 不要只固定一種思路,覺得只有 button, 只有onclick, 還有新的思惟方式, 就是使用 超連接! 經過超連接a的操做, 有一個好處是, 能夠 在php文件中, 經過 $_GET來獲取數據並進行邏輯處理.
可是, 若是你想在 後臺的 php文件中, 獲取數據並處理的話, 就使用 a超連接...
當表單所在頁面 被刷新的時候, 表單就會被從新載入(即從新從服務器上下載該頁面/或者從緩存加載). 這時候, 原來填寫的內容就會消失了, 回到空的初始頁面狀態.
頁面的刷新(從新載入), 除了按f5外, 還有表單的再次提交, js腳本的/ php的header函數: location.href
是動做, 是操做的意思. 即: 當表單提交時, 將執行什麼操做, 這個操做, 正好是 mvc框架中 action操做的意思,
注意, 若是action="" 就表示提交到當前頁面進行處理. 在不少demo中就這樣
tp框架自動 已經對session進行了啓動, 在convention.php中, 有 SESSION_AUTO_START => true
, 因此能夠在 文件中直接使用session的函數了.
session 有緩存的, 設置, 獲取等函數,
要刪除某一個session, 即session數組中的某一個元素, 使用 session('name', null);
若是要刪除全部的session 元素, 直接用 session(null)
要刪除session文件自己, 銷燬session這個數據, 用session(destroy);
isset是判斷變量是否設置過, 在全部聲明或定義變量的語句中, 只有 明確的說 $var=null時 isset返回false, 其餘都會返回true.
可是isset只能接收 原始的 簡單類型的變量, 不能接收 一個函數的返回值來 判斷.
所以, 要判斷一個函數的返回值 是不是 isset, 是不能用 isset(func())的, 要用 null !== func() instead. 好比: echo (isset(I('post.name')))?'設置了name':'沒有設置';
這樣是錯誤的, 應該: echo (null!== I('post.name'):'設置':'沒有設置'
或者直接用 簡單變量,不要用 I函數. echo isset($_POST['name'])? '設置': '沒有設置';
**特別注意, 判斷一個變量是否設置, 最好不要用I函數, 由於 I函數有 反作用, 它會設置 一個默認值, 因此即便在 原來的 $_Post變量中沒有判斷的索引變量, 也老是返回true. 因此 要用 $_POST['flag'] 自己原生的 數組來判斷. **
include的屬性file, 能夠有兩種指定方法,一是使用 模板表達式 Home@Public(公共控制器)/header(操做), 可是這個模板表達式中的控制器和操做也只是一種形式(至關於目錄結構)並不強制要求真的有 那樣的控制器和操做; 另外一種方式是使用 模板文件 (要從./Application...開始指定絕對路徑)
再就是 被包含的模板文件無論用 模板表達式仍是 模板文件的方式, 都必須是 *.html結尾的文件, 多是在 "模板引擎設置" 中進行了限定TMPL_template_suffix => '.html' // 默認的模板文件後綴
也就是說, 只有 .html 才被認爲是模板文件, 才能被 include所用.
還能夠由 include標籤中, 給被包含文件傳參, 要注意這個傳參,不是 控制器/操做的傳遞變量, 在被包含文件中, 使用 中括號 方式 引用include的傳參: [這裏是include的傳參]
get_defined_constants(true);
div和table從語義上來說: div是內容分塊; table是表格, 在語義上就是用來 表達 二維數據的
在顯示方法上的區別: div是即載即顯示, 而table是加載徹底後 才顯示.
在佈局上, 先期使用table, 後來使用 table+div(因此 會看到不少 在 表格的列 td中使用 div的), 後來徹底使用div.
div+css雖然靈活, 可是也會在一些結構上引發 困惑和帶來複雜度... 而css的兼容性並不太好. 並且外部引用css文件, 對後臺web服務器的壓力很大??
因此: 若是是一箇中小型的 web應用, (或是主要給一個公司使用的)網站, 使用table來佈局是合適的, 並且開發效率要快得多. 或者是 使用 table+div(表格+div結合css)是合適的.
<frame...> </frame>
的方式<frameset rows="100, *" frameborder="1" framespacing="0" > <frame src="header.php" /> <frameset cols="140, *" > <frame src="navi.php" name="navi" scrolling="no" noresize="noresize" > <frame src="content.php" name="content" marginwidth="50" marginheight="10" scrolling="yes" noresize="noresize" /> </frameset> </frameset> 在導航頁面中 <body> <div>導航</div> <ul> <li><a href="Home/Index/dz" target="content">dz</a></li> // 這裏每一個連接項, 連接的是各自對應的文件內容. <li><a href="Home/Index/jz" target="content">jz</a></li> // 最重要的是, 這裏的target正是右邊主div內容框架的name. <li><a href="Home/Index/xq" target="content">xq</a></li> <li><a href="Home/Index/xx" target="content">xx</a></li> </ul> </body>
window.onresize=function(){
if(document.body.clientHeight<700){
alert('禁止縮放');
window.resizeTo(document.body.clientHeight, 300);
}
} 寬度的設置同理.
??jquery實現, 根據瀏覽器窗口大小, 自動縮放圖片的方法?
瀏覽器自己就有一個 最大/最小的縮放值 (嗎?)
php的魔術方法, 能夠實如今類的外部 訪問它的私有屬性, 是 走 __get($name); 若是在 類實例化的時候, 設置了私有屬性的值, 是走的 __set魔術方法.
分頁類, 不一樣的分頁類, 在基本原理, 使用方法上都是 大同小異的, 在 最下面的 分頁字符串 徹底能夠 自定義 符合本身須要的 更復雜的html代碼..
爲何要使用框架, 框架的 開發速度更快, 你只須要專一於 業務/邏輯的實現, 其餘基礎結構已經幫你寫好了(即便你本身從0開始寫, 也差很少就是框架的這些內容, 可是還不必定寫得這麼好). 並且框架 更穩定/更可靠(就像給你作的廠房 電路不會扯拐, 管道不會堵塞, 不會時不時的停水停電), 更安全(病毒是由程序自動掃描你的代碼) 一般不會引發廠房崩塌, 漏水漏電.
如今開發網站的分辨率通常設置爲多少?
如今大多數人的電腦分辨率都不會小於1024768, (實際上更多的寬屏設置爲 1600900) 因此網頁的寬度設置爲 1000, 1100 都是能夠的, 而後兩端由margin自動留白.
表現。 最好是加上 min-width的css屬性, 能保證頁面正常。
注意div的width設爲 50%, 不是指顯示屏幕的50%, 而是指當前瀏覽器 窗口的 寬度的50%。
對於通常的前臺頁面, 一般的設計是: 頭部或底部的寬度是100%滿屏的, 中間內容是固定寬度、居中 的。
於 一個 上傳文件的相關信息,又是一個數組。 而 uploadOne 是隻上傳一個文件, 所以返回的結果 就只是 關於這一個 上傳文件的相關信
息 它就是一個一維數組。
事實上, 返回的信息, $file確實就是 對 原生的 超全局變量 $_FILES數組 的一個封裝。
的格式換」處理, 所以 若是要在後臺作這些 「樣式」的處理並不科學, 後臺只是輸出原始數據, 至於具體的 表現形式,好比ymd, Y_M/d
等等, 這個仍是交給前端 模板去處理。 因此 tp爲了知足這樣的目的, 提供了模板變量的函數處理,默認值處理等等,好比:
{$create_time|date='Y-m-d', ###}
求時刻, 差很少就是當前腳本的執行時刻。
須是 .class.php 其餘不要求, 好比 類是否要繼承自 Controller等都不是命名規範中所要求的。
配置中的filter全都是 針對 I 方法進行的設置, 過濾函數有 null, default_filter, var_filter.
U 方法和I方法是tp中的核心方法。 U方法的定義規則是:
U('地址表達式', [傳遞的參數'], [僞靜態後綴'], ['是否顯示域名']
僞靜態的後綴, 能夠本身輸入設置,好比是html, tpl等, 也能夠是 false/true. 表示是否使用僞靜態後綴
參數的傳遞, 有三種方式, 一是在地址表達式中一併寫, 二是單獨用字符串傳遞, 三是用數組進行傳遞. 一般推薦使用的是第三種方式, 將參
數放在 單獨的數組中.
**另外, 使用U方法 生成的地址是根據 當前的url模式 自適應生成的, 即在不一樣的url模式下, U方法地址均可以生成, 可是生成的地址字符串
卻不同.**
I函數是爲了獲取 傳遞過來的參數, 因此會有一個默認值, 即當傳遞過來的參數爲空的時候的默認值, 再就是一個過濾函數.