2024 日本 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 "這應該是第一行。"; ?> <?php echo "這應該顯示在上面一行的換行之後。"; ?> </pre>
  6. 我收到「警告:無法發送 session cookie - 標頭已送出...」或「無法新增標頭資訊 - 標頭已送出...」的訊息。
  7. 我需要直接存取請求標頭中的資訊。我該怎麼做?
  8. 當我嘗試使用 IIS 進行驗證時,出現「未指定輸入檔案」的錯誤訊息。
  9. Windows:我無法使用 IIS 存取其他電腦上的共用檔案。
  10. 我應該如何混合使用 XML 和 PHP?它會抱怨我的 <?xml 標籤!
  11. 我在哪裡可以找到 PHP 中所有可用變數的完整列表?
  12. 如何在不使用非免費且商業化的函式庫(例如 PDFLib)的情況下產生 PDF 檔案?我想要免費且不需要外部 PDF 函式庫的解決方案。
  13. 一些 PHP 指令可能也會採用速記的位元組值,而不僅僅是整數位元組值。所有可用的速記位元組選項有哪些?
我記不住 PHP 函式的參數順序,它們是隨機的嗎?

PHP 就像膠水一樣,將數百個外部函式庫整合在一起,因此有時會變得混亂。然而,一個簡單的經驗法則是:

陣列函式 的參數順序是「needle(被搜尋的字串), haystack(搜尋範圍)」,而 字串函式 則相反,是「haystack(搜尋範圍), needle(被搜尋的字串)」。

我想編寫一個通用的 PHP 腳本,它可以處理來自任何表單的資料。我如何知道哪些 POST 方法變數可用?

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 時,這通常會讓您的工作更輕鬆,因為您不想要換行,但您必須建立極長的程式碼行,否則原始頁面原始碼會變得難以閱讀才能達到這個效果。

我收到「警告:無法發送 session cookie - 標頭已送出...」或「無法新增標頭資訊 - 標頭已送出...」的訊息。

函式 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 的安全模型在此處存在缺陷。這是所有在 IIS 下執行的 CGI 程式都會遇到的問題。解決方法是在已驗證的目錄中建立一個純 HTML 檔案(非經 PHP 解析)作為入口頁面。然後使用 META 標籤重新導向到 PHP 頁面,或提供指向 PHP 頁面的連結。PHP 將會正確識別驗證。這不應影響其他 NT 網頁伺服器。如需更多資訊,請參閱:» http://support.microsoft.com/kb/q160422/ 以及手冊中關於 HTTP 驗證 的章節。

Windows:我無法使用 IIS 存取其他電腦上的共用檔案。

您必須變更「前往網際網路資訊服務」。找到您的 PHP 檔案並前往其內容。前往「檔案安全性」索引標籤,「編輯 -< 匿名存取和驗證控制」。

您可以通過取消勾選「匿名存取」並保留勾選「整合式 Windows 驗證」來解決此問題,或者,勾選「匿名存取」並編輯使用者,因為他可能沒有存取權限。

我應該如何混合使用 XML 和 PHP?它會抱怨我的 <?xml 標籤!

為了將 <?xml 直接嵌入您的 PHP 程式碼中,您必須透過將 PHP 指令 short_open_tags 設定為 0 來關閉簡短標籤。您無法使用 ini_set() 設定此指令。無論 short_open_tags 是開啟還是關閉,您都可以執行以下操作:<?php echo '<?xml'; ?>。此指令的預設值為 開啟

我在哪裡可以找到 PHP 中所有可用變數的完整列表?

請閱讀 預定義變數 的說明頁面,因為它包含了您的指令碼可用的部分預定義變數清單。可以通過呼叫 phpinfo() 函式來查看可用變數的完整清單(以及更多資訊)。請務必閱讀 PHP 外部變數 的說明章節,因為它描述了外部變數的常見情況,例如來自 HTML 表單、Cookie 和 URL。

如何在不使用非免費且商業化的函式庫(例如 PDFLib)的情況下產生 PDF 檔案?我想要免費且不需要外部 PDF 函式庫的解決方案。

有一些以 PHP 編寫的替代方案,例如 » FPDF» TCPDF

一些 PHP 指令也可能採用簡寫的位元組值,而不僅僅是 整數 位元組值。所有可用的簡寫位元組選項有哪些?

可用的選項有 K(代表 Kilobytes,千位元組)、M(代表 Megabytes,百萬位元組)和 G(代表 Gigabytes,十億位元組),且不區分大小寫。其他任何選項都假設為位元組。 1M 等於 1 MB 或 1048576 位元組。 1K 等於 1 KB 或 1024 位元組。這些簡寫表示法可以在 php.iniini_set() 函式中使用。請注意,數值會被轉換為 整數;例如,0.5M 會被解釋為 0

注意千位元組與 Kibibyte

PHP 表示法將 1 KB 描述為等於 1024 位元組,而 IEC 標準則認為這是 1 Kibibyte。總結:k 和 K = 1024 位元組。

新增註釋

使用者貢獻的註釋 1 則註釋

robjbrain at gmail dot com
8 年前
如果您不小心使用 KB、MB 或 GB 而不是 K、M 或 G,則不會顯示任何錯誤訊息。據我所知,英文字母會被忽略,並將其視為位元組,因此 1GB 實際上等於 1 位元組。 phpinfo() 和 ini_get() 將會回報您所寫的內容,例如 1GB,因此即使您的設定有問題,也不會清楚顯示出來。
To Top