原文連接:http://www.cnblogs.com/oscn/p/3607757.html;略有修改php
1.判斷php短標記<??>是否適用,查看php配置文件php.ini中的"short_open_tag = On"
2.官方的標記<?php?> , <script language="php"></script>
3.單行註釋 //或者#
/*
多行註釋
*/
4.變量 $str 字母數字下劃線 ,數字不能做爲開頭,大小寫敏感,儘可能用有意義的英文。
5.註銷變量函數 unset($str) 檢查變量是否被定義 isset($str)
6.可變變量
$a = 'ok';
$ok = 123;
echo $$a; //可變變量 輸出123
7. 鏈接符.
$str = 'world';
echo 'hello'.$str;
8.轉義字符 \
$str="a'b\"c";
9.數組
$arr = array(34,6,9=>7,'abc','name'=>'付潭');
print_r( $arr ); //print_r() 用於輸出數組,而不是用echo
輸出結果:
Array ( [0] => 34 [1] => 6 [9] => 7 [10] => abc [name] => 付潭 )
10.數字
$str = 1;
echo 'asd'+1; // 1
echo '1'+1; //2
11.單引號 與 雙引號的區別
$str = '你好';
echo '$str'; //$str
echo '<br />';
echo "$str"; //你好 雙引號 能夠解析變量以及特殊字符"\n","\t"等等
$str1 = '你好\n是我';
$str2 = "你好\n是我"; // "\n" 屬於特殊字符(換行),所以雙引號能夠解析
$str3 = "你好\t是我";
echo $str1;
echo $str2;
echo $str3;
字符串中沒有變量的時候 ,儘可能使用單引號。
有變量的時候使用雙引號。
$s = 'nihao';
echo $s.'某某';
echo "{$s} 某某";
"貪婪模式" 解析變量直到不符合命名規則的字符
\ 轉義字符 將變量轉成普通的字符串
$ok = '你好';
echo "$okk"; //輸出爲空,貪婪模式
echo "{$ok}k"; //輸出「你好k」
echo "$ok k"; //輸出「你好 k」
echo "\$ok k"; //輸出「$ok k」,轉義字符
echo "$ok'k"; //輸出「你好'k」
echo $ok."k"; //輸出「你好k」
變量能夠包含中文
12.自定義字符串
echo '<img src="images/tupian.jpg" width=\'200\' />';
$str = "tupian.jpg";
echo '<img src="images/'.$str.'" width=\'200\' />'
//自定義字符串,標準格式
echo <<< ABC
<img src="images/$str" width='200' /> //中間當作 HTML區域 ,變量能夠直接寫
ABC;
第一行要頂格寫
第一行要獨佔一行,後面不能跟任何東西(包括註釋和空格)
最好一行也要頂格和獨佔一行
13.錯誤輸出
error_reporting(E_ALL | ERROR | PARSE | WARNING | NOTICE );
//在網頁中加入報錯程序代碼
14.常量與變量
a.常量通常用大寫,變量通常用小寫。
b.常量通常不加$,而變量必定要加$。
c.常量在函數內部直接就有效,不須要聲明爲全局變量。
同一個常量不能聲明兩次
15.變量的做用域
函數內部與外部沒有聯繫。
$str = 12;
function test()
{
//聲明全局變量,必須寫在函數內部,外面是沒有用的,並且是一次性有效。
global $str;
echo $str;
$str = 11;
}
test(); //12
function test2()
{
echo $str;
}
echo $str; //11
test2(); //不輸出
聲明靜態變量
function test()
{
static $a=0; //聲明爲 靜態變量 ,只在函數中運行一次,局部變量,只在函數內部有效
echo $a;
$a++;
}
test(); //0
test(); //1
test(); //2
echo $a; //輸出空
16.鏈接符.
echo '12' , $str , '23'; //在echo中 ,","要比"."更有效率,echo是惟一能夠用逗號當作鏈接符的
17.輸出
$a = array(2,57,8,9);
echo $a; //Array,能夠同時輸出多個字符串
print $a; //Array,只能輸出一個字符串
print_r($a); //Array ( [0] => 2 [1] => 57 [2] => 8 [3] => 9 )
18.引用
@ include('../inc/header.php'); //繼續運行,警告,@號不提示報錯,
require('header.php'); //終止程序,報錯
header.php直接複製須要引用的代碼,文件中不須要再寫頭部聲明文件等。
被引用的文件做用域相通,能夠直接引用裏面聲明的變量。
19.變量能夠定義兩次(後者覆蓋前者),而函數不能。
要注意引用的文件include('yinyong.php')/require('yinyong.php');不能與現有的函數有相同的。
php5中,兩個引用語句若是引用相同文件,會默認爲一個。可是爲保證兼容,不能寫重複。
20.include_once('header.php');/require_once('footer.php');只包含一次,會自動判斷有沒有引用相同的文件。但影響執行效率。
21.__FILE__,內置常量
echo __FILE__; //輸出文件的物理地址,F:\php\www\php_basic.php 只認代碼寫入的頁面,無論是否被引用。
echo dirname(__FILE__); //輸出文件目錄,不包括文件名,F:\php\www
include( dirname(__FILE__).'/../php_basic.php'); // 利用dirname()輸出文件地址,'/../php_basic.php'則表明當前目錄的上一級目錄中的php_basic.php文件。這是用的是正斜槓「/」,而不是由於地址欄上顯示的反斜槓「\」,由於只有windows能夠識別,正斜槓能夠兼容windows和linux系統。html
若是文件被其餘文件引用,include和require語句就必須寫成這種形式。mysql
「../」適合於簡單的一個文件包含於另外一個文件。
而dirname(__FILE__) 大多適合多層,更復雜多多文件包含,維護起來更容易。
若是僅僅是a.php文件包含b.php文件,能夠直接用 include的dirname(__FILE__)或者 「../」 都可,通常不會出錯的。
但每每是 a包含了 b文件,另外c.php包含了a文件
那麼使用 「../」 的話,就會形成c包含a時再載入b文件時路徑出錯,而使用dirname(__FILE__)時,c包含a時會以dirname(__FILE__)映射出c和a的路徑關係,a再到包含b文件時,使用dirname(__FILE__),會映射出a和b的相應目錄關係。這個就不會形成不一樣目錄屢次包含時路徑出錯!
注意: __FILE__,表明 這個代碼所在文件的文件名, 好比 c用dirname(__FILE__)包含a(此時就是c引用a時使用的是絕對路徑),那麼 __FILE__代碼是c文件的絕對路徑名,而c包含a後,a再用dirname(__FILE__)包含b時,那麼__FILE__在執行時就是a文件的絕對路徑名,這個依次類推,當c在調用時,經過絕對路徑找到a文件,a 文件又經過絕對路徑找到b。這樣的包含及路徑永遠也不會出錯!linux
若是隻是使用「../」 的話,c在調用時經過相對路徑找到a,這裏沒有錯,可是此時a裏面包含b的也是使用「../」,此時是相對於c 的相對路徑查找b,固然是錯的!web
前面兩篇有關於 php基礎知識筆記的文章都沒有介紹一下PHP的環境配置,下面就把相關的配置教程貼出來,解釋一下:我用的是APM Serv,至於下載地址就不貼了,問度娘吧。。sql
PHP環境配置: 數據庫
1.查找佔用80端口的程序 ,解除佔用以啓動APMServ。
window+R 快捷鍵打開命令運行窗口— cmd命令 — 運行‘netstat -oan’ —查找佔用80端口的程序的PID — 打開任務管理器 — 選擇查看 — ‘選擇列’ — 選擇PID —在進程中查找對應的PID停止程序。(附件—命令提示符—netstat -abno)編程
2.設置虛擬主機—新建主機域名—網站根目錄填入網站文件存放的位置—讀寫限制解除—重啓Apache—修改hosts文件—另起新的一行,將新建的主機域名寫在裏面。—打開新建的主機域名後,網頁會自動打開名字爲index的網頁文件做爲主頁。windows
3.在DW中新建站點—選擇「服務器」—修更名稱—鏈接方法選本地—文件夾選擇網站根目錄—WebURL選擇新建的虛擬主機域名。—取消「遠程」選項,勾選「測試」選項。數組
4.新建phpinfo.php文件—測試環境的運行狀況:phpinfo()。
PHP超全局變量:
PHP有九個超全局變量:
Note: 變量可用性
默認狀況下,全部的超全局變量都是可用的。可是,有一些指令會影響這種可用性。更多信息,參見文檔 variables_order.
Note: 處理 register_globals
若是已經棄用的 register_globals 指令被設置爲 on 那麼局部變量也將在腳本的全局做用域中可用。例如, $_POST['foo'] 也將以 $foo 的形式存在。
相關信息,參見 FAQ 「register_globals 對我有什麼影響?」
Note: 可變變量
在函數或類方法中,超全局變量不能被用做可變變量。
$GLOBALS — 引用全局做用域中可用的所有變量
一個包含了所有變量的全局組合數組。變量的名字就是數組的鍵。
Example #1 $GLOBALS 範例
<?php
function test() {
$foo = "local variable";
echo '$foo in global scope: ' . $GLOBALS["foo"] . "\n";
echo '$foo in current scope: ' . $foo . "\n";
}
$foo = "Example content";
test();
?>
以上例程的輸出相似於:
$foo in global scope: Example content $foo in current scope: local variable
Note:
「Superglobal」也稱爲自動化的全局變量。 這就表示其在腳本的全部做用域中都是可用的。不須要在函數或方法中用 global $variable; 來訪問它。
Note: 變量可用性
與全部其餘超全局變量不一樣,$GLOBALS在PHP中老是可用的。
$_SERVER 是一個包含了諸如頭信息(header)、路徑(path)、以及腳本位置(script locations)等等信息的數組。這個數組中的項目由 Web 服務器建立。不能保證每一個服務器都提供所有項目;服務器可能會忽略一些,或者提供一些沒有在這裏列舉出來的項目。這也就意味着大量的此類變量都會在» CGI 1.1 規範中說明,因此應該仔細研究一下。
$_SERVER['PHP_SELF']:當前正在執行腳本的文件名,與 document root 相關。舉例來講,在 URL 地址爲http://www.cnblogs.com/futan/archive/2012/12/18/php_admin-group-power.html 的腳本中使用 $_SERVER['PHP_SELF'] 將會獲得 futan/archive/2012/12/18/php_admin-group-power.html 這個結果。__FILE__ 常量包含當前(例如包含)文件的絕對路徑和文件名。
經過 URL 參數傳遞給當前腳本的變量的數組。
Example #1 $_GET 範例
<?php
echo 'Hello ' . htmlspecialchars($_GET["name"]) . '!';
?>
假設用戶訪問的是 http://example.com/?name=Hannes
以上例程的輸出相似於:
Hello Hannes!
Note:
GET 是經過 urldecode() 傳遞的。
$_POST 變量用於收集來自 method="post" 的表單中的值。從帶有 POST 方法的表單發送的信息,對任何人都是不可見的(會顯示在瀏覽器的地址欄),而且對發送信息的量也沒有限制。
Example #1 $_POST 範例
<?php
echo 'Hello ' . htmlspecialchars($_POST["name"]) . '!';
?>
假設用戶經過 HTTP POST 方式傳遞了參數 name=Hannes
以上例程的輸出相似於:
Hello Hannes!
使用$_GET和$_POST接收傳遞來的數據有一個問題,就是程序必須知道上傳來的數據具體使用哪一種方法。但實際上,不管是哪一種方法,都是傳遞數據給 WEB應用程序,它們的目的是同樣的。$_REQUEST數組屏蔽了這些細節,它封裝了$_GET、$_POST、$_FILE和$_COOKIE四個數組的內容,使咱們對這些數據能夠一視同仁。事實上,在JSP中,GET和POST的變量就是統一使用request.getParameter()方法來接收,只不過PHP中的$_REQUEST數組又封裝了Cookie的內容
Note:
以命令行方式運行時,將不包含 argv 和 argc 信息;它們將存在於 $_SERVER 數組。
Note:
因爲 $_REQUEST 中的變量經過 GET,POST 和 COOKIE 輸入機制傳遞給腳本文件,所以能夠被遠程用戶篡改而並不可信。這個數組的項目及其順序依賴於 PHP 的 variables_order 指令的配置。
這裏有必要給$_GET和$_POST以及$_REQUEST這三個數組作一個辨析:
注意:GET方法和POST方法並不矛盾,在POST方法中一樣能夠傳遞GET變量,將上面的post.php文件稍微改動一下,就成了這樣:
<!– post.php文件 –>
<?php
if($_POST['post']) {
foreach($_POST as $index = > $value) echo 「$_POST[$index] = $value」, 「<BR>」;
foreach($_GET as $index = > $value) echo 「$_GET[$index] = $value」, 「<BR>」;
}
?>
<form action=」post.php?act=login」 method=」post」>
<label for=」id」>賬號:</label><input type=」text」 name=」id」>
<label for=」password」>密碼:</label><input type=」text」 name=」password」>
<input type=」submit」 name=」post」 value=」提交」>
</form>
該程序同時處理了GET方法(act 參數)和POST方法(id 和 password 參數)的請求數據,GET方法的請求變量後綴在了表單action屬性值的後面,這樣只有一點問題,就是GET方法的請求變量不能由用戶來輸入。一般,固定的數據使用GET方法,由用戶輸入的數據使用POST方法來發送,兩種方法區分開了不一樣邏輯的數據。不過讀者在構建這種表單的時候,必定要注意兩種方法不要有相同的變量名,不然將出現不可預料的後果。最後,須要注意的是,當使用GET方法發送數據時,則 <form>標籤 action 屬性值中不能包含查詢字符串(即便包含也不會生效),因此,下面的表單中,act 參數將不能發送:
<form action=」post.php?act=login」 method=」get」>
<label for=」id」>帳號:</label><input type=」text」 name=」id」>
<label for=」password」>密碼:</label><input type=」text」 name=」password」>
<input type=」submit」 name=」post」 value=」提交」>
</form>
應該改爲下面的形式:
<form action=」post.php」 method=」get」>
<label for=」id」>帳號:</label><input type=」text」 name=」id」>
<label for=」password」>密碼:</label><input type=」text」 name=」password」>
<input type=」submit」 name=」post」 value=」提交」>
<input type=」hidden」 name=」act」 value=」login」>
</form>
建議:
咱們能夠來看php.ini中的配置 ; This directive describes the order in which PHP registers GET, POST, Cookie,; Environment and Built-in variables (G, P, C, E & S respectively, often; referred to as EGPCS or GPC). Registration is done from left to right, newer; values override older values.variables_order = "EGPCS"
這個EGPCS就是說明用$_REQUEST數組獲取內容的優先級,其字母的含義分別表明爲:E表明$_ENV,G表明$_GET,P表明$_POST,C表明$_COOKIE,S表明$_SESSION。後面出現的數據會覆蓋前面寫入的數據,其默認的數據寫入方式就是EGPCS,因此POST包含的數據將覆蓋GET中使用相同關鍵字的數據。經過這個咱們也能夠看出PHP獲取參數的步驟 環境變量=》GET=》POST=》COOKIE=>SESSION
Session指的就是用戶在瀏覽某個網站時,從進入網站到瀏覽器關閉所通過的這段時間,也就是用戶瀏覽這個網站所花費的時間。從上述的定義中咱們能夠看到,Session其實是一個特定的時間概念。 通常來講,在網站上某一個頁面中的變量(指服務器端變量,下同)是不能在下一頁中用的,有了session就好辦了。session中註冊的變量能夠做爲全局變量使用。這樣咱們就能夠將session用於用戶身份認證,程序狀態記錄,頁面之間參數傳遞。
當前腳本可用 SESSION 變量的數組。更多關於如何使用的信息,參見 Session 函數 文檔。
php中的$_ENV存儲了一些系統的環境變量,因環境不一樣而值不一樣.
但有時候$_ENV是空的,可能有如下緣由:
在 php.ini中的variables_order值爲"GPCS",也就是說系統在定義PHP預約義變量時的順序是 GET,POST,COOKIES,SERVER,沒有定義Environment(E),你能夠修改php.ini文件的variables_order值爲你想要的順序,如:"EGPCS"。這時,$_ENV的值就能夠取得了.
EGPCS值: (EGPCS是Environment、Get、Post、Cookies、Server的縮寫 -- 這是PHP中外部變量來源的所有範圍).
你能夠用foreach來遍歷$_ENV的數據,也能夠直接用print_r($_ENV)來打印這個變量,查看他的數據.
$_cookie 是一種在遠程瀏覽器端儲存數據並以此來跟蹤和識別用戶的機制。 PHP在http協議的頭信息裏發送cookie, 所以 setcookie() 函數必須在其它信息被輸出到瀏覽器前調用,這和對 header() 函數的限制相似。
PHP中的$_COOKIE和$_SESSION使用技巧
1.1 設置cookie:
能夠用 setcookie() 或 setrawcookie() 函數來設置 cookie。也能夠經過向客戶端直接發送http頭來設置.
1.1.1 使用setcookie()函數設置cookie:
bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, bool secure [, bool httponly]]]]]] )
name: cookie變量名
value: cookie變量的值
expire: 有效期結束的時間,
path: 有效目錄,
domain: 有效域名,頂級域惟一
secure: 若是值爲1,則cookie只能在https鏈接上有效,若是爲默認值0,則http和https均可以.
例子:
Php代碼
<?php
$value = 'something from somewhere';
setcookie("TestCookie", $value); /* 簡單cookie設置 */
setcookie("TestCookie", $value, time()+3600); /* 有效期1個小時 */
setcookie("TestCookie", $value, time()+3600, "/~rasmus/", ".example.com", 1); /* 有效目錄 /~rasmus,有效域名example.com及其全部子域名 */
?>
<?php
$value = 'something from somewhere';
setcookie("TestCookie", $value); /* 簡單cookie設置 */
setcookie("TestCookie", $value, time()+3600); /* 有效期1個小時 */
setcookie("TestCookie", $value, time()+3600, "/~rasmus/", ".example.com", 1); /* 有效目錄 /~rasmus,有效域名example.com及其全部子域名 */
?>
設置多個cookie變量: setcookie('var[a]','value');用數組來表示變量,但他的下標不用引號.這樣就能夠用$_COOKIE[‘var’][‘a’]來讀取該COOKIE變量.
1.1.2. 使用header()設置cookie;
header("Set-Cookie: name=$value[;path=$path[;domain=xxx.com[;...]]");
後面的參數和上面列出setcookie函數的參數同樣.
好比:
$value = 'something from somewhere';
header("Set-Cookie:name=$value");
1.2 Cookie的讀取:
直接用php內置超級全局變量 $_COOKIE就能夠讀取瀏覽器端的cookie.
上面例子中設置了cookie"TestCookie",如今咱們來讀取:
print $_COOKIE['TestCookie'];
COOKIE是否是被輸出了?!
1.3 刪除cookie
只需把有效時間設爲小於當前時間, 和把值設置爲空.例如:
setcookie("name","",time()-1);
用header()相似.
1.4 常見問題解決:
1) 用setcookie()時有錯誤提示,多是由於調用setcookie()前面有輸出或空格.也可能你的文檔使從其餘字符集轉換過來,文檔後面可能帶有BOM簽名(就是在文件內容添加一些隱藏的BOM字符).解決的辦法就是使你的文檔不出現這種狀況.還有經過使用ob_start()函數有也能處理一點.
2) $_COOKIE受magic_quotes_gpc影響,可能自動轉義
3) 使用的時候,有必要測試用戶是否支持cookie
<!--[if !supportLineBreakNewLine]-->
1.5 cookie工做機理:
a) 服務器經過隨着響應發送一個http的Set-Cookie頭,在客戶機中設置一個cookie(多個cookie要多個頭).
b) 客戶端自動向服務器端發送一個http的cookie頭,服務器接收讀取.
HTTP/1.x 200 OK
X-Powered-By: PHP/5.2.1
Set-Cookie: TestCookie=something from somewhere; path=/
Expires: Thu, 19 Nov 2007 18:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-type: text/html
這一行實現了cookie功能,收到這行後
Set-Cookie: TestCookie=something from somewhere; path=/
瀏覽器將在客戶端的磁盤上建立一個cookie文件,並在裏面寫入:
TestCookie=something from somewhere;
/
這一行就是咱們用setcookie('TestCookie','something from somewhere','/');的結果.也就是用header('Set-Cookie: TestCookie=something from somewhere; path=/');的結果.
<!--[endif]-->
PHP 的Session的使用方法以及安全問題和session的注意事項,session使用過時時間設爲0的cookie,而且將一個稱爲session ID的惟一標識符(一長串字符串),在服務器端同步生成一些session文件(能夠本身定義session的保存類型),與用戶機關聯起來.web應用程序存貯與這些session相關的數據,而且讓數據隨着用戶在頁面之間傳遞.
訪問網站的來客會被分配一個惟一的標識符,即所謂的會話 ID。它要麼存放在客戶端的 cookie,要麼經由 URL 傳遞。
會話支持容許用戶註冊任意數目的變量並保留給各個請求使用。當來客訪問網站時,PHP 會自動(若是 session.auto_start 被設爲 1)或在用戶請求時(由 session_start() 明確調用或 session_register() 暗中調用)檢查請求中是否發送了特定的會話 ID。若是是,則以前保存的環境就被重建。
2.1 sessionID的傳送
2.1.1 經過cookie傳送sessin ID
使用session_start()調用session,服務器端在生成session文件的同時,生成session ID哈希值和默認值爲PHPSESSID的session name,並向客戶端發送變量爲(默認的是)PHPSESSID(session name),值爲一個128位的哈希值.服務器端將經過該cookie與客戶端進行交互.
session變量的值經php內部系列化後保存在服務器機器上的文本文件中,和客戶端的變量名默認狀況下爲PHPSESSID的coolie進行對應交互.
即服務器自動發送了http頭:header('Set-Cookie: session_name()=session_id(); path=/');
即setcookie(session_name(),session_id());
當從該頁跳轉到的新頁面並調用session_start()後,PHP將檢查與給定ID相關聯的服務器端存貯的session數據,若是沒找到,則新建一個數據集.
2.1.2 經過URL傳送session ID
只有在用戶禁止使用cookie的時候才用這種方法,由於瀏覽器cookie已經通用,爲安全起見,可不用該方法.
<a href="p.php?<?php print session_name() ?>=<?php print session_id() ?>">xxx</a>,也能夠經過POST來傳遞session值.
2.2 session基本用法實例
Php代碼
<?php
// page1.php
session_start();
echo 'Welcome to page #1';
/* 建立session變量並給session變量賦值 */
$_SESSION['favcolor'] = 'green';
$_SESSION['animal'] = 'cat';
$_SESSION['time'] = time();
// 若是客戶端使用cookie,可直接傳遞session到page2.php
echo '<br /><a href="page2.php">page 2</a>';
// 若是客戶端禁用cookie
echo '<br /><a href="page2.php?' . SID . '">page 2</a>';
/*
默認php5.2.1下,SID只有在cookie被寫入的同時纔會有值,若是該session
對應的cookie已經存在,那麼SID將爲(未定義)空
*/
?>
<?php
// page2.php
session_start();
print $_SESSION['animal']; // 打印出單個session
var_dump($_SESSION); // 打印出page1.php傳過來的session值
?>
<?php
// page1.php
session_start();
echo 'Welcome to page #1';
/* 建立session變量並給session變量賦值 */
$_SESSION['favcolor'] = 'green';
$_SESSION['animal'] = 'cat';
$_SESSION['time'] = time();
// 若是客戶端使用cookie,可直接傳遞session到page2.php
echo '<br /><a href="page2.php">page 2</a>';
// 若是客戶端禁用cookie
echo '<br /><a href="page2.php?' . SID . '">page 2</a>';
/*
默認php5.2.1下,SID只有在cookie被寫入的同時纔會有值,若是該session
對應的cookie已經存在,那麼SID將爲(未定義)空
*/
?>
<?php
// page2.php
session_start();
print $_SESSION['animal']; // 打印出單個session
var_dump($_SESSION); // 打印出page1.php傳過來的session值
?>
2.3 使用session函數控制頁面緩存.
不少狀況下,咱們要肯定咱們的網頁是否在客戶端緩存,或要設置緩存的有效時間,好比咱們的網頁上有些敏感內容而且要登陸才能查看,若是緩存到本地了,能夠直接打開本地的緩存就能夠不登陸而瀏覽到網頁了.
使用session_cache_limiter('private');能夠控制頁面客戶端緩存,必須在session_start()以前調用.
更多參數見http://blog.chinaunix.net/u/27731/showart.php?id=258087的客戶端緩存控制.
控制客戶端緩存時間用 session_cache_expire(int);單位(s).也要在session_start()前調用.
這只是使用session的狀況下控制緩存的方法,咱們還能夠在header()中控制控制頁面的緩存.
2.4 刪除session
要三步實現.
Php代碼
<?php
session_destroy(); // 第一步: 刪除服務器端session文件,這使用
setcookie(session_name(),'',time()-3600); // 第二步: 刪除實際的session:
$_SESSION = array(); // 第三步: 刪除$_SESSION全局變量數組
?>
<?php
session_destroy(); // 第一步: 刪除服務器端session文件,這使用
setcookie(session_name(),'',time()-3600); // 第二步: 刪除實際的session:
$_SESSION = array(); // 第三步: 刪除$_SESSION全局變量數組
?>
2.5 session在PHP大型web應用中的使用
對於訪問量大的站點,用默認的session存貯方式並不適合,目前最優的方法是用數據庫存取session.這時,函數bool session_set_save_handler ( callback open, callback close, callback read, callback write, callback destroy, callback gc )就是提供給咱們解決這個問題的方案.
該函數使用的6個函數以下:
1. bool open() 用來打開會話存儲機制,
2. bool close() 關閉會話存儲操做.
3. mixde read() 從存儲中裝在session數據時使用這個函數
4. bool write() 將給定session ID的全部數據寫到存儲中
5. bool destroy() 破壞與指定的會話ID相關聯的數據
6. bool gc() 對存儲系統中的數據進行垃圾收集
例子見php手冊session_set_save_handler() 函數.
若是用類來處理,用
session_set_save_handler(
array('className','open'),
array('className','close'),
array('className','read'),
array('className','write'),
array('className','destroy'),
array('className','gc'),
)
調用className類中的6個靜態方法.className能夠換對象就不用調用靜態方法,可是用靜態成員不用生成對象,性能更好.
2.6 經常使用session函數:
bool session_start(void); 初始化session
bool session_destroy(void): 刪除服務器端session關聯文件。
string session_id() 當前session的id
string session_name() 當前存取的session名稱,也就是客戶端保存session ID的cookie名稱.默認PHPSESSID。
array session_get_cookie_params() 與這個session相關聯的session的細節.
string session_cache_limiter() 控制使用session的頁面的客戶端緩存
ini session_cache_expire() 控制客戶端緩存時間
bool session_destroy() 刪除服務器端保存session信息的文件
void session_set_cookie_params ( int lifetime [, string path [, string domain [, bool secure [, bool httponly]]]] )設置與這個session相關聯的session的細節
bool session_set_save_handler ( callback open, callback close, callback read, callback write, callback destroy, callback gc )定義處理session的函數,(不是使用默認的方式)
bool session_regenerate_id([bool delete_old_session]) 分配新的session id
2.7 session安全問題
攻擊者經過投入很大的精力嘗試得到現有用戶的有效會話ID,有了會話id,他們就有可能可以在系統中擁有與此用戶相同的能力.
所以,咱們主要解決的思路是效驗session ID的有效性.
Php代碼
<?php
if(!isset($_SESSION['user_agent'])){
$_SESSION['user_agent'] = $_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'];
}
/* 若是用戶session ID是僞造 */
elseif ($_SESSION['user_agent'] != $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']) {
session_regenerate_id();
}
?>
<?php
if(!isset($_SESSION['user_agent'])){
$_SESSION['user_agent'] = $_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'];
}
/* 若是用戶session ID是僞造 */
elseif ($_SESSION['user_agent'] != $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']) {
session_regenerate_id();
}
?>
2.8 Session經過cookie傳遞和經過SID傳遞的不一樣:
在php5.2.1的session的默認配置的狀況下,當生成session的同時,服務器端將在發送header set-cookie同時生成預約義超級全局變量SID(也就是說,寫入cookie和拋出SID是等價的.), 當$_COOKIE['PHPSESSID']存在之後,將再也不寫入cookie,也再也不生成超級全局變量SID,此時,SID將是空的.
2.9 session使用實例
Php代碼
<?php
/**
* 效驗session的合法性
*
*/
function sessionVerify() {
if(!isset($_SESSION['user_agent'])){
$_SESSION['user_agent'] = MD5($_SERVER['REMOTE_ADDR']
.$_SERVER['HTTP_USER_AGENT']);
}
/* 若是用戶session ID是僞造,則從新分配session ID */
elseif ($_SESSION['user_agent'] != MD5($_SERVER['REMOTE_ADDR']
. $_SERVER['HTTP_USER_AGENT'])) {
session_regenerate_id();
}
}
/**
* 銷燬session
* 三步完美實現,不可漏
*
*/
function sessionDestroy() {
session_destroy();
setcookie(session_name(),'',time()-3600);
$_SESSION = array();
}
?>
<?php
/**
* 效驗session的合法性
*
*/
function sessionVerify() {
if(!isset($_SESSION['user_agent'])){
$_SESSION['user_agent'] = MD5($_SERVER['REMOTE_ADDR']
.$_SERVER['HTTP_USER_AGENT']);
}
/* 若是用戶session ID是僞造,則從新分配session ID */
elseif ($_SESSION['user_agent'] != MD5($_SERVER['REMOTE_ADDR']
. $_SERVER['HTTP_USER_AGENT'])) {
session_regenerate_id();
}
}
/**
* 銷燬session
* 三步完美實現,不可漏
*
*/
function sessionDestroy() {
session_destroy();
setcookie(session_name(),'',time()-3600);
$_SESSION = array();
}
?>
註明:
session 出現頭信息已經發出的緣由與cookie同樣.
在php5中,全部php session 的註冊表配置選項都是編程時可配置的,通常狀況下,咱們是不用修改其配置的.要了解php的session註冊表配置選項,請參考手冊的Session 會話處理函數處.
session的保存數據的時候,是經過系列化$_SESSION數組來存貯,因此有系列化所擁有的問題,可能有特殊字符的值要用base64_encode函數編碼,讀取的時候再用base64_decode解碼。
PHP經常使用內置常量:
名稱 | 說明 |
---|---|
__LINE__ | 文件中的當前行號。 |
__FILE__ | 文件的完整路徑和文件名。若是用在包含文件中,則返回包含文件名。自 PHP 4.0.2 起,__FILE__ 老是包含一個絕對路徑,而在此以前的版本有時會包含一個相對路徑。 |
__FUNCTION__ | 函數名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該函數被定義時的名字(區分大小寫)。在 PHP 4 中該值老是小寫字母的。 |
__CLASS__ | 類的名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該類被定義時的名字(區分大小寫)。在 PHP 4 中該值老是小寫字母的。 |
__METHOD__ | 類的方法名(PHP 5.0.0 新加)。返回該方法被定義時的名字(區分大小寫)。 |
PHP經常使用的內置常量,上標是五個魔術常量。下面還有:
DIRECTORY_SEPARATOR 路徑分隔符,Win下是"/",而*inux/unix下是"\"。
PATH_SEPARATOR 多個路勁分隔符,好比使用include多個路勁時候,Win下用";",而*inux下爲":"
E_ERROR 致命的運行時錯誤
E_WARNING 運行時警告(非致命性錯誤)
E_PARSE 編譯時解析錯誤
E_NOTICE 運行時提醒(常常是bug,也多是有意的)
E_ALL 除E_STRICT外的全部錯誤
時間
1、time() 來取得服務器當前時間的時間戳
UNIX 時間戳(timestamp)是 PHP 中關於時間日期一個很重要的概念,它表示從 1970年1月1日 00:00:00 到當前時間的秒數之和。
PHP提供了內置函數 time() 來取得服務器當前時間的時間戳。而後能夠經過Data()等函數將它格式化爲咱們須要的時間日期格式。
時間戳雖然看起來好像不太直觀,但咱們在對時間作計算時卻很方便。
有效的時間戳典型範圍是格林威治時間 1901年12月13日 20:45:54 到 2038年1月19日 03:14:07(此範圍符合 32 位有符號整數的最小值和最大值)。不過從 5.1.0 起,已經克服了年的範圍只能是 1901 到 2038 之間的問題。
$_SERVER['REQUEST_TIME'] 是 PHP 內置的當前頁面開始運行時的時間戳,在當前頁面運行結束時將 time() - $_SERVER['REQUEST_TIME'] 獲得的就是當前頁面運行的時間(秒):
2、Date() 函數
語法 date(format,timestamp)
format:必需。規定時間戳的格式。
timestamp:可選。規定時間戳。默認是當前時間和日期。(給出一個時間,格式轉換爲規定的格式)
註釋:時間戳是一種字符序列,它表示具體事件發生的日期和事件。
date() 函數的格式參數是必需的,它們規定如何格式化日期或時間。
下面列出了一些經常使用於日期的字符:
其餘字符,好比 "/", "." 或 "-" 也可被插入字符中,以增長其餘格式。
data(Y/m/d);//將當前日期轉換爲年/月/日格式eg:2016/01/07
data("1");//eg:Friday
下面是經常使用於時間的字符:
若是從代碼返回的不是正確的時間,有多是由於您的服務器位於其餘國家或者被設置爲不一樣時區。
所以,若是您須要基於具體位置的準確時間,您能夠設置要用的時區
date_default_timezone_set("Asia/Shanghai");
三、mktime() 建立日期
語法
mktime(hour,minute,second,month,day,year)
參數能夠從右向左省略,任何省略的參數會被設置成本地日期和時間的當前值。
eg:
$myData = mktime(12,33,52,12,2,2016);
data("Y/m/d h:i:s a",$myData);
mktime() 在作日期計算和驗證方面頗有用,它會自動計算超出範圍的輸入的正確值。例以下面例子輸出的都是 2008-01-01:
<?php
echo date("Y-m-d", mktime(0, 0, 0, 12, 32, 2007));//無效的日期
echo date("Y-m-d", mktime(0, 0, 0, 13, 1, 2007));//無效的月份
?>
4、strtotime() 用字符串來建立日期,用於把人類可讀的英文文本字符串轉換爲 Unix 時間。成功返回時間戳,不然返回 FALSE
int strtotime ( string time [, int now] )
(1)明天此時的時間戳strtotime(」+1 day」)/strtotime("tomorrow");
(2)昨天此時的時間戳strtotime(」-1 day」)
(3)下個星期此時的時間戳strtotime(」+1 week」)
(4)上個星期此時的時間戳strtotime(」-1 week」)
(5)指定下星期幾的時間戳strtotime(」next Thursday」)
(6)指定上星期幾的時間戳strtotime(」last Thursday」)
(7)三個月後此時的時間戳strtotime("+3 Months");
咱們結合mktime()或date()格式化日期時間獲取指定的時間戳,實現所須要的日期時間。
更多日期函數函數:http://www.w3school.com.cn/php/php_ref_date.asp
文件操做
1、include和require
服務器端包含 (SSI) 用於建立可在多個頁面重複使用的函數、頁眉、頁腳或元素。
include (或 require)語句會獲取指定文件中存在的全部文本/代碼/標記,並複製到使用 include 語句的文件中。
include 和 require 語句是相同的,除了錯誤處理方面:
用法:
include 'filename';
require 'filename';
include和require的區別:
若是用 include 語句引用某個文件而且 PHP 沒法找到它,腳本會繼續執行,反正沒找到就沒找到。當文件不是必需的,且應用程序在文件未找到時應該繼續運行時用。
若是用require,引用的文件找不到,頁面會報錯。當文件被應用程序請求時用。
2、readfile() 函數
讀取文件,並把它寫入輸出緩衝。讀取成功返回字節數(bytes),讀取失敗返回false。
int readfile ( string $filename
[, bool $use_include_path
= false [, resource $context
]] )
filename
要讀取的文件名。
use_include_path
想要在include_path中搜索文件,可以使用這個可選的第二個參數,設爲 TRUE
。
context
Stream 上下文(context) resource。
readfile("test");//讀取文件
更多例子見:http://php.net/manual/en/function.readfile.php
3、fopen()函數
resource fopen ( string $filename
, string $mode
[, bool $use_include_path
= false [, resource $context
]] )
filename:
若是 filename
是 "scheme://..." 的格式,則被當成一個URL,PHP 將搜索協議處理器(也被稱爲封裝協議)來處理此模式。若是該協議還沒有註冊封裝協議,PHP 將發出一條消息來幫助檢查腳本中潛在的問題並將filename
當成一個普通的文件名繼續執行下去。
若是 PHP 認爲filename
指定的是一個本地文件,將嘗試在該文件上打開一個流。該文件必須是 PHP 能夠訪問的,所以須要確認文件訪問權限容許該訪問。若是激活了安全模式或者 open_basedir則會應用進一步的限制。
若是 PHP 認爲filename
指定的是一個已註冊的協議,而該協議被註冊爲一個網絡URL,PHP 將檢查並確認allow_url_fopen已被激活。若是關閉了,PHP 將發出一個警告,而 fopen 的調用則失敗。
mode:
user_include_path
若是也須要在 include_path中搜尋文件的話,能夠將可選的第三個參數use_include_path
設爲 '1' 或 TRUE
。
返回值:
成功時返回文件指針資源,若是打開失敗,本函數返回 FALSE
string fread ( resource $handle
, int $length
)
fread() 函數讀取打開的文件。
fread() 的第一個參數包含待讀取文件的文件名,第二個參數規定待讀取的最大字節數。
以下 PHP 代碼把 "webdictionary.txt" 文件讀至結尾:
fread($myfile,filesize("webdictionary.txt"));
bool fclose ( resource $handle
)
fclose() 函數用於關閉打開的文件。
註釋:用完文件後把它們所有關閉是一個良好的編程習慣。您並不想打開的文件佔用您的服務器資源。
fclose() 須要待關閉文件的名稱(或者存有文件名的變量):
<?php
$myfile = fopen("webdictionary.txt", "r");
// some code to be executed....
fclose($myfile);
?>
string fgets ( resource $handle
[, int $length
] )
fgets() 函數用於從文件讀取單行。
$handle
必須是fopen,fsockopen沒有fclose的文件
$length
從 handle
指向的文件中讀取一行並返回長度最多爲 length
- 1 字節的字符串。碰到換行符(包括在返回值中)、EOF 或者已經讀取了 length - 1 字節後中止(看先碰到那一種狀況)。若是沒有指定 length
,則默認爲 1K,或者說 1024 字節。
返回值
從指針 handle
指向的文件中讀取了 length
- 1 字節後返回字符串。 若是文件指針中沒有更多的數據了則返回 FALSE
。錯誤發生時返回 FALSE
註釋:調用 fgets() 函數以後,文件指針會移動到下一行。
下例輸出 "webdictionary.txt" 文件的首行:
<?php $myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!"); echo fgets($myfile); fclose($myfile); ?>
string fgetc ( resource $handle
)
fgetc() 函數用於從文件中讀取單個字符。
$handle
必須是fopen,fsockopen沒有fclose的文件
返回一個包含有一個字符的字符串,該字符從 handle
指向的文件中獲得。 碰到 EOF 則返回 FALSE
。
此函數可能返回布爾值FALSE
,但也可能返回等同於 FALSE
的非布爾值。請閱讀 布爾類型章節以獲取更多信息。應使用===運算符來測試此函數的返回值。
註釋:在調用 fgetc() 函數以後,文件指針會移動到下一個字符。
下例逐字符讀取 "webdictionary.txt" 文件,直到 end-of-file:
<?php
$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
// 輸出單字符直到 end-of-file
while(!feof($myfile)) {
echo fgetc($myfile);
}
fclose($myfile);
?>
bool feof ( resource $handle
)
feof() 函數檢查是否已到達 "end-of-file" (EOF)。
feof() 對於遍歷未知長度的數據頗有用。
下例逐行讀取 "webdictionary.txt" 文件,直到 end-of-file:
<?php
$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
// 輸出單行直到 end-of-file
while(!feof($myfile)) {
echo fgets($myfile) . "<br>";
}
fclose($myfile);
?>
咱們經常用conn.php文件來創建與數據庫的連接,而後在所需的文件中利用include 進行調用。這樣有效防止對數據庫屬性的改動 而引發其餘有關文件對數據調用的錯誤。
如今來看一個conn.php文件,代碼以下:
1 <?php 2 $conn=@mysql_connect("localhost","root","")or die("數據庫鏈接錯誤");//連接數據庫服務器 3 mysql_select_db("messageboard",$conn);//選擇數據庫名爲messageboard 4 mysql_query("set names 'utf8'");//使用utf8編碼,這裏不能寫成utf-8不然將顯示亂碼,但UTF8不區分大小寫
5 ?>
學習積累,收集了PHP操做MYSQL的幾個基礎函數:
1.使用mysql_connect()函數鏈接MySQL服務器:mysql_connect("hostname", "username","password");
如,$link = mysql_connect("localhost", "root", "911") or die("不能鏈接到數據庫服務器!多是數據庫服務器沒有啓動,或者用戶名密碼有誤!".mysql_error());
2.使用mysql_select_db()函數選擇數據庫文件:mysql_query("use 數據庫名",$link);
如,$db_selected=mysql_query("use example",$link);
3.使用mysql_query()函數執行SQL語句:mysql_query(string query(SQL語句),$link);
如:
添加會員:$result=mysql_query("insert into tb_member values('a','111')",$link);
修改會員:$result=mysql_query("update tb_member setuser='b',pwd='000'where user='a'",$link);
刪除會員:$result=mysql_query("delecte from tb_member where user='b'",$link);
查詢會員:$sql=mysql_query("select * from tb_book");
模糊查詢:$sql=mysql_query("select * from tb_book where bookname like '%".trim($txt_book)."%'");
//通用符%表示零個或任意多個字符。
顯示錶結構:$result=mysql_query("DESC tb_member");
4.使用mysql_fetch_array()函數從數組結果集中得到信息:
語法結構:array mysql_fetch_array(resource result[,int result_type])
參數result資源類型的參數,整形型參數,要傳入的是由mysql_fetch_array()函數返回的數據指針;
參數result_type:可選項,php操做MySQL數據庫語句基礎整數型參數,要傳入的是MYSQL_ASSOC(關聯索引)、MYSQL_NUM(數字索引) MYSQL_BOTH(包括前二者,默認值)
如:
5.使用mysql_fetch_object()函數從結果集中獲取一行做爲對象:
語法結構:object mysql_fetch_object(resource result);
如:
mysql_fetch_object()函數與mysql_fetch_array()函數相似,只有一點區別,即返回一個對象而不是數組,該函數只能經過字段名來訪問數組。訪問結果集中行的元素的語法結構:$row->col_name(列名)
6.使用mysql_fetch_row()函數逐行得到結果集中的每條記錄:
語法結構:array mysql_fetch_row(resource result)
如:
7.使用mysql_num_rows()函數獲取結果集中地記錄數:
語法結構:int mysql_num_rows(resource result)
如:
注:若要得到insert、update、delete語句的所影響到的數據,則必須使用mysql_affected_rows()函數來實現。
8.mysql_query("set names gb2312");//設置MySQL的編碼格式爲 gb2312類型,以屏蔽亂碼。
9.關閉記錄集:mysql_free_result($sql);
10.關閉MySQL數據庫服務器:mysql_close($conn);