使用 PHP

使用 PHP

本節彙集了你在寫 PHP 指令碼時可能碰到的大多數普通錯誤。

  1. 我忘了 PHP 函式的參數順序,它們是隨機的嗎?
  2. 我想寫一個可以處理任何表單來的數據的通用 PHP 指令碼。我怎麼知道哪個 POST 方法變數可用呢?
  3. 我需要在所有的單引號(')前加一個反斜線(\),使它們變成(\')。我如何能夠通過正規表示式來實現? 我同樣希望能夠將 " 轉換成 \",將 \ 轉換成 \\。
  4. 當我這樣做時,輸出顯示的次序是錯的: <?php function myfunc($argument) { echo $argument + 10; } $variable = 10; echo "myfunc($variable) = " . myfunc($variable); ?> 這是怎麼回事?
  5. 下面程式碼怎麼沒有分成兩行顯示? <pre> <?php echo "This should be the first line."; ?> <?php echo "This should show up after the new line above."; ?> </pre>
  6. 我得到訊息 “Warning: Cannot send session cookie - headers already sent...” 或者 “Cannot add header information - headers already sent...”。
  7. 我需要直接訪問請求報頭中的資訊,怎麼能辦到?
  8. 當我用 IIS 進行 HTTP 認證時得到 “No Input file specified” 訊息。
  9. Windows:不能訪問另一臺電腦上用 IIS 共享的檔案。
  10. 我怎樣混合使用 XML 和 PHP?它不認我的 <?xml 標記!
  11. 哪裡可以找到所有可用的 PHP 預定義變數的完整列表?
  12. 怎樣才能不用非免費的商業庫(例如 PDFLib) 來產生 PDF 文件?我想要個免費的並且不需要再連線別的 PDF 庫。
  13. 有些 PHP 選項可以接受縮寫的位元組值,與僅能接受 int 位元組值相反。都有哪些縮寫位元組值?
我忘了 PHP 函式的參數順序,它們是隨機的嗎?

PHP 是一個將數百個外部庫連線在一起的粘合劑,儘管有時候會有一些混亂。這裡有一些簡單的經驗法則:

陣列函式 參數的順序為 "needle, haystack", 字串函式 則相反,順序為 "haystack, needle"。

我想寫一個可以處理任何表單來的數據的通用 PHP 指令碼。我怎麼知道哪個 POST 方法變數可用呢?

PHP 提供很多「 預定義變數」,例如超全域性變數 $_POST。可以遍歷 $_POST變數,因為它是一個和所有通過 POST 方法傳遞數據相聯繫的陣列。例如,可以用 foreach簡單地遍歷它,檢查 empty()值,以及將它們輸出。

<?php
$empty 
$post = array();
foreach (
$_POST as $varname => $varvalue) {
    if (empty(
$varvalue)) {
        
$empty[$varname] = $varvalue;
    } else {
        
$post[$varname] = $varvalue;
    }
}

print 
"<pre>";
if (empty(
$empty)) {
    print 
"None of the POSTed values are empty, posted:\n";
    
var_dump($post);
} else {
    print 
"We have " count($empty) . " empty values\n";
    print 
"Posted:\n"var_dump($post);
    print 
"Empty:\n";  var_dump($empty);
    exit;
}
?>
我需要在所有的單引號(')前加一個反斜線(\),使它們變成(\')。我如何能夠通過正規表示式來實現? 我同樣希望能夠將 " 轉換成 \",將 \ 轉換成 \\。

假設是針對數據庫,請使用數據庫自帶的轉義機制。比如,針對 MySQL 使用 mysql_real_escape_string() 函式,針對 PostgreSQL 則使用 pg_escape_string() 函式。還有兩個標準函式 addslashes()stripslashes() 可以在舊的 PHP 版本中實現類似的操作。

當我這樣做時,輸出顯示的次序是錯的:
<?php
function myfunc($argument)
{
    echo 
$argument 10;
}
$variable 10;
echo 
"myfunc($variable) = " myfunc($variable);
?>
這是怎麼回事?

要在一個表達式中(例如在上面的例子中和其它字串連線)使用函式的結果,需要 return 這個值,而不是 echo 它。

下面程式碼怎麼沒有分成兩行顯示?
<pre>
<?php echo "This should be the first line."?>
<?php 
echo "This should show up after the new line above."?>
</pre>

在 PHP 中,一段程式碼的結束標記要麼是「?>」要麼是「?>\n」(\n 表示換行)。因此在上面的例子中,輸出的句子將顯示在同一行中,因為 PHP 忽略了程式碼結束標記後面的換行。這意味著如果要輸出一個換行符,需要在每段 PHP 程式碼的結束標記後面多加一個換行。

PHP 為什麼這麼做呢?因為在格式化正常的 HTML 時,這樣通常會更容易。假如輸出了換行而你不需要這個換行時,就不得不用一個非常長的行來達到這樣的效果,或者讓產生的 HTML 頁面的原始檔的格式很難讀。

我得到訊息 「Warning: Cannot send session cookie - headers already sent...」 或者 「Cannot add header information - headers already sent...」。

函式 header()setcookie()session 函式需要在輸出流中新增頭資訊。但是頭資訊只能在其它任何輸出內容之前發送。在使用這些函式前不能有任何(如 HTML)的輸出。函式 headers_sent() 能夠檢查指令碼是否已經發送了頭資訊。請參閱 輸出控制函式

我需要直接訪問請求報頭中的資訊,怎麼能辦到?

如果以 Apache 的模組方式執行 PHP,那麼函式 getallheaders() 可以做這件事。因此下面的程式碼可以顯示所有的請求報頭:

<?php
$headers 
getallheaders();
foreach (
$headers as $name => $content) {
    echo 
"headers[$name] = $content<br />\n";
}
?>

請參閱函式 apache_lookup_uri()apache_response_headers()fsockopen()

當我用 IIS 進行 HTTP 認證時得到 「No Input file specified」 訊息。

IIS 的安全模型這裡有毛病。這是所有 IIS 下執行的 CGI 程式所共有的問題。一個解決辦法是建立一個純 HTML 檔案(不經過 PHP 解析)作為要進入認證目錄的登錄頁面,然後用 META 標記來重定向到 PHP 頁面,或者用一個連線到 PHP 頁面。然後 PHP 就可以正確識別認證資訊了。如果是用 ISAPI 模組,那沒有這個問題。其它 NT 下的 web 伺服器不受此影響。更多資訊見 » http://support.microsoft.com/kb/q160422/HTTP 認證 一章。

Windows:不能訪問另一臺電腦上用 IIS 共享的檔案。

必須要做些修改。打開 Internet 資訊服務,找到你的 PHP 檔案並打開屬性頁,選擇 檔案安全性標籤,點選 匿名訪問和身份驗證控制的「編輯」按鈕。

解決此問題有兩個方法,一是不要選中 匿名訪問並且選中 整合 Windows 身份驗證,二是選中 匿名訪問並編輯匿名訪問使用的帳戶,改成一個有許可權的。

我怎樣混合使用 XML 和 PHP?它不認我的 <?xml 標記!

要能夠在 PHP 程式碼中直接嵌入 <?xml,需要將 PHP 設定項 short_open_tags設定為 0以關閉短標記格式。無法通過函式 ini_set()來更改這項設定。不管 short_open_tags是開或者關,都可以用類似於 <?php echo '<?xml'; ?>的方法達到目的。該項設定的預設值為開。

哪裡可以找到所有可用的 PHP 預定義變數的完整列表?

請閱讀手冊中的 預定義變數 一章,該部分的文件已經包含了一部分可以用於你的指令碼的預定義變數的列表。可用變數的完整列表(及更多資訊)可以通過呼叫 phpinfo() 函式來查閱。請務必閱讀手冊中 來自 PHP 之外的變數 一節,這部分文件闡述了外部變數的概念,例如來自 HTML 表單、Cookie 和 URL 的變數。

怎樣才能不用非免費的商業庫(例如 PDFLib) 來產生 PDF 文件?我想要個免費的並且不需要再連線別的 PDF 庫。

有幾個選擇,例如 » FPDF» TCPDF 模組。

有些 PHP 選項可以接受縮寫的位元組值,與僅能接受 int 位元組值相反。都有哪些縮寫位元組值?

可用的選擇有 K(對應 Kilobytes),M(對應 Megabytes)和 G(對應 Gigabytes),區分大小寫。其餘的都認為是位元組。 1M等於一個 Megabyte,即 1048576 位元組。 1K 等於一個 Kilobyte,即 1024 位元組。不能在 php.ini 之外使用這些符號,最好用整數的 int 位元組值。參見 ini_get() 文件中的轉換示例。要注意,數字型別為 int 會自動取整,這意味著 0.5M0 是等價的。

注意: kilobyte 和 kibibyte 的區別

PHP 將一個千字節(kilobyte)描述為等於 1024 位元組(bytes),而 IEC 標準則認為這是一個 kibibyte。結論:k 和 K = 1024 bytes.

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *