php最全基礎,數組,函數,超全局變量,時間,回話,文件,php操做mysql

 

共享一份學習php最全基礎語法知識的筆記

原文連接:http://www.cnblogs.com/oscn/p/3607757.html;略有修改php

      http://www.cnblogs.com/ljab/p/6125995.html略有修改

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

$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

說明

$_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__ 常量包含當前(例如包含)文件的絕對路徑和文件名。

$_GET

說明

經過 URL 參數傳遞給當前腳本的變量的數組。

範例

Example #1 $_GET 範例

<?php
echo 'Hello ' . htmlspecialchars($_GET["name"]) . '!';
?>

假設用戶訪問的是 http://example.com/?name=Hannes

以上例程的輸出相似於:

Hello Hannes!

Note:

GET 是經過 urldecode() 傳遞的。

$_POST

$_POST 變量用於收集來自 method="post" 的表單中的值。從帶有 POST 方法的表單發送的信息,對任何人都是不可見的(會顯示在瀏覽器的地址欄),而且對發送信息的量也沒有限制。

範例

Example #1 $_POST 範例

<?php
echo 'Hello ' . htmlspecialchars($_POST["name"]) . '!';
?>

假設用戶經過 HTTP POST 方式傳遞了參數 name=Hannes

以上例程的輸出相似於:

Hello Hannes!

$_REQUEST

使用$_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是向服務器傳送數據。
  • get是把參數數據隊列加到提交表單的ACTION屬性所指的URL中,值和表單內各個字段一一對應,在URL中能夠看到。post是經過HTTP post機制,將表單內各個字段與其內容放置在HTML HEADER內一塊兒傳送到ACTION屬性所指的URL地址。用戶看不到這個過程。
  • 對於get方式,服務器端用Request.QueryString獲取變量的值,對於post方式,服務器端用Request.Form獲取提交的數據。
  • get傳送的數據量較小,不能大於2KB。post傳送的數據量較大,通常被默認爲不受限制。但理論上,IIS4中最大量爲80KB,IIS5中爲100KB。
  • get安全性很是低,post安全性較高。可是執行效率卻比Post方法好。
  • $_REQUEST[]具用$_POST[] $_GET[]的功能,可是$_REQUEST[]比較慢。經過POST和GET方法提交的全部數據均可以經過$_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>

建議

  • get方式的安全性較Post方式要差些,包含機密信息的話,建議用Post數據提交方式;
  • 在作數據查詢時,建議用Get方式;而在作數據添加、修改或刪除時,建議用Post方式;
  • ATTENTION:慎用$_REQUEST 若是get的一個變量名稱和post的一個變量名稱相同,則POST的值會覆蓋GET的變量值,由於REQUEST先獲取了get的值,而後獲取了post的值,post的值會覆蓋get值。
  • 使用$_REQUEST數組是必定要注意,幾種數據中的變量名不要衝突,尤爲要注意的是$_COOKIE,它的數據不使用過客戶端來設置的。

咱們能夠來看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 變量的數組。更多關於如何使用的信息,參見 Session 函數 文檔。

$_ENV

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

$_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 之間的問題。

  提示

  1. time() 獲得的老是當前的時間戳,因此是不固定的值
  2. 若是時間戳爲負數,則爲從1970年1月1日 00:00:00往前推

   $_SERVER['REQUEST_TIME'] 是 PHP 內置的當前頁面開始運行時的時間戳,在當前頁面運行結束時將 time() - $_SERVER['REQUEST_TIME'] 獲得的就是當前頁面運行的時間(秒):

2、Date() 函數

  語法 date(format,timestamp)

  format:必需。規定時間戳的格式。

  timestamp:可選。規定時間戳。默認是當前時間和日期。(給出一個時間,格式轉換爲規定的格式)

  註釋:時間戳是一種字符序列,它表示具體事件發生的日期和事件。

  1)得到簡單的日期

  date() 函數的格式參數是必需的,它們規定如何格式化日期或時間。

  下面列出了一些經常使用於日期的字符:

  

  其餘字符,好比 "/", "." 或 "-" 也可被插入字符中,以增長其餘格式。

  data(Y/m/d);//將當前日期轉換爲年/月/日格式eg:2016/01/07

  data("1");//eg:Friday 

  2)得到簡單的時間

  下面是經常使用於時間的字符:

  • h - 帶有首位零的 12 小時小時格式
  • i - 帶有首位零的分鐘
  • s - 帶有首位零的秒(00 -59)
  • a - 小寫的午前和午後(am 或 pm)

  3)得到時區

  若是從代碼返回的不是正確的時間,有多是由於您的服務器位於其餘國家或者被設置爲不一樣時區。

  所以,若是您須要基於具體位置的準確時間,您能夠設置要用的時區

  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 語句是相同的,除了錯誤處理方面:

  • require 會生成致命錯誤(E_COMPILE_ERROR)並中止腳本
  • include 只生成警告(E_WARNING),而且腳本會繼續

  用法:

  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

4、fread()

  string fread    ( resource $handle   , int $length   )

  fread() 函數讀取打開的文件。

  fread() 的第一個參數包含待讀取文件的文件名,第二個參數規定待讀取的最大字節數。

  以下 PHP 代碼把 "webdictionary.txt" 文件讀至結尾:

 fread($myfile,filesize("webdictionary.txt"));

5、 fclose()

  bool fclose    ( resource $handle )

  fclose() 函數用於關閉打開的文件。

  註釋:用完文件後把它們所有關閉是一個良好的編程習慣。您並不想打開的文件佔用您的服務器資源。

  fclose() 須要待關閉文件的名稱(或者存有文件名的變量):

<?php
$myfile = fopen("webdictionary.txt", "r");
// some code to be executed....
fclose($myfile);
?>

6、fgets()

  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);
?>

7、fgetc()

  string fgetc    ( resource $handle)

  fgetc() 函數用於從文件中讀取單個字符。

  $handle

  必須是fopen,fsockopen沒有fclose的文件

  返回值

    返回一個包含有一個字符的字符串,該字符從 handle 指向的文件中獲得。   碰到 EOF 則返回 FALSE。 

  Warning

  此函數可能返回布爾值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);
?>

8、feof()

  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);
?>

 

php操做MySQL數據庫中語句

 

咱們經常用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(包括前二者,默認值)

 

如:

  1. <1>$sql=mysql_query("select * from tb_book");
  2. $info=mysql_fetch_object($sql);
  3. <2>$sql=mysql_query("select * from tb_book where bookname like '%".trim($txt_book)."%'");
  4. $info=mysql_fetch_object($sql);

 

 

5.使用mysql_fetch_object()函數從結果集中獲取一行做爲對象:

 

語法結構:object mysql_fetch_object(resource result);

 

如:

  1. <1>$sql=mysql_query("select * from tb_book");
  2. $info=mysql_fetch_object($sql);
  3. <2>$sql=mysql_query("select * from tb_book where bookname like '%".trim($txt_book)."%'");
  4. $info=mysql_fetch_object($sql);

 

 

mysql_fetch_object()函數與mysql_fetch_array()函數相似,只有一點區別,即返回一個對象而不是數組,該函數只能經過字段名來訪問數組。訪問結果集中行的元素的語法結構:$row->col_name(列名)

 

6.使用mysql_fetch_row()函數逐行得到結果集中的每條記錄:

 

語法結構:array mysql_fetch_row(resource result)

 

如:

  1. <1>$sql=mysql_query("select * from tb_book");
  2. $row=mysql_fetch_row($sql);
  3. <2>$sql=mysql_query("select * from tb_book where bookname like '%".trim($txt_book)."%'");
  4. $row=mysql_fetch_row($sql);

 

 

7.使用mysql_num_rows()函數獲取結果集中地記錄數:

 

語法結構:int mysql_num_rows(resource result)

 

如:

  1. $sql=mysql_query("select * from tb_book");
  2. ......
  3. <?php $nums=mysql_num_rows($sql);echo $nums;?>

  

注:若要得到insert、update、delete語句的所影響到的數據,則必須使用mysql_affected_rows()函數來實現。

 

8.mysql_query("set names gb2312");//設置MySQL的編碼格式爲 gb2312類型,以屏蔽亂碼。

 

9.關閉記錄集:mysql_free_result($sql);

 

10.關閉MySQL數據庫服務器:mysql_close($conn);

相關文章
相關標籤/搜索