本節匯集了你在寫(xiě) PHP 腳本時(shí)可能碰到的大多數普通錯誤。
PHP 是一個(gè)將數百個(gè)外部庫連接在一起的粘合劑,盡管有時(shí)候會(huì )有一些混亂。這里有一些簡(jiǎn)單的經(jīng)驗法則:
數組函數 參數的順序為 "needle, haystack", 字符串函數 則相反,順序為 "haystack, needle"。
PHP 提供很多“ 預定義變量”,例如超全局變量 $_POST??梢员闅v $_POST變量,因為它是一個(gè)和所有通過(guò) POST 方法傳遞數據相聯(lián)系的數組。例如,可以用 foreach簡(jiǎn)單地遍歷它,檢查 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() 函數。還有兩個(gè)標準函數 addslashes() 和 stripslashes() 可以在舊的 PHP 版本中實(shí)現類(lèi)似的操作。
<?php
function myfunc($argument)
{
echo $argument + 10;
}
$variable = 10;
echo "myfunc($variable) = " . myfunc($variable);
?>
要在一個(gè)表達式中(例如在上面的例子中和其它字符串連接)使用函數的結果,需要 return 這個(gè)值,而不是 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 忽略了代碼結束標記后面的換行。這意味著(zhù)如果要輸出一個(gè)換行符,需要在每段 PHP 代碼的結束標記后面多加一個(gè)換行。
PHP 為什么這么做呢?因為在格式化正常的 HTML 時(shí),這樣通常會(huì )更容易。假如輸出了換行而你不需要這個(gè)換行時(shí),就不得不用一個(gè)非常長(cháng)的行來(lái)達到這樣的效果,或者讓產(chǎn)生的 HTML 頁(yè)面的源文件的格式很難讀。
函數 header(), setcookie() 和 session 函數需要在輸出流中添加頭信息。但是頭信息只能在其它任何輸出內容之前發(fā)送。在使用這些函數前不能有任何(如 HTML)的輸出。函數 headers_sent() 能夠檢查腳本是否已經(jīng)發(fā)送了頭信息。請參閱 輸出控制函數。
如果以 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 的安全模型這里有毛病。這是所有 IIS 下運行的 CGI 程序所共有的問(wèn)題。一個(gè)解決辦法是建立一個(gè)純 HTML 文件(不經(jīng)過(guò) PHP 解析)作為要進(jìn)入認證目錄的登錄頁(yè)面,然后用 META 標記來(lái)重定向到 PHP 頁(yè)面,或者用一個(gè)連接到 PHP 頁(yè)面。然后 PHP 就可以正確識別認證信息了。如果是用 ISAPI 模塊,那沒(méi)有這個(gè)問(wèn)題。其它 NT 下的 web 服務(wù)器不受此影響。更多信息見(jiàn) ? http://support.microsoft.com/kb/q160422/ 及 HTTP 認證 一章。
必須要做些修改。打開(kāi)
Internet 信息服務(wù)
,找到你的 PHP 文件并打開(kāi)屬性頁(yè),選擇
文件安全性
標簽,點(diǎn)擊
匿名訪(fǎng)問(wèn)和身份驗證控制
的“編輯”按鈕。
解決此問(wèn)題有兩個(gè)方法,一是不要選中
匿名訪(fǎng)問(wèn)
并且選中
集成 Windows 身份驗證
,二是選中
匿名訪(fǎng)問(wèn)
并編輯匿名訪(fǎng)問(wèn)使用的帳戶(hù),改成一個(gè)有權限的。
要能夠在 PHP 代碼中直接嵌入 <?xml,需要將 PHP 設置項
short_open_tags設置為
0
以關(guān)閉短標記格式。無(wú)法通過(guò)函數
ini_set()來(lái)更改這項設置。不管
short_open_tags是開(kāi)或者關(guān),都可以用類(lèi)似于
<?php echo '<?xml'; ?>
的方法達到目的。該項設置的默認值為開(kāi)。
請閱讀手冊中的 預定義變量 一章,該部分的文檔已經(jīng)包含了一部分可以用于你的腳本的預定義變量的列表??捎米兞康耐暾斜恚案嘈畔ⅲ┛梢酝ㄟ^(guò)調用 phpinfo() 函數來(lái)查閱。請務(wù)必閱讀手冊中 來(lái)自 PHP 之外的變量 一節,這部分文檔闡述了外部變量的概念,例如來(lái)自 HTML 表單、Cookie 和 URL 的變量。
可用的選擇有 K(對應 Kilobytes),M(對應 Megabytes)和 G(對應 Gigabytes),區分大小寫(xiě)。其余的都認為是字節。
1M
等于一個(gè) Megabyte,即
1048576
字節。
1K
等于一個(gè) Kilobyte,即
1024
字節。不能在 php.ini 之外使用這些符號,最好用整數的
int 字節值。參見(jiàn)
ini_get() 文檔中的轉換示例。要注意,數字類(lèi)型為
int 會(huì )自動(dòng)取整,這意味著(zhù)
0.5M
與 0
是等價(jià)的。
注意: kilobyte 和 kibibyte 的區別
PHP 將一個(gè)千字節(kilobyte)描述為等于 1024 字節(bytes),而 IEC 標準則認為這是一個(gè) kibibyte。結論:k 和 K = 1024 bytes.