使用php,使用 PHP
使用 PHP推薦查看本文HTML版本
本節(jié)匯集了你在寫 PHP 腳本時(shí)可能碰到的大多數(shù)普通錯(cuò)誤。
1. 我想寫一個(gè)可以處理任何表單來的數(shù)據(jù)的通用 PHP 腳本。我怎么知道哪個(gè) POST 方法變量可用呢?
2. 我需要在所有的單引號(')前加一個(gè)反斜線(\),使它們變成(\'),我如何能夠通過正則表達(dá)式來實(shí)現(xiàn)?我同樣希望能夠?qū)?")轉(zhuǎn)換成(\"),將(\)轉(zhuǎn)換成(\\)。
3. 我所有的(")和(')都被變成了(\")和(\'),我如何才能去掉這些不必要的反斜線?它們?yōu)槭裁醇叭绾纬霈F(xiàn)?
4. 當(dāng)我這樣做時(shí),輸出顯示的次序是錯(cuò)的: <?php
function myfunc($argument)
{
6. 我得到消息“Warning: Cannot send session cookie - headers already sent...”或者“Cannot add header information - headers already sent...”。
7. 我需要直接訪問請求報(bào)頭中的信息,怎么能辦到?
8. 當(dāng)我用 IIS 進(jìn)行 HTTP 認(rèn)證時(shí)得到“No Input file specified”消息。
9. 我的 PHP 腳本在 IE 和 Lynx 下能工作,但是在 Netscape 中有的輸出丟失了。當(dāng)我用“查看源文件”時(shí)可以在 IE 中看到內(nèi)容,但是 Netscape 中不能。
10. 我怎樣混合使用 XML 和 PHP?它不認(rèn)我的 <?xml 標(biāo)記!
11. 怎樣用 FrontPage 或者其它非要把我的代碼移來移去的 HTML 編輯器來編輯 PHP?
12. 哪里可以找到所有可用的 PHP 預(yù)定義變量的完整列表?
13. 我試著在用戶自定義函數(shù)中訪問一個(gè)標(biāo)準(zhǔn)的 CGI 變量(例如 $DOCUMENT_ROOT 或 $HTTP_REFERER),但是找不到,哪里出了錯(cuò)?
1. 我想寫一個(gè)可以處理任何表單來的數(shù)據(jù)的通用 PHP 腳本。我怎么知道哪個(gè) POST 方法變量可用呢?
PHP 提供很多“預(yù)定義變量”,例如超級全局變量 $_POST。您可以遍歷 $_POST 變量,因?yàn)樗且粋€(gè)和所有通過 POST 方法傳遞數(shù)據(jù)相聯(lián)系的數(shù)組。例如,我們可以用 foreach 簡單的遍歷它,檢查 empty() 值,以及將它們輸出。 <?php
$empty = $post = array();
foreach ($_POST as $varname => $varvalue) {
if (empty($varvalue)) {
$empty[$varname] = $varvalue;
} else {
$post[$varname] = $varvalue;
}
}
print "
";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;
}
?>
Superglobals:可用性說明: 自 PHP 4.1.0 開始,可以使用超級全局?jǐn)?shù)組例如 $_GET,$_POST 和 $_SERVER 等等。更多信息請閱讀手冊中的 superglobals
2. 我需要在所有的單引號(')前加一個(gè)反斜線(\),使它們變成(\'),我如何能夠通過正則表達(dá)式來實(shí)現(xiàn)?我同樣希望能夠?qū)?")轉(zhuǎn)換成(\"),將(\)轉(zhuǎn)換成(\\)。
函數(shù) addslashes() 能夠?qū)崿F(xiàn)這種操作。請參閱函數(shù) mysql_escape_string()。另外,您還可以用函數(shù) stripslashes() 來去掉反斜線。
設(shè)置選項(xiàng)注意:magic_quotes_gpc: PHP 的設(shè)置選項(xiàng) magic_quotes_gpc 的默認(rèn)值為 on。這相當(dāng)于自動對所有的 GET、POST、COOKIE 數(shù)據(jù)使用 addslashes() 函數(shù)。您可以使用 stripslashes() 函數(shù)來去掉它們。
3. 我所有的(")和(')都被變成了(\")和(\'),我如何才能去掉這些不必要的反斜線?它們?yōu)槭裁醇叭绾纬霈F(xiàn)?
PHP 函數(shù) stripslashes() 能夠從字符串中去掉所有的反斜線。這些反斜線出現(xiàn)最有可能的原因是 PHP 設(shè)置項(xiàng) magic_quotes_gpc 被開啟。
設(shè)置選項(xiàng)注意:magic_quotes_gpc: PHP 的設(shè)置選項(xiàng) magic_quotes_gpc 的默認(rèn)值為 on。這相當(dāng)于自動對所有的 GET、POST、COOKIE 數(shù)據(jù)使用 addslashes() 函數(shù)。您可以使用 stripslashes() 函數(shù)來去掉它們。
4. 當(dāng)我這樣做時(shí),輸出顯示的次序是錯(cuò)的: <?php
function myfunc($argument)
{
echo $argument + 10;
}
$variable = 10;
echo "myfunc($variable) = " . myfunc($variable);
?>
這是怎么回事?
要在一個(gè)表達(dá)式中(例如在上面的例子中和其它字符串連接)使用函數(shù)的結(jié)果,你需要 return() 這個(gè)值,而不是 echo() 它。
5. 下面代碼怎么沒有分成兩行顯示?
在 PHP 中,一段代碼的結(jié)束標(biāo)記要么是“?>”要么是“?>\n”(\n 表示換行)。因此在上面的例子中,輸出的句子將顯示在同一行中,因?yàn)?PHP 忽略了代碼結(jié)束標(biāo)記后面的換行。這意味著如果要輸出一個(gè)換行符,你需要在每段 PHP 代碼的結(jié)束標(biāo)記后面多加一個(gè)換行。
PHP 為什么這么做呢?因?yàn)樵诟袷交5?HTML 時(shí),這樣通常會更容易。假如輸出了換行而你不需要這個(gè)換行時(shí),你就不得不用一個(gè)非常長的行來達(dá)到這樣的效果,或者讓產(chǎn)生的 HTML 頁面的源文件的格式很難讀。
6. 我得到消息“Warning: Cannot send session cookie - headers already sent...”或者“Cannot add header information - headers already sent...”。
函數(shù) header(),setcookie() 和 session 函數(shù)需要在輸出流中增加頭信息。但是頭信息只能在其它任何輸出內(nèi)容之前發(fā)送。在使用這些函數(shù)前不能有任何(如 HTML)的輸出。函數(shù) headers_sent() 能夠檢查您的腳本是否已經(jīng)發(fā)送了頭信息。請參閱“輸出控制函數(shù)”。
7. 我需要直接訪問請求報(bào)頭中的信息,怎么能辦到?
如果你以 Apache 的模塊方式運(yùn)行 PHP,那么函數(shù) getallheaders() 可以做這件事。因此下面的代碼可以顯示所有的請求報(bào)頭: <?php
$headers = getallheaders();
foreach ($headers as $name => $content) {
echo "headers[$name] = $content
\n";
}
?>
請參閱函數(shù) apache_lookup_uri()、apache_response_headers() 和 fsockopen()。
8. 當(dāng)我用 IIS 進(jìn)行 HTTP 認(rèn)證時(shí)得到“No Input file specified”消息。
IIS 的安全模型這里有毛病。這是所有 IIS 下運(yùn)行的 CGI 程序所共有的問題。一個(gè)解決辦法是建立一個(gè)純 HTML 文件(不經(jīng)過 PHP 解析)作為要進(jìn)入認(rèn)證目錄的登錄頁面,然后用 META 標(biāo)記來重定向到 PHP 頁面,或者用一個(gè)連接到 PHP 頁面。然后 PHP 就可以正確識別認(rèn)證信息了。如果是用 ISAPI 模塊,那沒有這個(gè)問題。其它 NT 下的 web 服務(wù)器不受此影響。更多信息見:http://support.microsoft.com/support/kb/articles/q160/4/22.asp及“HTTP 認(rèn)證”的有關(guān)章節(jié)。
9. 我的 PHP 腳本在 IE 和 Lynx 下能工作,但是在 Netscape 中有的輸出丟失了。當(dāng)我用“查看源文件”時(shí)可以在 IE 中看到內(nèi)容,但是 Netscape 中不能。
Netscape 在關(guān)于 html 標(biāo)記(例如 table)上比 IE 更嚴(yán)格。用一個(gè) html 驗(yàn)證器,例如 validator.w3.org 來驗(yàn)證你的 html 輸出可能會有幫助。例如漏了 可能會導(dǎo)致這樣的結(jié)果。
同樣,IE 和 Lynx 都忽略了 HTML 流中的任何 NULs(\0),Netscape 就不。最好的檢查方法是編譯 PHP 的命令行模式版本(也稱為 CGI 版本)并從命令行運(yùn)行你的腳本。在 *nix 中,用管道傳遞到 od -c 并查看任何 \0 字符。如果在 Windows 下你需要能夠查看二進(jìn)制文件格式的編輯器或程序。當(dāng) Netscape 碰到 NUL 時(shí)就不會輸出之后該行的任何內(nèi)容而 IE 和 Lynx 都會。
10. 我怎樣混合使用 XML 和 PHP?它不認(rèn)我的 <?xml 標(biāo)記!
要能夠在 PHP 代碼中直接嵌入 <?xml ,您需要將將 PHP 設(shè)置項(xiàng) short_open_tags 設(shè)置為 0 以關(guān)閉短標(biāo)記格式。您無法通過函數(shù) ini_set() 來更改這項(xiàng)設(shè)置。不管 short_open_tags 是開或者關(guān),您都可以用類似于 <?php echo '<?xml'; ?> 的方法達(dá)到目的。該項(xiàng)設(shè)置的默認(rèn)值為開。
11. 怎樣用 FrontPage 或者其它非要把我的代碼移來移去的 HTML 編輯器來編輯 PHP?
最簡單的方法是讓 PHP 代碼也能使用 ASP 標(biāo)記。這可以讓你用 ASP 風(fēng)格的 代碼定界符。一些流行的 HTML 編輯器在處理此格式上更加智能化一些(目前如此)。要使用 ASP 風(fēng)格的標(biāo)記,你需要在 php.ini 中打開 asp_tags,或者用相應(yīng)的 Apache 配置選項(xiàng)。
12. 哪里可以找到所有可用的 PHP 預(yù)定義變量的完整列表?
請閱讀手冊“預(yù)定義變量”的有關(guān)章節(jié),該部分的文檔已經(jīng)包含了一部分可以用于你的腳本的預(yù)定義變量的列表。可用變量的完整列表(及更多信息)可以通過調(diào)用 phpinfo() 函數(shù)來查閱。請務(wù)必閱讀手冊“PHP 外部變量”一節(jié),這部分文檔描述了外部變量的概要,如從來自 HTML 表單、Cookie 和 URL 的變量。
13. 我試著在用戶自定義函數(shù)中訪問一個(gè)標(biāo)準(zhǔn)的 CGI 變量(例如 $DOCUMENT_ROOT 或 $HTTP_REFERER),但是找不到,哪里出了錯(cuò)?
首先非常重要的一點(diǎn)是 PHP 設(shè)置項(xiàng) register_globals 同樣會對服務(wù)器端和環(huán)境變量產(chǎn)生影響。當(dāng) register_globals = off (從 PHP 4.2.0 開始其默認(rèn)值為 off),變量 $DOCUMENT_ROOT 將不會存在,而只有 $_SERVER['DOCUMENT_ROOT']。如果 register_globals = on 則變量 $DOCUMENT_ROOT 和 $GLOBALS['DOCUMENT_ROOT'] 將同時(shí)存在。
如果您確認(rèn) register_globals = on 但不知道為什么 $DOCUMENT_ROOT 在函數(shù)內(nèi)部不可用,這是因?yàn)樗推渌淖兞恳粯有枰诤瘮?shù)中執(zhí)行 global $DOCUMENT_ROOT。請參閱手冊中“變量范圍”的有關(guān)章節(jié)。我們建議您在 register_globals = off 的情況下進(jìn)行編碼。
Superglobals:可用性說明: 自 PHP 4.1.0 開始,可以使用超級全局?jǐn)?shù)組例如 $_GET,$_POST 和 $_SERVER 等等。更多信息請閱讀手冊中的 superglobals
總結(jié)
以上是生活随笔為你收集整理的使用php,使用 PHP的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于微信浏览器H5 React,Vue工
- 下一篇: php打png图片水印颜色失真,Thin