php常見問題總結

轉自:www.phpe.net

-------------------------------------------------------------------------------------------------

===> 取得當前腳本的路徑
請不要用 $_SERVER['PHP_SELF']取路徑,$_SERVER['PHP_SELF']取出來的在某些情況下是錯誤的.也不要用$_SERVER['SERVER_NAME'],$_SERVER['SERVER_NAME']取得的主機名不包含端口號,而且有時候取得的是服務器名,非你的虛擬主機名.
腳本路徑:

CODE

1.     <?php

2.     $url = 'http://'.dirname($_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']).'/';

3.     ?>


地址欄信息:

CODE

1.     <?php

2.     $url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];

3.     ?>



===> url傳遞參數需要這樣編碼
HTML 實體相匹配的變量。像 &amp&copy &pound 都將被瀏覽器解析,並使用實際實體替代所期待的變量名。解決辦法是使用 &amp; 代替 & 作爲分隔符。使用 htmlentities(urlencode($data)) 對你的 URL 進行編碼。

CODE

1.     <?php

2.     echo "<a href='filename.php?par=" . htmlentities(urlencode($parameter)) . "'>";

3.     ?>


接受頁面直接使用,不需要解碼.

===> 數據存入MySQL需要注意
入庫:

CODE

1.     <?php

2.     $str = addslashes($str);

3.     ?>


出庫:

CODE

1.     <?php

2.     $str = stripslashes($str);

3.     ?>



===> 返回MySQL數據庫上一步 INSERT 操作產生的 ID
mysql_insert_id() 返回給定的 link_identifier 中上一步 INSERT 查詢中產生的 AUTO_INCREMENT ID 號。如果沒有指定 link_identifier,則使用上一個打開的連接。

CODE

1.     <?php

2.     $last_id = mysql_insert_id();

3.     ?>



===> 如何解決表單出錯返回從填的時候以前填寫的東西全部消失
因爲使用了session,可以用session_cache_limiter強制數據流從新生效.

CODE

1.     <?php

2.     // session start

3.     session_cache_limiter("private, must-revalidate");

4.     session_start();

5.     ...

6.     ?>



===> 如何一勞永逸的解決Cannot send session cache limiter - headers already sent 這種錯誤
當用header()轉向或者session_start()之前有輸出,會有Cannot send session cache limiter - headers already sent的錯誤,可以用ob_start(),這樣會在頁面全部執行完畢才輸出.

CODE

1.     <?php

2.     session_start();

3.     ob_start();

4.     ...

5.     ?>



===> 如何表單填寫錯誤時返回後以前填寫的內容消失?
當使用session後會出現這種情況,我們可以使用session_cache_limiter();強制生效.

CODE

1.     <?php

2.     session_cache_limiter("private, must-revalidate");

3.     session_start();

4.     ...

5.     ?>



===> 判斷郵件地址是否合法!
判斷郵件地址是否合法!

CODE

1.     <?php

2.     if(!preg_match("/^[a-z0-9-_/.]+@([a-z0-9][a-z0-9-]+/.)+[a-z]{2,4}$/i",$email)){

3.        echo "<script language='JavaScript'>";

4.        echo "alert('E-mail Error!'); location.replace('javascript:history.back(1)');";

5.        echo "</script>";

6.        exit;

7.     }

8.     ?>



===> 數組存儲到MySQL數據庫
數組存儲到mysql中要用serialize() 產生一個可存儲的值

CODE

1.     <?php

2.     $array_in = serialize($data);

3.     ...

4.     ?>


出庫時

CODE

1.     <?php

2.     ...

3.     $array_out =

4. This site is prohibited by proxy.

===> 取來源頁面地址
如果是通過<script language="javascript" src="filename.php"></script>調用,取到的只是filename.php,而非來源頁面.這時候可以用js來取.

CODE

1.     <?php

2.     echo $_SERVER['HTTP_REFERER'];

3.     ?>



===> 實現任意文件的下載
header可以實現任意文件的下載,而不是打開,比如txt和圖片等.自己找一下Content-type,根據相應的類型替換就可以了.

CODE

1.     <?php

2.     // We'll be outputting a gif

3.     header('Content-type: image/gif');

4.    

 

5.     // It will be called pic.gif

6.     header('Content-Disposition: attachment; filename="pic.gif"');

7.    

 

8.     // The gif source is in pic.gif

9.     readfile('pic.gif');

10.  ?>



===> 爲什麼 $foo[bar] 錯了?[摘自php手冊]
應該始終在用字符串表示的數組索引上加上引號。例如用 $foo['bar'] 而不是 $foo[bar]。但是爲什麼 $foo[bar] 錯了呢?你可能在老的腳本中見過如下語法:

CODE

1.     <?php

2.     $foo[bar] = 'enemy';

3.     echo $foo[bar];

4.     // etc

5.     ?>


這樣是錯的,但可以正常運行。那麼爲什麼錯了呢?原因是此代碼中有一個未定義的常量(bar)而不是字符串('bar'-注意引號),而 PHP 可能會在以後定義此常量,不幸的是你的代碼中有同樣的名字。它能運行,是因爲 PHP 自動將裸字符串(沒有引號的字符串且不對應於任何已知符號)轉換成一個其值爲該裸字符串的正常字符串。例如,如果沒有常量定義爲 barPHP 將把它替代爲 'bar' 並使用之。
: 這並不意味着總是給鍵名加上引號。用不着給鍵名爲常量 變量 的加上引號,否則會使 PHP 不能解析它們。

===> 剛寫了一個用MySQL保存圖片和取出圖片的例子
方法並不可取,因爲保存圖片的數據量是很大的,對寶貴的數據庫資源太浪費,可以將圖片存儲到目錄中,用數據庫存儲路徑和文件名.

Database table:

CODE

1.     CREATE TABLE `image_table` (

2.      `id` int(4) NOT NULL auto_increment,

3.      `image` blob NOT NULL,

4.      PRIMARY KEY  (`id`)

5.     ) TYPE=MyISAM;



上傳圖片存儲到MySQL:

CODE

1.     <?php

2.     // pic_database_upload.php By Bleakwind

3.     $Host     = "localhost";

4.     $User     = "bleakwind";

5.     $Password = "bleakwind";

6.     $Database = "test";

7.    

 

8.     mysql_connect($Host,$User,$Password) or die("Could not connect:" . mysql_error());

9.     mysql_select_db($Database) or die("Could not select database!");

10. 

 

11.  if(!empty($_FILES['image']['name'])){

12.    $image_data = addslashes(fread(fopen($_FILES['image']['tmp_name'], "rb"), filesize($_FILES['image']['tmp_name'])));

13.    $sql = "INSERT INTO `image_table` (`image`) VALUES ('".$image_data."')";

14.    if(mysql_query($sql)){ echo "成功!"; }else{ echo "失敗!"; }

15.  }

16.  ?>

17. 

 

18.  <form action="" method="post" name="form" enctype="multipart/form-data">

19.  <input type="file" name="image" size="30">

20.  <input type="submit" value="Upload">

21.  </form>



從數據庫中取出圖片.
注意:
1.可能具體應用你還要分配一個字段來存儲圖片類型,這樣下面的header( "content-type: image/gif");這句的gif用相應的類型替換掉.
2.如果想取出多個圖片可以將下面的文件存成一個文件,在另外的文件遍歷ID後調用此文件輸出.

CODE

1.     <?php

2.     // pic_database_output.php By Bleakwind

3.     header( "content-type: image/gif");

4.     $Host     = "localhost";

5.     $User     = "bleakwind";

6.     $Password = "bleakwind";

7.     $Database = "test";

8.     $id       = 1;

9.    

 

10.  mysql_connect($Host,$User,$Password) or die("Could not connect:" . mysql_error());

11.  mysql_select_db($Database) or die("Could not select database!");

12. 

 

13.  $sql    = "SELECT * FROM `image_table` WHERE `id`=" . $id;

14.  $result = mysql_query($sql) or die("Could not perform query!");

15.  $row    = mysql_fetch_array($result);

16.  echo $row['image'];

17.  ?>

 

===> 一個生成隨機字符串的函數
可以控制字符串內容是什麼,$len參數爲生成的隨即字符串長度,$array數組裏面改成自己需要的內容就可以.可以使用漢字...
這只是一個方法,隨即字串產生的方法多種多樣,比如可以md5當前microtime(),然後截取你想要的長度...

CODE

1.     <?php

2.     // By Bleakwind

3.     function str_rand($len)

4.     {

5.       $str   = "";

6.       $array = array("a","b","c","d","e","f","g","h","i","j","k","l","m",

7.                      "n","o","p","q","r","s","t","u","v","w","x","y","z",

8.                      "0","1","2","3","4","5","6","7","8","9");

9.       $key   = array_rand($array,$len);

10.    for($i=0;$i<$len;$i++){

11.        $str .= $array[$key[$i]];

12.    }

13.    return $str;

14.  }

15. 

 

16.  // Use it

17.  echo str_rand(6);

18.  ?>



===> 如何截取文件擴展名
如上傳文件的擴展名等,此擴展名可能是僞造的.想判斷文件類型請用mime_content_type()...

CODE

1.     <?php

2.     // 第一種

3.     $extendname = array_pop(explode ( ".",$filename));

4.    

 

5.     // 第二種

6.     $extendname = end(explode(".", $filename));

7.    

 

8.     // 第三種

9.     $file_part  = pathinfo($filename);

10.  $extendname = $file_part["extension"];

11.  ?>

===> 一個緩衝輸出顯示的例子
1.
有些Apache的模塊,比如mod_gzip,可能自己進行輸出緩存,這將導致flush()函數產生的結果不會立即被髮送到客戶端瀏覽器。
2.
甚至瀏覽器也會在顯示之前,緩存接收到的內容。例如 Netscape 瀏覽器會在接受到換
行或 html 標記的開頭之前緩存內容,並且在接受到 </table> 標記之前,不會顯示出整個表格。

CODE

1.     <?php

2.     set_time_limit(0);

3.     ob_start();

4.    

 

5.     // 一些版本的 Microsoft Internet Explorer 只有當接受到的256個字節以後纔開始顯示該頁面,

6.     // 所以必須發送一些額外的空格來讓這些瀏覽器顯示頁面內容。

7.     echo str_pad('Loading... ',4096)."<br>/n";

8.    

 

9.     for ($i = 0; $i < 30; $i++) {

10.    echo "=";

11.    flush();

12.    ob_flush();

13.    sleep(1);

14.  }

15.  ob_end_flush();

16.  ?>

17. 

 

===> 讀取配置文件的幾個例子
對配置文件的讀取,就像一些應用程序的.INI配置文件一樣,具體內容查看手冊中的函數:

1.

CODE

1.     <?php

2.     define ('BIRD', 'Dodo bird');

3.    

 

4.     // Parse without sections

5.     $ini_array = parse_ini_file("sample.ini");

6.     print_r($ini_array);

7.    

 

8.     // Parse with sections

9.     $ini_array = parse_ini_file("sample.ini", TRUE);

10.  print_r($ini_array);

11. 

 

12.  // sample.ini

13.  /*

14.  ; This is a sample configuration file

15.  ; Comments start with ';', as in php.ini

16. 

 

17.  [first_section]

18.  one = 1

19.  five = 5

20.  animal = BIRD

21. 

 

22.  [second_section]

23.  path = /usr/local/bin

24.  URL = "http://www.example.com/~username"

25.  */

26.  ?>



2.

CODE

1.    

 

2.     <?php

3.     $handle = fopen ("users.txt","r");

4.     while ($userinfo = fscanf ($handle, "%s/t%s/t%s/n")) {

5.       list ($name, $profession, $countrycode) = $userinfo;

6.       //... do something with the values

7.     }

8.     fclose($handle);

9.    

 

10.  // users.txt

11.  /*

12.  javier  argonaut        pe

13.  hiroshi sculptor        jp

14.  robert  slacker us

15.  luigi   florist it

16.  */

17.  ?>

18. 

 



發佈了52 篇原創文章 · 獲贊 5 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章