如果您不小心使用 KB、MB 或 GB 而不是 K、M 或 G,則不會顯示任何錯誤訊息。據我所知,英文字母會被忽略,並將其視為位元組,因此 1GB 實際上等於 1 位元組。 phpinfo() 和 ini_get() 將會回報您所寫的內容,例如 1GB,因此即使您的設定有問題,也不會清楚顯示出來。
本節彙集了您在編寫 PHP 腳本時可能遇到的許多常見錯誤。
PHP 就像膠水一樣,將數百個外部函式庫整合在一起,因此有時會變得混亂。然而,一個簡單的經驗法則是:
陣列函式 的參數順序是「needle(被搜尋的字串), haystack(搜尋範圍)」,而 字串函式 則相反,是「haystack(搜尋範圍), needle(被搜尋的字串)」。
PHP 提供許多預定義變數,例如超全域變數 $_POST。您可以使用 foreach 迴圈遍歷 $_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 時,這通常會讓您的工作更輕鬆,因為您不想要換行,但您必須建立極長的程式碼行,否則原始頁面原始碼會變得難以閱讀才能達到這個效果。
函式 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 的安全模型在此處存在缺陷。這是所有在 IIS 下執行的 CGI 程式都會遇到的問題。解決方法是在已驗證的目錄中建立一個純 HTML 檔案(非經 PHP 解析)作為入口頁面。然後使用 META 標籤重新導向到 PHP 頁面,或提供指向 PHP 頁面的連結。PHP 將會正確識別驗證。這不應影響其他 NT 網頁伺服器。如需更多資訊,請參閱:» http://support.microsoft.com/kb/q160422/ 以及手冊中關於 HTTP 驗證 的章節。
您必須變更「前往網際網路資訊服務」。找到您的 PHP 檔案並前往其內容。前往「檔案安全性」索引標籤,「編輯 -< 匿名存取和驗證控制」。
您可以通過取消勾選「匿名存取
」並保留勾選「整合式 Windows 驗證
」來解決此問題,或者,勾選「匿名存取
」並編輯使用者,因為他可能沒有存取權限。
為了將 <?xml 直接嵌入您的 PHP 程式碼中,您必須透過將 PHP 指令 short_open_tags 設定為 0
來關閉簡短標籤。您無法使用 ini_set() 設定此指令。無論 short_open_tags 是開啟還是關閉,您都可以執行以下操作:<?php echo '<?xml'; ?>
。此指令的預設值為 開啟
。
請閱讀 預定義變數 的說明頁面,因為它包含了您的指令碼可用的部分預定義變數清單。可以通過呼叫 phpinfo() 函式來查看可用變數的完整清單(以及更多資訊)。請務必閱讀 PHP 外部變數 的說明章節,因為它描述了外部變數的常見情況,例如來自 HTML 表單、Cookie 和 URL。
可用的選項有 K(代表 Kilobytes,千位元組)、M(代表 Megabytes,百萬位元組)和 G(代表 Gigabytes,十億位元組),且不區分大小寫。其他任何選項都假設為位元組。 1M
等於 1 MB 或 1048576
位元組。 1K
等於 1 KB 或 1024
位元組。這些簡寫表示法可以在 php.ini 和 ini_set() 函式中使用。請注意,數值會被轉換為 整數;例如,0.5M
會被解釋為 0
。
注意:千位元組與 Kibibyte
PHP 表示法將 1 KB 描述為等於 1024 位元組,而 IEC 標準則認為這是 1 Kibibyte。總結:k 和 K = 1024 位元組。
如果您不小心使用 KB、MB 或 GB 而不是 K、M 或 G,則不會顯示任何錯誤訊息。據我所知,英文字母會被忽略,並將其視為位元組,因此 1GB 實際上等於 1 位元組。 phpinfo() 和 ini_get() 將會回報您所寫的內容,例如 1GB,因此即使您的設定有問題,也不會清楚顯示出來。