PHP 的前身是一個用 Perl 編寫的簡單小型 cgi 封裝器。我在合約之間的空檔,需要一個快速工具來了解誰在閱讀我的線上履歷時,在一個下午寫了它。它從未打算超出我自己的私人使用範圍。我放置履歷的網路伺服器負載過重,並且在 fork 程序時不斷出現問題。我用 C 重寫了 Perl 封裝器,以消除每次存取我的履歷時都必須 fork Perl 的大量額外負荷。
最終,同一個網路伺服器上的其他人遇到了我的封裝器,並詢問他們是否可以使用它。然後,就像不可避免地發生的那樣,他們開始要求更多功能。我新增了更多功能,並最終整理出一個半完整的發行版本,以及文件、郵寄清單和常見問題。這個第一個套件的名稱是「個人網頁工具」,後來成為「個人網頁建構套件」。
同時,我開始玩資料庫,並編寫了一個工具,可以輕鬆地將 SQL 查詢嵌入到網頁中。它基本上是另一個 CGI 封裝器,可以解析 SQL 查詢,並使基於這些查詢建立表單和表格變得容易。這個工具被命名為 FI(表單解譯器)。
PHP/FI 2.0 版是將這兩個套件合併為單一程式的完整重寫。它現在已經發展到可以將簡單的程式語言嵌入 HTML 檔案中的地步。最初的縮寫 PHP 仍然保留下來。它現在已經不太合適了。PHP/FI 現在更多地用於整個網站,而不是小型個人網頁設定。無論名稱如何,它都允許您將簡單的腳本直接放置在 HTML 檔案中,從而消除了對許多小型 Perl cgi 程式的需求。由於消除了多次 fork Perl 的額外負荷,這可以加快網頁的整體效能。透過將網頁的所有元件放置在單一 html 檔案中,它也更容易管理大型網站。透過包含對各種資料庫的支援,也使得開發啟用資料庫的網頁變得微不足道。許多人發現嵌入式性質比嘗試建立單獨的 HTML 和 CGI 檔案更容易處理。
PHP 3.0 版是另一次重寫。如果您剛開始使用 PHP,我建議您從 3.0 版開始,而不是在現階段繼續使用 2.0 版。PHP3 將很快取代 PHP/FI 2.0,所有開發工作現在都集中在 PHP3 上。除非它們很簡單,否則不太可能修復 PHP/FI 2.0 中的任何剩餘錯誤。有關 PHP3 的更多資訊,請參閱 http://www.lerdorf.on.ca/php3。
在本文檔中,任何對 PHP、FI 或 PHP/FI 的引用都表示同一件事。PHP 和 FI 之間的區別僅是概念上的。兩者都是從相同的來源發行版建置的。當我建置不包含任何存取記錄或存取限制支援的套件時,我將我的二進位檔案稱為 FI。當我使用這些選項建置時,我將其稱為 PHP。
如果您完全沒有 Unix 經驗,您可能需要四處詢問是否有具有少量 Unix 知識的人來協助您完成此安裝。已經盡一切努力使其盡可能簡單,但由於該軟體相當複雜且依賴許多不同的元件,因此假設它在所有系統上都能順利運行是不切實際的。您可能需要一位熟悉目標系統細節的人在身邊。
- 您可以在伺服器上執行 get 和 post 方法 cgi 程式嗎?
如果您安裝的是 Apache 模組版本,則此項無關緊要。 如果沒有,您就無法使用此套件。在許多公共 ISP 上,CGI 程式不是被禁止就是受到嚴重限制。如果您的系統是這種情況,請與您的系統管理員交談,請他/她查看此套件,並看看他們是否會為您安裝它。
- 如果您的系統上安裝了 mSQL,您需要知道此安裝的基本目錄。
- 如果您的系統上安裝了 Postgres95 或 PostgreSQL,您需要知道此安裝的基本目錄。
- 如果您要將記錄和存取設定檔儲存在 NFS 掛載的目錄中,而您的系統沒有提供 NFS 檔案鎖定,那麼您需要在 src/Makefile 中手動定義 NFS_HACK 變數,並且您可能需要使用稍微修改過的 gdbm 程式庫。有關這方面的更多資訊,請參閱 doc 目錄中的 nfs_hack.txt 檔案。
- 請注意,如果您對使用 PHP 追蹤對您頁面的存取不感興趣,請不要將此選項編譯到二進位檔案中。您也應該省略存取限制程式碼。包含這些選項會產生相當大的額外負荷。
- 如果您正在安裝 Apache 模組版本,您需要知道 Apache src 程式碼目錄位置。
步驟 1。
執行安裝程式:./install
您會被問到一些問題。如果您不了解所問的問題,只需按下 Enter 鍵即可。預設選擇在大多數系統上應該是安全的。但是,這不適用於要求您指定設定和記錄檔目錄的問題。選擇任何 httpd(通常是「nobody」)具有寫入權限的目錄。您可以手動在某處建立此目錄,然後只需 chown nobody directory
。
步驟 2。
進入 src 目錄:cd src
查看 php.h 檔案。這裡可以設定一些編譯時選項。
步驟 3。
輸入:make
這將建立名為 php.cgi 的實際可執行程式檔案(預設情況下),如果您安裝的是 Apache 模組,則會建立 libphp.a 檔案。
步驟 4。(如果您沒有安裝 Apache 模組版本)
將 php.cgi 二進位檔案複製到您系統的 cgi-bin 目錄中。如果您無法執行此操作,並且希望將其安裝在您自己的個人目錄中,您可以這麼做,但您應該使用以下命令在可執行檔案上設定 setuid 位元:chmod u+s /path/php.cgi
如果您沒有在二進位檔案上設定 setuid 位元,則由二進位檔案建立的任何檔案都將由執行網路伺服器的使用者 ID 所擁有。如果這是可以接受的,那麼您可以安全地關閉 setuid 位元。
步驟 4。(如果您正在安裝 Apache 模組版本)
變更到您的 Apache src 目錄,其中應該已複製了 mod_php.c 和 mod_php.h 檔案。如果它們沒有被複製(通常是因為權限問題),請手動將這兩個檔案複製到那裡。編輯您的 Apache 設定檔,並新增在 步驟 3 結尾產生的 EXTRA_LIBS 行。並將
Module php_module mod_php.o
新增到檔案的最後。然後輸入:./Configure,然後輸入 make 以重建您的 Apache httpd 二進位檔案。安裝這個二進位檔案。
接下來,您需要編輯您的 Apache conf/srm.conf 檔案,並新增類似
AddType application/x-httpd-php .phtml
這會定義一個新的 MIME 類型,application/x-httpd-php,它會觸發 PHP 模組來解析任何以 .phtml 副檔名結尾的檔案。您可以選擇任何您喜歡的副檔名。
您可能不希望允許所有人執行 PHP 解析的檔案。您可以將上述 AddType 行放在 access.conf 檔案中的 <Location /path>....</Location> 指令內,以僅允許伺服器上特定目錄中的文件由 PHP 解析。
現在您可以重新啟動您的 httpd 伺服器了。請參閱Apache 模組注意事項以瞭解更多關於設定 PHP 模組的詳細資訊。
安裝完成後,您可以透過在瀏覽器中輸入類似以下的 URL 來測試您的可執行檔是否正常運作
http://your.site.domain/cgi-bin/php.cgi
這應該會顯示一個包含版本號碼以及其他各種有用資訊的頁面。
要測試 Apache 模組版本,請建立任何具有 .phtml 副檔名的檔案,並在檔案中放入類似:<?phpinfo()> 的標籤,看看它是否被解析。
若要在現有的 HTML 檔案上實際使用該軟體,您只需將檔案的路徑附加到上述 URL。例如:
http://your.site.domain/cgi-bin/php.cgi/path/file.html
您應該查看此文件的CGI 重定向章節。透過重定向執行 PHP/FI 意味著您可以自動讓像 http://your.site.domain/file.phtml 這樣的 URL 由 PHP/FI 解析。
這不適用於 Apace 模組使用者。
如果您透過 PHP/FI 執行一個頁面,您會注意到的第一件事是它會添加一個頁尾,其中包含您的頁面被存取次數的資訊(如果您已將存取日誌編譯到二進位檔中)。這只是 PHP/FI 可以為您做的事情的一小部分。它還作為表單解譯器 CGI 發揮另一個非常重要的作用,因此名稱中有 FI 部分。例如,如果您在您的網頁上建立一個表單,您需要一些東西來處理該表單上的資訊。即使您只是想將資訊傳遞到另一個網頁,您也必須有一個 CGI 程式來為您執行此操作。PHP/FI 使擷取表單資料並使用它變得非常容易。
一個簡單的例子
假設您有一個表單
<FORM ACTION="/cgi-bin/php.cgi/~userid/display.html" METHOD=POST>
<INPUT TYPE="text" name="name">
<INPUT TYPE="text" name="age">
<INPUT TYPE="submit">
</FORM>
您的 display.html 檔案可以包含類似以下內容
<?echo "你好 $name,您 $age 歲了!<p>">
就這麼簡單!PHP/FI 會自動為您表單中的每個表單輸入欄位建立一個變數。然後,您可以在 ACTION URL 檔案中使用這些變數。
一旦您了解如何使用變數,下一步就是開始使用您頁面中的一些邏輯流程標籤。例如,如果您想根據使用者輸入的內容顯示不同的訊息,您將使用 if/else 邏輯。在我們上面的範例中,我們可以透過將我們的 display.html 變更為
<? if($age>50); echo "Hi $name, you are ancient!<p>"; elseif($age>30); echo "Hi $name, you are very old!<p>"; else; echo "Hi $name."; endif; >
PHP/FI 提供了一個非常強大的腳本語言,它將比上述簡單範例展示的更多功能。請參閱關於PHP/FI 腳本語言的章節以瞭解更多資訊。
您還可以使用 PHP/FI 來設定允許誰存取您的頁面。這是透過內建的設定畫面完成的。透過這個,您可以例如指定只有來自特定網域的人才能看到您的頁面,或者您可以建立一個規則來密碼保護某些頁面。請參閱存取控制章節以瞭解更多詳細資訊。
PHP/FI 還能夠接收來自任何符合 RFC-1867 標準的網頁瀏覽器的檔案上傳。此功能可讓使用者上傳文字和二進位檔案。憑藉 PHP/FI 的存取控制和邏輯功能,您可以完全控制允許誰上傳以及上傳檔案後該如何處理。請參閱檔案上傳章節以瞭解更多詳細資訊。
PHP/FI 支援一個名為 mSQL 的資料庫套件。這可讓您將資訊放入資料庫中,並透過簡單的嵌入式 SQL 查詢直接在您的 .HTML 檔案中存取此資訊。為網頁新增資料庫後端從未如此容易。請參閱mSQL 支援章節以瞭解更多資訊。
PHP/FI 支援 Postgres95/PostgreSQL 資料庫套件。它支援在您的 .HTML 檔案中嵌入式 SQL 查詢。請參閱Postgres95/PostgreSQL 支援章節以瞭解更多資訊。
PHP/FI 還支援 mysql 資料庫套件。它支援在您的 .HTML 檔案中嵌入式 SQL 查詢。請參閱mysql 支援章節以瞭解更多資訊。
執行 PHP/FI 的一個好方法是使用 Apache 伺服器的 CGI 重定向模組。請注意,如果您使用的是 PHP/FI 的 Apache 模組版本,則無需擔心重定向模組。有兩個可用的重定向模組。一個是由 Dave Andersen <angio@aros.net> 開發的,可在 ftp://ftp.aros.net/pub/util/apache/mod_cgi_redirect.c 取得,另一個是與 Apache 捆綁在一起的,稱為 mod_actions.c。這些模組非常相似。它們的用法略有不同。兩者都經過測試,並且都適用於 PHP/FI。
在撰寫本文時(1996 年 4 月 20 日)一個很大的注意事項是,目前官方發佈的 Apache 版本 (1.0.5) 有一個嚴重的限制,會阻止 CGI 重定向請求與任何 post-method 資料相關聯。我已經追蹤到並在我的 Apache 版本中修復了此問題,並且在 PHP 首頁的檔案封存中提供了官方修補程式。
Apache 1.0.x 的第二個相當大的注意事項是它在大多數架構上沒有正確對齊 double 類型。您可能會發現當使用 mod_php 時,您的 httpd 會出現奇怪的匯流排錯誤,您可以升級到 Apache 1.1 或編輯 alloc.c Apache 原始程式碼。在此檔案中,您會找到以下程式碼片段
union align { /* Types which are likely to have the longest RELEVANT alignment * restrictions... we don't do much with doubles. */ char *cp; void (*f)(); long l; FILE *fp; };
您需要在此行中新增一個 double 並重新編譯您的 Apache 伺服器。正確的程式碼區塊是
union align { /* Types which are likely to have the longest RELEVANT alignment * restrictions... we don't do much with doubles. */ char *cp; void (*f)(); long l; FILE *fp; double d; };
這些問題都已在更高版本的 Apache 中修復。
請查看 Apache 文件,瞭解如何新增模組。一般來說,您會將模組名稱新增到名為 Configuration 的檔案中。如果要使用 mod_actions 模組,要新增的行是
Module action_module mod_actions.o
如果您使用 mod_cgi_redirect.c 模組,請新增此行
Module cgi_redirect_module mod_cgi_redirect.o
然後編譯您的 httpd 並安裝它。若要設定 CGI 重定向,您需要在您的 mime.types 檔案中建立新的 MIME 類型,或者您可以使用 srm.conf 檔案中的 AddType 命令來新增 MIME 類型。要新增的 MIME 類型應該類似這樣
application/x-httpd-php phtml
如果您使用的是 mod_actions.c 模組,則需要在您的 srm.conf 檔案中新增以下行
Action application/x-httpd-php /cgi-bin/php.cgi
如果您使用 mod_cgi_redirect.c,則應將此行新增至 srm.conf
CgiRedirect application/x-httpd-php /cgi-bin/php.cgi
請勿嘗試同時使用 mod_actions.c 和 mod_cgi_redirect.c。
一旦您安裝並正確設定了其中一個 CGI 重定向模組,您就可以指定您希望由 php/fi 解析檔案,只需將檔案的副檔名設定為 .phtml。此外,如果您將 index.phtml 新增到您 srm.conf 檔案中的 DirectoryIndex 設定行,那麼如果您的索引檔案名為 index.phtml,則目錄中的頂層頁面將會自動由 php 解析。
您可以使用 Netscape 伺服器 CGI 重定向模組自動將具有給定副檔名的檔案請求重定向,由 PHP/FI 處理。此模組可在 PHP/FI 首頁的檔案封存中取得。套件中的 README 清楚說明了如何設定以搭配 PHP/FI 使用。
NCSA 目前不支援模組,因此若要使用此伺服器進行 CGI 重定向,您需要修改伺服器原始碼。在 PHP/FI 檔案封存中提供了使用 NCSA 1.5 執行此操作的修補程式。
CGI 版本的 PHP/FI 不會讀取目錄中可能存在的任何 .htaccess 檔案。這表示如果您有使用標準 .htaccess 伺服器式存取控制功能保護的檔案,人們可能會透過 PHP/FI 載入頁面來規避此安全性。請注意,這對於 PHP/FI 的 Apache 模組版本來說不是問題。
CGI 版本的第二個問題是,如果將其放置在系統的 cgi-bin 目錄中,則只要它執行的使用者 ID 有權存取,它就可以用來檢視您系統上的任何檔案。
針對此問題有幾種不同的解決方案。最簡單的可能是使用在 php.h 中找到的 PATTERN_RESTRICT 功能。這可讓您定義允許由 PHP/FI 解析的副檔名(或副檔名模式)。如果檔案沒有這個副檔名,並且有人嘗試使用 PHP/FI 載入它,則會出現拒絕存取訊息。
另一個解決方案是使用 PHP/FI 存取控制機制來模擬您在 .htaccess 檔案中的存取控制設定。但是,將此資訊保留在兩個地方可能很繁瑣,而且這兩個系統並未共用所有相同的功能。
此問題也可以使用檔案權限來解決。PHP/FI 可以設定為以您希望的任何使用者身分 setuid 執行。然後,將要由 PHP/FI 讀取的檔案可以給予適當的權限,並且不希望由 PHP/FI 讀取的檔案應由另一個使用者 ID 擁有,並相應地變更其權限。
如需更多與提供 PHP 共用存取的網站相關的安全性選項,請參閱安全模式章節。
PHP 的安全模式嘗試解決許多 ISP 面臨的常見問題,即讓他們的所有使用者執行 CGI 程式。使共用 CGI 存取更安全的常見機制是使用 CGI 包裝器,例如 Apache 附帶的 su_exec 工具。這對於以模組形式執行的 PHP 無效,因為它不是可以 setuid 的單獨處理程序。
它基於檔案權限配置。簡而言之,如果檔案的所有者與嘗試存取它的腳本使用者 ID 相同,或者如果檔案所在的目錄的所有者與嘗試存取它的腳本使用者相同,則允許存取。這裡需要注意的是,您必須確保您的作業系統不允許非 root 使用者將其檔案的所有權 chown 掉。許多舊的 SysV 系統允許這樣做。最常見的是 Irix。可以在 Irix 的 OS 層級變更此行為。
安全模式適用於每個可能存在安全風險的功能。以下是目前套用至每個相關功能的檢查清單。在以下清單中,PHP UID 是指 PHP 正在解析的目前檔案的所有者使用者 ID,而 HTTP UID 是指 httpd 處理程序執行的使用者 ID(通常為 nobody)。
如果您建置了 PHP/FI 的 CGI 版本,您可以簡單地從命令列輸入:php.cgi filename
來使用它,其中 filename 是您想要解析的檔案。您也可以建立獨立的 PHP/FI 腳本,方法是讓您的腳本的第一行看起來像這樣
#!/usr/local/bin/php.cgi -q"-q" 會抑制 HTTP 標頭的列印。如果您願意,可以省略此選項。
只有在 PHP/FI 作為 Apache 模組執行時,才能使用 PHP/FI 中的 HTTP 身份驗證掛鉤。在 Apache 模組的 PHP/FI 腳本中,可以使用 Header() 命令向客戶端瀏覽器發送「需要身份驗證」訊息,使其彈出使用者名稱/密碼輸入視窗。一旦使用者填寫了使用者名稱和密碼,就會再次呼叫包含 PHP/FI 腳本的 URL,並將變數 $PHP_AUTH_USER、$PHP_AUTH_PW 和 $PHP_AUTH_TYPE 分別設定為使用者名稱、密碼和驗證類型。目前僅支援「Basic」驗證。
以下是一個範例腳本片段,它會在頁面上強制執行用戶端驗證
<? if(!$PHP_AUTH_USER) { Header("WWW-authenticate: basic realm=\"My Realm\""); Header("HTTP/1.0 401 Unauthorized"); echo "Text to send if user hits Cancel button\n" exit; } else { echo "Hello $PHP_AUTH_USER.<P>"; echo "You entered $PHP_AUTH_PW as your password.<P>"; } >
您可能不只是單純地印出 $PHP_AUTH_USER 和 $PHP_AUTH_PW,而是會想要檢查使用者名稱和密碼是否有效。或許可以透過向資料庫發送查詢,或是在 dbm 檔案中查找使用者。
請注意市面上有些 Internet Explorer 瀏覽器有錯誤。它們似乎對標頭的順序非常挑剔。目前看來,在 HTTP/1.0 401 標頭之前發送 WWW-authenticate 標頭似乎可以解決問題。
為了防止有人編寫一個腳本來洩漏透過傳統外部機制驗證的頁面的密碼,如果該特定頁面啟用了外部驗證,則不會設定 PHP_AUTH 變數。
但請注意,以上方法並不能阻止控制未驗證 URL 的人從同一伺服器上已驗證的 URL 竊取密碼。可以在 php.h 中取消定義 PHP_AUTH_VARS,以確保永遠不會設定這些變數,從而禁止任何人使用 mod_php 來嘗試竊取密碼。
當 PHP 作為 Apache 模組執行時,您可以存取遠端瀏覽器發送的請求標頭變數,方法是在您想要使用的標頭值前面加上 $req_。如果請求名稱包含 - 字元,例如 User-Agent,則需要將 - 對應到 _(底線)。例如,將其參考為 $req_User_Agent。phpinfo() 函數可用於顯示所有請求標頭。
例如。
< echo "$req_connection<br>"; echo "$req_host<br>"; >上面的簡單腳本可能會輸出
Keep-Alive www.host.com
將 PHP/FI 作為 Apache 模組執行是使用該套件最有效率的方式。將其作為模組執行表示 PHP/FI 功能與 Apache 伺服器的功能合併在單一程式中。以模組方式執行它有許多優點
在效能方面,它比傳統的 CGI 程式快得多。事實上,當將 PHP/FI 作為模組執行時,不會涉及 CGI。HTML 檔案中的腳本程式碼會由 Apache 網頁伺服器程序直接執行。
當作為模組執行時,無論是在 Apache conf 檔案中還是在私有 .htaccess 檔案中定義的正常 httpd 為基礎的存取限制規則都會先套用,然後才允許模組解析檔案。或者,您也可以建立控制正常 httpd 為基礎的身份驗證的 PHP/FI 腳本。請參閱HTTP 身份驗證。
由於解析器始終在 httpd 程序內部處於活動狀態,因此可以使用用於配置 httpd 程序的相同配置文件在啟動時對其進行配置。也可以透過將 PHP 配置指令放置在 .htaccess 檔案中,來對每個目錄配置模組。
對於有興趣從 Apache 內部存取其函數的 C 程式設計師來說,PHP/FI 框架提供了非常簡單的 Apache 和 PHP 本身介面。與從頭開始編寫整個 Apache 模組相比,向 PHP 新增函數並從已解析的頁面呼叫該函數要容易得多。有關更多詳細資訊,請參閱本文檔末尾的向 PHP/FI 新增您自己的內部函數章節。
以下指令可以放置在 srm.conf 檔案中,或在 access.conf 中的 <Directory>...</Directory> 標籤內,或在 access.conf 中的 <Location /path>...</Location> 標籤內,或在個別的 .htaccess 檔案中。為了讓這些指令在 .htaccess 檔案中起作用,必須在 AllowOverride Apache 指令上設定 Options 覆蓋,但 phpEngine 指令除外,它僅在 *.conf 檔案中可用。
所有這些指令都是可選的。如果未在任何地方指定指令,則將使用編譯時間預設值。
PHP/FI 可以使用 FastCGI 支援進行編譯。您需要在編譯 PHP/FI 之前,提取並編譯適用於您平台的FCGI 開發套件。您還需要讓 CGI 重新導向正常運作。然後,請按照 FastCGI 文件中的說明為您的平台配置 FastCGI。如果您正在將 mod_fastcgi 模組與 Apache 伺服器搭配使用,以下是逐步說明
AddType application/x-httpd-fcgi .fcgi
AppClass /usr/local/etc/httpd/fcgi-bin/php.fcgi -processes 4
AddType application/x-httpd-fphp .fhtml
Action application/x-httpd-fphp /fcgi-bin/php.fcgi
現在,任何具有 .fhtml 副檔名的頁面都將移交給已經在執行的 FastCGI php.fcgi 程序。php.fcgi 二進制檔仍將作為普通的 CGI 二進制檔工作,因此您可以僅建立從 php.cgi 到 php.fcgi 的符號連結。
如果您未使用 Apache,則上述步驟將會類似,但不完全相同。PHP/FI 檔案封存中提供了適用於 NCSA 和 Netscape 伺服器的 CGI 重新導向機制。
請注意,內建的基於 PHP/FI 的存取控制很可能會在未來版本中停止使用。您應該認真考慮改用網頁伺服器隨附的安全機制。
如果您選擇在編譯套件時包含存取控制,您可以將 ?config 附加到任何 URL 以編輯存取控制檔案。例如
http://your.machine.domain/cgi-bin/php.cgi/path/file.html?config
您的配置密碼最初將設定為您的使用者 ID。如果您的使用者 ID 無法作為您的密碼,則可能表示 PHP 無法讀取 /etc/passwd 檔案來定位您的使用者 ID。在這種情況下,初始密碼將設定為「php」。最好變更此密碼。請注意,多個使用者可以透過單個 PHP/FI 二進制檔維護他們自己的個人配置文件。
存取控制最初可能會相當令人困惑。?config 畫面分為多個部分。頂部部分用於變更用於確保只有知道此密碼的人才能變更存取控制特性的密碼。在全系統安裝中,每個使用者都有他或她自己的配置畫面,並具有他或她自己的密碼。
?config 畫面的第二部分包含多個表格。每個表格都定義一個規則集。第一個規則集始終是預設規則集。如果頁面沒有為其特別定義規則集,則使用此預設規則集。在預設規則集之後,將會跟隨任意數量的特定規則集表格。
若要為特定檔案新增規則集,請在瀏覽器中輸入檔案的 URL,並將 ?config 新增到 URL 的末尾。在顯示的 ?config 畫面上,您會看到已為此頁面新增了規則集(如果它尚未存在)。新增新的規則集時,它最初會設定為與預設規則集相同。下圖顯示了兩個簡單的規則集。第一個是預設規則集,僅指示應記錄來自所有網域的命中次數,第二個是針對檔案 /~rasmus/test.html,只有來自「.edu」網域的任何使用者不會被授與存取權。
若要編輯規則集,請修改規則集中的欄位,直到達到所需的配置,然後點擊「提交變更」按鈕。如果需要更多規則,請點擊「新增規則」按鈕,然後編輯新增的規則。
若要刪除規則,請選取規則右側的核取方塊,然後點擊「提交變更」按鈕。畫面將會重新繪製,並且規則應該會消失。
請注意,您需要在模式欄位中輸入正規表示式。有關更多詳細資訊,請參閱本文件中有關正規表示式的章節。
存取日誌是另一個可選功能,可以在編譯時透過在安裝腳本中回答Yes來啟用。您可以將您的存取日誌資料儲存在 dbm 檔案、mSQL 資料庫或 MySQL 資料庫中。後兩者功能更強大,但設定起來也稍微困難一些。
若要使用 dbm 檔案儲存您的存取日誌,您需要指定一個可以寫入日誌檔案的目錄。如果目錄不存在,PHP 會嘗試建立它,但為了確保它具有正確的權限,您可能需要在第一次執行 PHP 之前自行建立此目錄。該目錄的權限應使執行 PHP cgi 程式的使用者 ID 能夠寫入該目錄。
若要使用 mSQL 或 MySQL 資料庫來儲存您的存取日誌資料,您首先需要確保您的系統已安裝並執行 mSQL 或 MySQL。然後您需要建立一個資料庫。預設名稱為「phpfi」,雖然可以在 src/php.h 中更改。要為 mSQL 建立此資料庫,請輸入
msqladmin create phpfi
或為 MySQL 輸入
mysqladmin create phpfi
然後針對 mSQL,編輯您的 msql.acl 檔案,並確保資料庫的權限正確。類似以下內容應足夠
database=phpfi read=* write=nobody,<your user id> access=local
對於 MySQL,您需要確保 httpd 使用者(通常是「nobody」)可以存取資料庫。與 mSQL 不同,MySQL 將存取控制資料儲存在資料庫中。假設使用預設權限,您應該可以直接執行以下命令
echo "INSERT INTO user VALUES ('localhost','nobody','','Y','Y','Y','Y','Y','Y','Y','Y','Y');" | mysql mysql
別忘了使用以下命令載入這個新的設定
mysqladmin reload
對於您要儲存日誌資料的每個使用者 ID,您需要建立兩個資料表。scripts 目錄中的 msqllog shell script 將為您執行此操作。只需輸入
msqllog <user id>
或為 MySQL 輸入
mysqllog <user id>
腳本將建立適當的資料表。您可能需要編輯腳本,以反映資料在您的系統上的儲存位置。
您可能需要查看此腳本。它定義了日誌資料表的欄位大小。例如,如果您知道您的檔案路徑超過 64 個字元,您需要在此 msqllog 或 mysqllog 檔案中增加 logN 和 lastN 資料表的檔案名稱大小。
存取日誌會儲存關於每個頁面「點擊」的資訊。然後,可以透過檢查這些日誌檔案來總結這些資訊。套件中包含一個範例日誌檔案摘要腳本。它是 examples
目錄中的 log.html
檔案。這是 dbm 日誌檔案分析器。mSQL 日誌檔案分析器稱為 mlog.html
。MySQL 日誌檔案分析器稱為 mylog.html
。若要執行它,請將它和其他 mlog.* 檔案複製到可以從您的網頁伺服器存取的目錄,然後輸入
http://your.machine.domain/cgi-bin/php.cgi/path/mlog.html
或者,如果您使用的是 Apache 模組版本,您可以為該腳本加上「.phtml」副檔名,然後使用以下方式呼叫它
http://your.machine.domain/path/mlog.phtml
預設情況下,如果您已啟用存取日誌功能編譯 PHP,那麼您的頁面將會出現一個包含一些存取資訊的頁尾。您可能不想看到這個頁尾,但仍然要記錄點擊次數。如果您正在執行 Apache,您可以使用 Apache httpd.conf 或 .htaccess 檔案中的「phpShowInfo off」行來關閉此頁尾。如果您沒有執行 Apache,您可以透過在頁面的 ?config 區段中建立規則,或者在您的頁面中加入類似以下的標籤來關閉這些日誌頁尾
<?setshowinfo(0)>
所有 CGI 包裝器的一個常見問題是,HTTPD 程式會將目前目錄變更為正在載入的內容所在的目錄。就 CGI 程式而言,目前目錄會設定為 CGI 程式所在的目錄。通常這不是問題,除非涉及到相對 URL。
相對 URL 是指依賴於目前目錄與目前 HTML 檔案所在目錄相同的 URL。因此,舉例來說,如果我有一個 URL
http://my.machine/~rasmus/file.html
實際的 HTML 檔案可能是
~rasmus/public_html/file.html
如果在 file.html
檔案中,我有以下標籤
<IMG SRC="pic.gif">
正常載入時,這個 gif 檔案預期會在 ~rasmus/public_html/pic.gif
中。然而,當透過 CGI 包裝器使用類似以下的 URL 載入時
http://my.machine/cgi-bin/php.cgi/~rasmus/file.html
然後 HTTPD 會將目前目錄設定為 /cgi-bin
(或 ScriptAlias 可能指向的任何位置),隨後當頁面載入時,預期 pic.gif
檔案會在:/cgi-bin/pic.gif
中,這通常不是預期的效果。
解決此問題的快速方法是使用絕對 URL。在上面的範例中,如果圖片標籤是
<IMG SRC="/~rasmus/pic.gif">
那麼就不會有問題。使用絕對 URL 並非總是理想的,因為它會降低頁面的可攜性。此時您可能會有一個明顯的問題:「為什麼 PHP 不將目前目錄變更為正確的位置?」答案是 PHP 實際上會將目前目錄變更為它正在顯示的 HTML 檔案的位置。PHP 指令碼標籤內使用的任何檔案路徑都可以是相對路徑。問題是 PHP 控制之外的標籤(例如 <img > 和 <a href >)不會透過 PHP 傳遞。當它們被剖析時,PHP 不再活動,且目前工作目錄已設定回 HTTP Daemon 指定的目錄。
解決方案是一種折衷方案。PHP 提供一個名為 PATH_DIR 的變數。它始終包含目前 HTML 檔案的目錄部分。如果在 <img > 和 <a href > 標籤中使用此 PATH_DIR 變數,則可以達到相對 URL 的效果,儘管對伺服器來說,它在剖析時看起來會像絕對 URL。從我們上面的範例來看,我們唯一需要做的變更是將 img 標籤變更為
<IMG SRC="<?echo $PATH_DIR>/pic.gif">透過使用以上方式,您可以移動包含此標籤的檔案,而該標籤將始終參照來源 HTML 檔案所在目錄中的
pic.gif
檔案。處理此問題的另一種方法是在 HTML 檔案中使用傳統的 <BASE HREF=...>。
PHP 將會偵測來自 HTML 表單的 GET 和 POST 方法資料。一個重要的理解點是,如果兩者都存在,則始終會優先處理 POST 方法資料。如果 PHP 變數由 POST 方法資料定義,或者如果變數由 Unix 環境中的 HTTP daemon 定義,則 GET 方法資料無法覆寫它。這是為了防止有人在他們的 URL 中加入 ?REMOTE_HOST=some.bogus.host,並因此欺騙 PHP 日誌機制記錄這個替代資料。但是,允許 POST 方法資料覆寫這些變數。
任何形式為 word=something 的 GET 資料(URL 中 '?' 之後的資料)的元件都會定義變數 $word 以包含值 something。即使資料不是這種形式,也可以使用內建的 $argv 陣列存取。例如,在類似以下的 URL 中
/cgi-bin/php.cgi/file.html?abc+def+EMAIL_ADDR=rasmus@lerdorf.on.ca&var=valuePHP 符號表的相關元件將會是
$argc = 4 $argv[0] = abc $argv[1] = def $argv[2] = EMAIL_ADDR=rasmus@lerdorf.on.ca&var=value $EMAIL_ADDR = rasmus@lerdorf.on.ca $var = value
請注意,資料的 EMAIL_ADDR 部分如何同時顯示為未剖析的 $argv[2],並且會建立 $EMAIL_ADDR 變數以包含 rasmus@lerdorf.on.ca。
上面的範例中使用 $EMAIL_ADDR 變數是因為如果您正在使用 PHP 的日誌功能,它會是一個有用的變數。透過加入
?EMAIL_ADDR=
到頁面上任何已知使用者電子郵件地址的連結,您可以將它傳播到下一頁。PHP 日誌系統將會自動尋找此變數,並在日誌中將其值記錄為使用者的電子郵件地址。對於任何 PHP1 的使用者而言,以上內容的作用與將 ?<!--$email--> 加入到 PHP1 中過去使用的 URL 相同。現在看起來稍微複雜了一些,但它也是完全通用的,允許您建立自己的複雜頁面。
在上面的範例中,您也可以看到如何透過使用 "&" 字元分隔每個變數,直接在 GET 方法資料中定義多個變數。這個以 "&" 分隔的變數清單必須是 GET 方法資料的最後一個(或唯一)元件,它才能有效。
HTML 結構中的 SELECT MULTIPLE 標籤允許使用者從清單中選取多個項目。然後這些項目會傳遞到表單的動作處理程式。問題在於它們都以相同的 widget 名稱傳遞。例如
<SELECT NAME="var" MULTIPLE>
每個選取的選項都會以以下形式到達動作處理程式
var=option1
var=option2
var=option3
每個選項都會覆寫先前 $var 變數的內容。解決方案是使用 PHP/FI 的非索引陣列功能。應使用以下內容
<SELECT NAME="var[]" MULTIPLE>
這會告知 PHP/FI 將 var 視為陣列,且每次將值指派給 var[] 都會將項目新增到陣列中。第一個項目變成 $var[0],下一個項目變成 $var[1],依此類推。可以使用 count() 函式來判斷選取了多少選項,如果需要,可以使用 sort() 函式來排序選項陣列。
IMAGE SUBMIT
和 PHP
提交表單時,可以使用影像代替標準提交按鈕,並使用類似以下的標籤
<input type=image src=image.gif name=sub>
當使用者在影像上的某個位置按一下時,隨附的表單將會傳輸到伺服器,並帶有兩個額外的變數 sub_x 和 sub_y。這些變數包含使用者在影像中按一下的座標。有經驗的人可能會注意到瀏覽器傳送的實際變數名稱包含句號而不是底線,但 PHP 會自動將句號轉換為底線。
PHP 並非支援所有 GD 功能。如需支援的函式清單,請參閱函式字母清單。所有 GD 函式都以 Image 這個字開頭。
有關 GD 套件的更多資訊,請參閱:http://www.boutell.com/gd/。
GD 1.2 版權屬於 1994 年、1995 年 Quest Protein Database Center,Cold Springs Harbor Labs。
PHP/FI 將會自動偵測瀏覽器上傳的檔案,該瀏覽器支援 E. Nebel 和 L. Masinter 來自 Xerox 所提出的基於表單的檔案上傳功能,並在 RFC 1867 中描述。
可以透過建立一個看起來類似以下的特殊表單來建立檔案上傳畫面
<FORM ENCTYPE="multipart/form-data" ACTION="_URL_" METHOD=POST>
<INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="1000">
Send this file: <INPUT NAME="userfile" TYPE="file">
<INPUT TYPE="submit" VALUE="Send File">
</FORM>
_URL_ 應指向一個 php html 檔案。MAX_FILE_SIZE 隱藏欄位必須位於檔案輸入欄位之前,其值為可接受的最大檔案大小。該值以位元組為單位。在這個目標檔案中,成功上傳後會定義以下變數:
上傳的檔案在伺服器機器上儲存的暫時檔名。
發送者系統上檔案的原始名稱。
上傳檔案的大小,以位元組為單位。
如果瀏覽器提供了此資訊,則為檔案的 MIME 類型。例如:「image/gif」。
以上變數的 $userfile 基本名稱將與上傳表單中的 NAME 欄位相符。
檔案預設會儲存在伺服器的預設暫存目錄中。您可以透過在 PHP/FI 運行的環境中設定環境變數 TMPDIR 來變更此設定。不過,從 PHP/FI 腳本中使用 PutEnv() 呼叫來設定它將不會起作用。或者,您可以透過編輯 php.h 並定義 UPLOAD_TMPDIR 變數來在暫存目錄中硬式編碼。
接收上傳檔案的 PHP/FI 腳本應實作任何必要的邏輯,以判斷如何處理上傳的檔案。例如,您可以使用 $file_size 變數來捨棄任何太小或太大的檔案。您可以使用 $file_type 變數來捨棄任何與特定類型標準不符的檔案。無論邏輯為何,您都應該從暫存目錄中刪除檔案或將其移動到其他位置。
請注意,CERN httpd 似乎會從它從用戶端取得的 content-type MIME 標頭中,刪除第一個空格後的所有內容。只要情況如此,CERN httpd 將不支援檔案上傳功能。
PHP/FI 透明地支援 Netscape 規範所定義的 HTTP Cookie。Cookie 是一種將資料儲存在遠端瀏覽器中,從而追蹤或識別返回使用者的機制。您可以使用 SetCookie() 函數來設定 Cookie。Cookie 是 HTTP 標頭的一部分,因此必須在將任何輸出傳送到瀏覽器之前呼叫 SetCookie() 函數。這與 Header() 函數的限制相同。
從用戶端傳送給您的任何 Cookie 都會自動轉換為 PHP/FI 變數,就像 GET 和 POST 方法資料一樣。
如果您希望為單一 Cookie 指定多個值,只需在 Cookie 名稱中加入 [] 即可。例如
SetCookie("MyCookie[]","Rasmus Lerdorf", time()+3600);請注意,除非路徑或網域不同,否則 Cookie 會在您的瀏覽器中取代先前同名的 Cookie。因此,對於購物車應用程式,您可能需要保留一個計數器並將其傳遞。例如:
$Count++; SetCookie("Count",$Count, time()+3600); SetCookie("Cart[$Count]",$item, time()+3600);
mSQL 代表 mini-SQL,是由 David Hughes 撰寫的小型簡單 SQL 資料庫引擎。可從 ftp://ftp.bond.edu.au/pub/Minerva/msql 取得。
PHP/FI 支援一系列豐富的 mSQL 支援函數
除了這些函數之外,還可以編譯 PHP/FI 以自動跳脫在 GET 或 POST 資料中找到的任何單引號 (') 字元。如果在 php.h 檔案中定義了 MAGIC_QUOTES 變數,則這些引號將會自動跳脫,使其更容易將表單資料直接傳遞給 msql 查詢。
Postgres95/PostgreSQL 是一個功能強大的公共網域資料庫,它實作了 SQL 語言的重要子集。它支援許多 mSQL 中不可用的資料類型和命令。有關 Postgres 和軟體本身的更多資訊,請參閱此 URL:http://www.postgreSQL.org/。
以下 PHP 函數可用於 Postgres95
注意:不支援二進位游標。
除了這些函數之外,還可以編譯 PHP/FI 以自動跳脫在 GET 或 POST 資料中找到的任何單引號 (') 和雙引號 (") 字元。如果在 php.h 檔案中定義了 MAGIC_QUOTES 變數,則這些引號將會自動跳脫,使其更容易將表單資料直接傳遞給 Postgres 查詢。
以下是一個範例腳本,該腳本連線到 localhost 上名為「mydb」的 Postgres 資料庫,並檢索表格中人員的姓名和年齡
<? $conn = pg_Connect("localhost", "5432", "", "", "mydb"); if (!$conn) { echo "An error occured.\n"; exit; } $result = pg_Exec($conn, "select * from table1"); if (!$result) { echo "An error occured.\n"; exit; } $num = pg_NumRows($result); $i = 0; while ($i < $num) { echo "name: "; echo pg_Result($result, $i, "name"); echo " age: "; echo pg_Result($result, $i, "age"); echo "<BR>"; $i++; } pg_FreeResult($result); pg_Close($conn); >
mysql 是 mSQL 套件的複製品。您可以從 http://www.tcx.se/ 取得副本。
PHP/FI 支援一系列豐富的 mysql 支援函數
除了這些函數之外,還可以編譯 PHP/FI 以自動跳脫在 GET 或 POST 資料中找到的任何單引號 (') 字元。如果在 php.h 檔案中定義了 MAGIC_QUOTES 變數,則這些引號將會自動跳脫,使其更容易將表單資料直接傳遞給 mysql 查詢。
Solid 伺服器是一個高容量 SQL 伺服器。它支援 ANSI SQL2、ODBC、SAG CLI 和 X/Open SQL 標準。有關 Solid 伺服器的更多資訊,請參閱 www.solidtech.com。PHP 的 Solid 介面由 DigiFace Internet Services 開發。
以下 PHP 函數可用於 Solid Server
除了這些函數之外,還可以編譯 PHP/FI 以自動跳脫在 GET 或 POST 資料中找到的任何單引號 (') 字元。如果在 php.h 檔案中定義了 MAGIC_QUOTES 變數,則這些引號將會自動跳脫,使其更容易將表單資料直接傳遞給 Solid 查詢。
以下是在 Postgres 章節中顯示的相同腳本,已調整為 Solid 伺服器。
<? $conn = Solid_Connect("", "username", "password"); if (!$conn) { echo "An error occured.\n"; exit; } $result = Solid_Exec($conn, "select * from table1"); if (!$result) { echo "An error occured.\n"; exit; } while (Solid_FetchRow($result)) { echo "name: "; echo Solid_Result($result, "name"); echo " age: "; echo Solid_Result($result, "age"); echo "<BR>"; } Solid_FreeResult($result); Solid_Close($conn); >
以下 PHP/FI 函數可用於 Sybase。
如需完整範例,請參閱 sybSQL_Result() 函數之後的範例。
以下 PHP/FI 函數可用於 Oracle
一個範例 PHP/FI Oracle 應用程式
<? PutEnv("ORACLE_HOME=path_to_your_oracle_home" PutEnv("ORACLE_SID=database" /* Establish a connection between PHP and Oracle. */ $conn = Ora_Logon("username" "password" if ($conn < 0) { echo("Could not connect to Oracle.\n" exit; } /* Open a cursor in Oracle. */ $cursor = Ora_Open($conn); if ($cursor < 0) { echo("Could not open a cursor.\n" Ora_Logoff($conn); exit; } /* Turn off autocommit. */ Ora_CommitOff($conn); /* This is the SQL query. */ $query = "SELECT * FROM some_table" if (Ora_Parse($cursor, $query) < 0) { echo("Parse failed!\n" Ora_Logoff($conn); exit; } /* Execute the SQL statement associated with $cursor and prepare storage for select-list items. */ $ncols = Ora_Exec($cursor); echo "lt;P>\n" echo "lt;TABLE BORDER=1 CELLSPACING=0>\n" /* Retrieve all rows from the database one after another. */ while (Ora_Fetch($cursor) == 1) { $i = 0; echo "lt;TR>\n" while ($i < $ncols) { /* Get data for a single column of currently fetched row. */ $col = Ora_GetColumn($cursor, $i); echo("lt;TD>$col</TD>\n" $i++; } echo("lt;/TR>\n" } echo "</TABLE>\n"; /* Close the Oracle connection. */ Ora_Close($cursor); /* Disconnect the logon data area. */ Ora_Logoff($conn); >
Illustra 是 Informix 銷售的商業資料庫。它有一些此介面(尚未)完全支援的功能。Illustra 的主要優勢在於它是一個物件關聯式資料庫,能夠以物件導向的方式擴充。例如,可以在資料庫中將影像設為基本類型。有關更多資訊,請參閱 Illustra 首頁。
以下 PHP 函數可用於 Illustra
注意:目前不支援類型運算。
以下是一個範例腳本,該腳本連線到 localhost 上名為「mydb」的 illustra 資料庫,並檢索表格中人員的姓名和年齡
<? $conn = mi_Connect("mydb", "username", "password"); if ($conn<0) { echo "An error occured on connection.\n"; exit; } $result = mi_Exec($conn, "select * from table1"); if ($result < 0) { echo "An error occured.\n"; exit; } $num = mi_NumRows($result); $i = 0; while ($i < $num) { echo "name: "; echo mi_Result($result, $i, "name"); echo " age: "; echo mi_Result($result, $i, "age"); echo "<BR>"; $i++; } mi_Close($conn); >
Adabas D 是一個在許多平台上提供的高階 RDBMS。Linux 和 Win32 上提供了一個特殊版本,稱為 Personal Edition,不收取任何費用。它限制為 5 個同時使用者和 100 MB 的資料。有關 Adabas D 的更多資訊,請參閱 http://www.softwareag.com。
以下 PHP 函數可用於存取 Adabas 資料庫
<? $conn = Ada_Connect("node:db", "username", "password"); if (!$conn) { echo "An error occured.\n"; exit; } $result = Ada_Exec($conn, "select * from table1"); if (!$result) { echo "An error occured.\n"; exit; } while (Ada_FetchRow($result)) { echo "name: "; echo Ada_Result($result, "name"); echo " age: "; echo Ada_Result($result, "age"); echo "<BR>"; } Ada_FreeResult($result); Ada_Close($conn); >
在 PHP/FI 中,正規表示式用於複雜的字串操作。正規表示式支援的腳本介面透過以下函數:EReg()、ERegi()、EReg_Replace()、ERegi_Replace()、Reg_Match()、Reg_Replace() 和 Reg_Search()。所有三個函數的第一個參數都是正規表示式字串。EReg 函數使用 POSIX 1003.2 定義的 Posix Extended 正規表示式,而 Reg 函數則實作基本正規表示式。如需正規表示式的完整說明,請參閱您的 regex(7) man 頁面。如果您沒有此頁面,則可以在 PHP/FI 發行版的 src/regex 目錄中找到 Henry Spencer 撰寫的 regex(7) man 頁面。請要求您的系統管理員為您安裝此 man 頁面。
正規表示式及其作用的一些範例
ereg("abc",$string);
- 如果在 $string 的任何位置找到 "abc",則傳回 true。
ereg("^abc",$string);
- 如果 "abc" 在 $string 的開頭找到,則傳回 true。
ereg("abc$",$string);
- 如果 "abc" 在 $string 的結尾找到,則傳回 true。
eregi("(ozilla.[23]|MSIE.3)",$HTTP_USER_AGENT);
- 如果用戶端瀏覽器是 Netscape 2、3 或 MSIE 3,則傳回 true。
ereg("([[:alnum:]]+) ([[:alnum:]]+) ([[:alnum:]]+)",$string,$regs);
- 將三個以空格分隔的單字放入 $regs[1]、$regs[2] 和 $regs[3]。
ereg_replace("^","<BR>",$string)
- 在 $string 的開頭放入 <BR> 標籤。
ereg_replace("$","<BR>",$string)
- 在 $string 的結尾放入 <BR> 標籤。
ereg_replace(10,"",$string);
- 移除 $string 中的所有換行符號。
ereg_replace(13,"<BR>",$string);
- 將 $string 中的所有歸位字元取代為 <BR> 標籤。
在使用引號字串引數的大部分位置,都支援以下跳脫序列
\a --> bell \b --> backspace \n --> linefeed \r --> carriage return \t --> tab \nnn --> octal char \xXX --> hex char
PHP/FI 腳本語言中的幾個函數會使用八進位引數來表示 Unix 樣式的權限參數。在此八進位表示法中,使用 3 個位元來表示 0-7 的值。這三個位元的每個位元都代表一個特定的權限。傳統上,八進位在某些情況下會以開頭 0 表示,例如 0755。您不需要在 PHP 中使用此開頭的 0,因為期望八進位參數的函數只會假設該參數是八進位的。不過,使用開頭的 0 是好的做法,提醒自己不再處理十進位值。
位元說明
xxx ^^^ ||+----1 bit (execute permission) |+-----2 bit (write permission) +------4 bit (read permission)這三個位元會為擁有者、群組和全域重複三次。因此,0755 表示
owner: r,w,x group: r, ,x world: r, ,x請注意,目錄上的執行位元表示「存取」,而非「執行」。第四個八進位半位元組中也有擴充位元,例如 0?755
4: suid bit (set userid) 2: sgid bit (set group id) 1: sticky bit (on a directory, only the owner can delete a file)
PHP 指令碼語言在語法上與 C 語言有許多相似之處。它支援變數、陣列、函式呼叫、不同的變數類型,以及撰寫複雜 CGI 程式時可能需要的大部分功能。
每個 PHP/FI 函式都在以下章節中描述,並且可以透過簡單地將 #function_name 附加到此文件的 URL 來快速找到,因為每個函式描述都已使用其名稱進行標記。
每個 PHP 指令都以 <? 開頭,並以 > 結尾。或者,指令可以分組在單個 <? > 對中,並以 ; 字元分隔。
支援變數,並透過在變數名稱前面加上 $ 來表示。因此,例如,要將變數設定為 5,然後顯示此變數,以下是有效的
<?$a = 5> <?echo $a>
這與撰寫以下內容相同
<? $a = 5; echo $a >
甚至
<? $a = 5; echo $a; >
額外的空白字元(例如空格、製表符和換行符)會被忽略。應使用此事實來格式化 PHP 指令碼區塊,使其更易於閱讀。變數名稱區分大小寫,但函式呼叫不區分大小寫。在本文件後面的函式概述中,大小寫僅用於使函式名稱更易於閱讀。在實際的指令碼語言中,您可以使用任何您希望的大小寫。
支援註解。註解的寫法與 C 語言中的註解相同。 /* 開始一個註解,而 */ 結束一個註解。註解可以放置在 <? ... > 區塊內的任何位置。
支援三種類型的變數。長整數、雙精度浮點數和字元字串。它們會自動偵測。例如
<?$a = 5>
會使 $a 變成 INTEGER 類型的變數。
<?$a = 5.0>
會使 $a 變成 DOUBLE 類型的變數。
<?$a = "5">
會使 $a 變成 STRING 類型的變數。
變數的類型通常並不重要。每個變數無論其類型如何,都會在內部轉換為所有三種類型,並且各種函式會嘗試使用正確的類型。只有少數函式會受到變數類型影響。
所有三種類型的變數也可以透過在其名稱後面附加 [value] 來視為陣列。與 C 不同,這些實際上是與 Perl 中使用的類似的關聯陣列。以下將是有效的
<? $a[0] = 5; $a["hello"] = 6; echo $a[0]; echo $a["hello"]; >
請注意,如果變數同時用作陣列和普通變數,則普通變數與陣列中的索引 "0" 條目同義。即。
$a = 1;
與撰寫以下內容相同
$a[0] = 1;
PHP/FI 也支援非索引陣列。非索引陣列會在將項目新增到其中時產生自己的索引。例如
$a[] = "Hello"; $a[] = "There";
插入非索引陣列的第一個項目始終被指定索引 0,第二個索引 1,依此類推。因此,可以使用以下方式列印出以上項目
echo $a[0]; echo $a[1];
陣列可以透過簡單的賦值來複製。如果 $b 是一個陣列,則所有值都可以使用以下方式複製到名為 $a 的新陣列中
$a = $b;
請注意,如果 PHP 沒有強制您在使用變數之前定義變數。如果在上面的語句中,$b 未定義,則 $a 將設定為空字串 ("")。
[] 符號也用於表示要附加陣列。如果 $a 和 $b 都是陣列,則可以使用以下方式將 $b 附加到 $a
$a[] = $b;
在上面,關聯陣列和普通編號陣列之間會有差異。編號陣列將重新編號,以便 $b 中的所有元素都位於 $a 中的原始元素之後。而對於關聯陣列,$b 中的元素將與 $a 中的元素合併。已經存在於 $a 中的任何元素(具有相同索引名稱的項目)都將被 $b 元素覆蓋。
您可以使用 count() 函式來確定任何陣列中的項目數。
語言固有的另一個事實是,變數的類型決定了某些基本運算的執行方式。例如
$a = $b + $c;
可以執行幾種不同的操作。如果 $b 是一個數字,則 $c 的數值會加到 $b 中,並且總和會儲存在 $a 中。在這種情況下,$c 的類型無關緊要。該操作由第一個變數的類型決定。如果 $b 是一個字串,則 $c 的字串值會附加到 $b,並且產生的字串會放入 $a 中。這也會導致一些注意事項。您應該閱讀有關 多載運算子 的章節,以更好地了解如何處理它們。
上一節介紹了關聯陣列。關聯陣列是一種索引不必是數值連續值的陣列。陣列索引可以是任何數字或字串。PHP/FI 提供了一組函式來操作這些關聯陣列。這些包括 Next()、Prev()、Reset()、End() 和 Key()。
有時能夠擁有可變的變數名稱會很方便。也就是說,可以動態設定和使用的變數名稱。可以使用如下語句設定普通變數
$a = "hello";
可變變數採用變數的值,並將其視為變數的名稱。在上面的範例中,可以使用兩個錢號將 hello 用作變數的名稱。即。
$$a = "world";
此時,已在 PHP/FI 符號樹中定義和儲存了兩個變數
Variable Name Variable Content a hello hello world
因此,此語句
echo "$a $$a";
產生與以下內容完全相同的輸出
echo "$a $hello";
即,它們都產生:hello world
就語言結構而言,PHP 語言非常簡單。以下命令用於引導控制流遍歷檔案
條件的語法與 C 語言的語法類似。 == 測試是否相等。 != 表示不相等。還支援:>、<、>=、<=。條件 AND 是 &&,條件 OR 是 ||。
範例
<? if($a==5 && $b!=0 ); $c = 100 + $a / $b; endif; >
以上也可以用標準 C 語法撰寫
在這種情況下,右大括號後不需要分號。
<? if($a==5 && $b!=0) { $c = 100 + $a / $b; } >
兩種語法之間沒有區別。我個人喜歡使用 endif、endswitch 和 endwhile,以便我明確知道我正在結束哪個結構。但是,這些結尾結構始終可以用右大括號代替。
重要的是要注意,語言的流程不取決於程式碼中指令碼區塊的組織方式。您可以在一個區塊中啟動 if 表達式,並在另一個區塊中結束表達式。例如
<?if($a==5 && $b!=0)> <b>Normal html text</b> <?endif>
在此範例中,很容易看出為什麼有時更希望使用 endif
關鍵字而不是右大括號。以上比以下內容更具可讀性
<?if($a==5 && $b!=0) {> <b>Normal html text</b> <? } >
兩個版本都是有效的,它們會執行完全相同的操作。
您可以使用以下語法在 PHP 指令碼中定義函式
<? Function Test ( echo "This is a test\n"; ); >
現在可以在指令碼中的任何位置呼叫此函式,只要呼叫發生在函式定義之後即可。範例呼叫可能如下
<? Test(); >
這樣的使用者定義函式的作用與 PHP 的內部函式完全相同,您可以將引數傳遞給它們,並讓它們傳回一個值。以下是函式定義的語法,該函式接受 3 個引數並傳回這些引數的和
<? Function Sum $a,$b,$c ( return($a+$b+$c); ); echo Sum($a,$b,$c); >
return 語句用於從函式傳回一個值。使用此機制只能傳回單個值,但是,如果需要在主要程式碼和函式之間傳遞更多值,則可以使用全域變數。這將我們帶到有關變數範圍的章節。
變數的範圍是定義它的上下文。在大多數情況下,所有 PHP/FI 變數只有單個範圍。但是,在使用者定義的函式中,會引入局部函式範圍。函式內使用的任何變數預設都限制為局部函式範圍。例如
$a=1; /* global scope */ Function Test ( echo $a; /* reference to local scope variable */ ); Test();
此指令碼不會產生任何輸出,因為 echo 語句引用的是 $a 變數的局部版本,並且尚未在此範圍內為其賦值。您可能會注意到,這與 C 語言有點不同,因為 C 語言中的全域變數會自動提供給函式使用,除非被局部定義明確覆蓋。這可能會導致一些問題,因為人們可能會無意間變更全域變數。在 PHP/FI 中,如果要將全域變數用於函式中,則必須在函式內部宣告它們為全域變數。範例
$a=1; $b=2; Function Sum $first,$second ( global $a,$b; $b = $a + $b; ); Sum(); echo $b;
上面的指令碼會輸出 "3"。透過在函式內將 $a 和 $b 宣告為全域變數,對任一變數的所有引用都將引用全域版本。函式可以操作的全域變數數量沒有限制。但是,變數必須在呼叫函式之前存在於全域範圍中。您無法從函式內建立新的全域變數。
變數範圍的另一個重要功能是 static 變數。靜態變數僅存在於局部函式範圍中,但是當程式執行離開此範圍時,它不會遺失其值。考慮以下範例
Function Test ( $a=0; echo $a; $a++; );
此函式完全沒用,因為每次呼叫它時,它都會將 $a 設定為 0 並列印 "0" 。遞增變數的 $a++ 沒有任何作用,因為一旦函式退出,$a 變數就會消失。若要建立一個有用的計數函式,該函式不會遺失目前的計數,則將 $a 變數宣告為靜態
Function Test ( static $a=0; echo $a; $a++; );
現在,每次呼叫 Test() 函式時,它都會列印 $a 的值並將其遞增。
當遞迴呼叫函式時,靜態變數也至關重要。遞迴函式是呼叫自身的函式。在撰寫遞迴函式時必須小心,因為可能會使其無限遞迴。您必須確保有足夠的方法終止遞迴。以下簡單函式以遞迴方式計數到 10
Function Test ( static $count=0; $count++; echo $count; if($count < 10) { Test(); } );
PHP 支援在預期表達式的任何位置進行完整的數學運算。會考慮運算順序。以下是有效的運算子
<? $a = 2 + 1 > Addition <? $a = 2 - 1 > Subtraction <? $a = 2 * 1 > Multiplication <? $a = 2 / 1 > Division <? $a = 2 % 1 > Modulus <? $a = 2 ^ 1 > Bit-wise Exclusive OR
同時支援括號和運算順序,因此以下是有效的
<?$a = (2+1)*3+6/3>
支援類似 C 的遞增運算子 +=
和 -=
。即。
<? $a += $b>
這等同於
<? $a = $a + $b>
支援類似 C 的位元運算子 &=
、|=
和 ^=
。即。
<? $a &= 4>這等同於
<? $a = $a & 4>
您可以使用 while(); endwhile; 結構在 PHP 指令碼中循環。
<? $a=0; while($a<100) { $a++; echo $list[$a]; } >
上面的範例顯示了如何使用 while 迴圈來顯示陣列的內容。警告,儘管 PHP 語言支援遞增運算子(例如 ++ 和 -<!>-)來遞增和遞減變數,但它們的處理方式與 C 語言中的處理方式並不完全相同。變數會立即遞增。沒有像 C 語言中那樣在運算之前或之後遞增變數的概念。
如上面的 語言結構 章節中所述,也可以使用 while(); endwhile; 實現相同的效果。
PHP 支援與 C 對應版本非常相似的 switch 結構。
<? $a=0; switch($a) { case 1; echo "a is 1"; break; case "hello"; echo "a is hello"; break; default; echo "a is unknown"; break; } >
以上是一個 switch 結構的範例。它類似於一連串的 if/elseif/else 結構,但更容易閱讀。PHP 的 switch 結構與 C 語言的唯一區別在於,每一行都使用分號來終止,而不是冒號。
如上述語言結構章節所述,相同的效果也可以使用 switch(); endswitch; 來達成。
所有這些結構當然都可以像 C 語言一樣互相巢狀使用。PHP 發行版的 examples 目錄中的各種檔案應該是學習該語言的一個很好的起點。
先前的章節討論了 GET 和 POST 方法的資料和變數。仔細想想,您可能會意識到一個安全問題。例如,如果在網頁上我從資料庫取得了一些資料,並將這些資料透過 POST 方法表單,以名為「data」的變數傳遞出去。在後續的頁面中,我可以存取這個變數並對其進行處理。但是,如果有人直接存取第二個頁面,並在 URL 中輸入「?data=something」,從而進行 GET 方法的變數設定,他們實際上就繞過了原本的 POST 方法表單。
PHP 提供了一個 SecureVar() 函數,用於將變數名稱標記為安全變數。這些安全變數只能直接在 PHP 腳本中設定,或者來自 POST 方法表單。它們無法使用 GET 方法的變數定義機制來設定。從我們上述的情況來看,如果我們在第二個頁面的開頭放置以下程式碼:
<?SecureVar("data")>
那麼 GET 方法的技巧將不起作用。「data」變數將顯示為空,除非它是直接來自第一個頁面上的 POST 方法表單。
SecureVar() 實際上會將正規表示式作為其引數,因此您可以標記應以這種安全方式處理的變數名稱模式。例如:
<?SecureVar(".*data.*")>
這會將任何名稱中包含「data」的變數標記為安全。
請注意,POST 方法表單本身並非本質上安全。人們可以透過簡單地 telnet 到您系統上的 HTTP 連接埠來模擬向表單發送任何資料。如果安全確實是一個問題,您需要採取適當的安全措施來阻止人們這樣做。
問題在於 PHP 理解 3 種變數類型:整數(Integer)、浮點數(Double)和字串(String)。當變數第一次被賦值時,PHP 會自動判斷變數類型。
例如:
$a = 1; Type would be integer $b = 1.5; Type would be double $c = "1"; Type would be string
現在,當您執行以下操作時會發生什麼:
$d = $a + $c;
解析器會查看算術表示式的第一部分,並使用它來決定結果的類型,進而決定要執行的算術類型。在上述情況下,由於 $a 是一個整數,$d 將會是一個整數,並執行整數加法,得到結果:
$d = 2 Type is integer
因此:
$d = $c + $a
會產生:
$d = "11" Type is string
以上對我來說是合理的,一旦您理解它,它可能是可行的。但是,當使用更複雜的表示式時,它可能會變得非常混亂。
解決方案是一個簡單的類型轉換機制。實際上,所有變數都會自動轉換為所有 3 種類型,並且內部標誌只會標記變數的實際類型。因此,當我說:
$a = 1;
在符號表中,我會內部儲存 3 個版本:
Integer: 1 <-- flag Double : 1.0 String : "1"
SetType() 函數可以移動此標誌,指示變數的類型。
SetType($a,"double");
這將強制 $a 從此以後被視為浮點數。
GetType() 函數會返回類型。在此例中,GetType($a)
會返回 "double"。
還存在一些函數可以返回 3 種不同的類型,而不會移動類型標誌。
IntVal($a) returns 1 DoubleVal($a) returns 1.0 StrVal($a) returns "1"
這不會改變 PHP 變數的超載運算子性質,但它確實為您提供了一些工具來更好地處理它們。PHP 不是一個完全成熟的 Perl 複製品。它必須小巧且快速。Perl 透過強制像 '+' 運算子僅適用於數字來處理超載運算子的陷阱。如果您想新增字串,則必須使用 '.' 運算子。一旦您開始為每個類型使用單獨的運算子,您就會開始使語言變得更加複雜。例如,您不能對字串使用 '==',您現在必須使用 'eq'。我認為沒有意義,尤其對於像 PHP 這樣,大多數腳本會相當簡單,並且在大多數情況下是由非程式設計師編寫,他們想要一種具有基本邏輯語法且學習曲線不會太高的語言。
在某些情況下,可能需要忽略特定 PHP 函數報告的嚴重錯誤。例如,您可能希望忽略 dbmopen() 呼叫產生的錯誤,而僅檢查呼叫的返回值,而不希望錯誤訊息顯示在網頁螢幕上。這可以透過在函數呼叫前面加上 "@" 字元來完成。例如:
$err_code = @dbmopen($filename,"w");
可以透過查看 PHP 內部變數 $phperrmsg 來檢查實際會列印的錯誤訊息。
抑制錯誤訊息列印的更一般方法是使用 SetErrorReporting() 函數。使用此函數,可以透過在程式碼區塊之前呼叫類似於以下內容的方式,為整個程式碼區塊停用錯誤列印:
SetErrorReporting(0);
這會關閉所有錯誤。稍後可以使用以下內容重新啟用它們:
SetErrorReporting(1);
PHP 有許多內建函數。函數的呼叫方式與在 C 語言中呼叫的方式相同。有些函數會接受一個或多個引數,有些函數會傳回值,然後可以將其指定給變數或用作另一個函數的引數。例如:
<?$t=time()>
這會將 time() 函數的傳回值指定給 t 變數。
Abs 會傳回 arg 的絕對值。
Ada_Close 將會關閉與給定的連線識別碼相關聯的 Adabas 伺服器連線。
只有在 PHP 中啟用 Adabas 支援時,才能使用此函數。
Ada_Connect 會開啟與 Adabas 伺服器的連線。每個引數都應該是引號括住的字串。第一個參數(資料來源名稱)是 "servername:databasename" 形式的字串。如果您想存取本機資料庫,則可以省略伺服器名稱(但不包括冒號)。此函數會傳回 connection_id。其他 Adabas 函數需要此識別碼。您可以同時開啟多個連線。此函數在發生錯誤時會傳回 0。
只有在 PHP 中啟用 Adabas 支援時,才能使用此函數。
Ada_Exec 會將 SQL 陳述式傳送至由 connection_id 指定的 Adabas 伺服器。connection_id 必須是由 Ada_Connect 傳回的有效識別碼,或是特殊值 0。如果 connection_id 為 0,ada_exec 會嘗試使用 組態指令 phpAdaDefDB、phpAdaUser 和 phpAdaPW 所給定的參數建立或使用連線。
此函數的傳回值是一個識別碼,供其他 Adabas 函數存取結果時使用。此函數在發生錯誤時會傳回 0。當命令正確執行但預期不會傳回資料時(例如,insert 或 update 命令),它會傳回 1。請注意,即使選擇傳回沒有資料,仍會傳回大於 1 的有效結果。
只有在 PHP 中啟用 Adabas 支援時,才能使用此函數。
Ada_FetchRow 會提取 Ada_Exec 傳回的資料的一列。在呼叫 Ada_FetchRow 後,可以使用 Ada_Result 存取該列的欄位。如果未提供 rownumber,Ada_FetchRow 會嘗試提取結果集中下一列。每次呼叫 Ada_FetchRow 時,都可以透過 Ada_Result 存取新的一列。如果 Ada_FetchRow 成功(有列存在),則會傳回 1,如果沒有更多列,Ada_FetchRow 會傳回 0。Ada_FetchRow 的傳回值可以用作 while 迴圈的條件。可以混合使用有和沒有 rownumber 的 Ada_FetchRow() 呼叫。若要多次逐步查看結果,您可以呼叫帶有 rownumber 1 的 Ada_FetchRow(),然後繼續使用沒有 rownumber 的 Ada_FetchRow() 來檢視結果。
只有在 PHP 中啟用 Adabas 支援時,才能使用此函數。
Ada_FieldName 會傳回給定 Adabas 結果識別碼中,位於給定欄號的欄位名稱。欄位編號從 0 開始。
只有在 PHP 中啟用 Adabas 支援時,才能使用此函數。
Ada_FieldNum 會傳回給定 Adabas 結果識別碼中,與指定欄位名稱對應的欄位位置編號。欄位編號從 0 開始。此函數在發生錯誤時會傳回 -1。
只有在 PHP 中啟用 Adabas 支援時,才能使用此函數。
Ada_FieldType 會傳回給定 Adabas 結果識別碼中,依名稱或數字參照的欄位的 SQL 類型。注意:欄位編號從 0 開始。
只有在 PHP 中啟用 Adabas 支援時,才能使用此函數。
只有在您擔心腳本執行時使用太多記憶體時,才需要呼叫 Ada_FreeResult。當腳本完成時,所有結果記憶體都會自動釋放。但是,如果您確定腳本中不再需要結果資料,您可以呼叫帶有結果識別碼作為引數的 Ada_FreeResult,並且會釋放相關的結果記憶體。
只有在 PHP 中啟用 Adabas 支援時,才能使用此函數。
Ada_NumFields 會傳回 Adabas 結果中的欄位(列)數。引數是由 Ada_Exec 傳回的有效結果識別碼。此函數在發生錯誤時會傳回 -1。
只有在 PHP 中啟用 Adabas 支援時,才能使用此函數。
Ada_NumRows 會傳回 Adabas 結果中的列數。引數是由 Ada_Exec 傳回的有效結果識別碼。此函數在發生錯誤時會傳回 -1。對於 INSERT、UPDATE、DELETE 陳述式,Ada_NumRows() 會傳回受影響的列數。對於 SELECT 子句,這是可用的列數。
只有在 PHP 中啟用 Adabas 支援時,才能使用此函數。
Ada_Result 會從 Ada_Exec 產生的結果識別碼傳回值。欄位名稱指定要傳回列中的哪個儲存格。您可以使用未加引號的數字作為欄位索引,而不是命名欄位。欄位索引從 0 開始。如果要求的欄位是 BYTE(二進位)程式碼類型,或長度超過 4096 個位元組,則會將內容直接傳送至用戶端。提示:可以使用 HEX() 資料庫函數將 [VAR]CHAR BYTE 欄位傳回到 php 變數中;例如:SELECT HEX(SYSKEY) SYSKEY FROM MYTABLE。
只有在 PHP 中啟用 Adabas 支援時,才能使用此函數。
Ada_ResultAll 會列印 Ada_Exec 產生的結果識別碼中的所有列。結果會以 HTML 表格格式列印。使用選用的格式字串可以完成其他表格整體格式設定(例如,bgcolor= 將設定背景顏色,>caption> </caption 將設定標題)。注意:「format」的內容將會像這樣插入 HTML table 標籤 <table format >...
只有在 PHP 中啟用 Adabas 支援時,才能使用此函數。
使用反斜線跳脫任何 $ \ 或 ' (如果設定了 MAGIC_QUOTES)。另請參閱 StripSlashes()。
Sort 用於以遞增順序對 PHP 關聯陣列排序。使用 ARSort() 以遞減順序排序。與 Sort() 函數不同,ASort() 會保留索引-值配對。它理解三種變數類型,如果陣列包含字串,則會按字母順序排序,如果陣列包含數字,則會按數字排序。如果陣列包含混合類型,則陣列中的第一個類型會指定排序方法。請注意,如果您要排序非關聯陣列,則應使用 Sort() 函數。
BinDec 函式會回傳以 binary_string 引數表示的二進位數字的十進位等值。可以轉換的最大數字為 31 位元長,或十進位的 4294967295。另請參閱 DecBin() 函式。
Ceil() 將浮點數值四捨五入到下一個整數。傳回值為 double (浮點數) 型別,以便可以在複雜的方程式中正確使用。若要取回整數型別,請使用:$new = IntVal(Ceil($value));
另請參閱 Floor()。
ChDir 會將目前的工作目錄變更為引數中指定的目錄。
ChGrp 會變更指定檔案的群組 ID。
ChMod 會變更指定檔案的檔案權限。perms 參數必須以八進位符號指定。例如:ChMod($filename,0755)
ChOwn 會將指定檔案的所有權變更為指定的所有者。請注意,這只有在 PHP/FI 二進位檔以 root 身分執行時才會有效 (通常這不是一個好主意)。
Chop 會移除所有尾隨的空白字元,包括換行符號、跳格字元和空格,並傳回新的字串。
Chr 會傳回以整數引數表示的 ASCII 字元。
ClearStack() 函式是針對 PHP 剖析器中缺陷的臨時解決方案/變通方法。此缺陷是 PHP 只有一個單一的運算式堆疊。在使用者定義的函式內部時,此運算式堆疊永遠不會被清除,因為在呼叫使用者定義函式的內容中,複雜的運算式可能需要其內容。這表示如果您在使用者定義的函式內部有一個包含許多反覆運算的 while 迴圈,您可能會佔用大量的堆疊空間。您甚至可能會達到最大資料空間限制。您可以將 ClearStack() 的呼叫放在 while 迴圈內,以防止此記憶體消耗,但其權衡之處在於您無法在任何類型的內容中使用您的函式。也就是說,您必須將函式的輸出指派給臨時變數,然後在您需要的任何內容中使用此臨時變數。
在大多數作業系統上,stat() 系統呼叫通常是一個昂貴的操作。為了確保重複呼叫各種 File* 函式 (如 FilePerms()、FileInode() 等) 時,一律會快取上次 stat() 呼叫的結果。如果再次使用相同的引數呼叫其中一個 File* 函式,則會使用快取的 stat() 結果。為了強制新的 stat() 系統呼叫,可以呼叫此 ClearStatCache() 函式來清除快取的 stat() 結果。
closeDir 會關閉使用 openDir 函式開啟的目錄。
CloseLog() 會關閉 Syslog() 用於寫入系統記錄器的描述元。請參閱 closelog(3) UNIX 手冊頁以瞭解更多詳細資料。另請參閱 Syslog()、OpenLog() 和 InitSyslog()。
Count 會傳回陣列變數中的項目數。如果變數不是陣列,則傳回值為 1 (因為一般變數類似於只有一個項目的陣列)。如果未定義變數,則傳回值為 0。
Crypt 將使用標準 Unix DES 加密方法加密字串。引數是要加密的字串,以及可選的雙字元 salt 字串,以作為加密的基礎。請參閱 Unix 手冊頁以瞭解有關您的 crypt 函式的更多資訊。如果您的 Unix 系統上沒有 crypt 函式,您可以使用 Michael Glad 的公開網域 UFC-Crypt 套件,該套件是在丹麥開發的,因此只要您從非美國網站以 ftp 方式下載,就不受美國出口法律的限制。
Date 函式用於以各種方式顯示時間和日期。此函式會採用格式字串和時間作為引數。如果省略時間引數,則會使用目前的時間和日期。時間引數指定為自 1970 年 1 月 1 日 Unix Epoch 以來的秒數整數。格式字串用於指出應該顯示哪些日期/時間元件以及它們應該如何格式化。以下字元在格式字串中可被辨識。任何無法辨識的字元都會逐字列印
Y - 年份,例如 1995
y - 年份,例如 95
M - 月份,例如 Oct
m - 月份,例如 10
F - 月份,例如 October
D - 星期幾,例如 Fri
l - 星期幾,例如 Friday
d - 日期,例如 27
z - 一年中的第幾天,例如 299
H - 24 小時制的小時,例如 13
h - 12 小時制的小時,例如 1
i - 分鐘,例如 5
s - 秒數,例如 40
U - 自 Epoch 以來的秒數,例如 814807830
A - AM/PM
a - am/pm
另請參閱 MkTime() 函式。
dbList 會輸出有關編譯到 PHP 中的 db 支援的資訊。
dbmClose 只是關閉指定的 dbm 檔案。它也會解除鎖定任何鎖定檔,因此關閉已開啟的任何 dbm 檔案非常重要。
dbmDelete 會刪除由指定 key 引數指定的鍵/內容配對。
如果索引鍵存在,dbmExists 會傳回 1,否則傳回 0。
dbmFetch 會傳回與指定索引鍵相關聯的內容字串。
dbmFirstKey 會傳回 dbm 檔案中的第一個索引鍵。請注意,不保證任何特定順序,因為順序取決於在 dbm 實作中計算的雜湊表值。如果需要,您可以使用 Sort 函式來排序 dbm 檔案中的資料陣列。
dbmInsert 會將新的索引鍵/內容資料配對插入 dbm 檔案。如果索引鍵已存在,則插入將會失敗。
dbmNextKey 會傳回指定索引鍵之後的下一個索引鍵。透過呼叫 dbmfirstkey(),然後連續呼叫 dbmnextkey(),可以存取 dbm 檔案中的每個索引鍵/內容配對。
dbmOpen() 會開啟 dbm 檔案。第一個引數是要開啟的 dbm 檔案的完整路徑檔名,第二個是檔案開啟模式,其為 "r"、"n" 或 "w",分別表示讀取、新建 (表示寫入) 和寫入。如果使用 ndbm 支援,ndbm 實際上會建立 filename.dir 和 filename.pag 檔案。gdbm 只使用一個檔案,內部平面 ascii 檔案支援也是如此,而 Berkeley 的 libdb 會建立一個 filename.db 檔案。請注意,除了 dbm 程式庫本身可能進行的任何檔案鎖定之外,PHP 還會執行自己的檔案鎖定。PHP 不會刪除它建立的 .lck 檔案。它只是將這些檔案用作執行檔案鎖定的固定 inode。如需有關 dbm 檔案的更多資訊,請參閱您的 Unix 手冊頁,或從 ftp://prep.ai.mit.edu/pub/gnu 取得 GNU 的 gdbm。
dbmReplace 與 dbminsert() 函式類似,唯一的不同之處在於,如果索引鍵已存在,則舊的內容字串將會被新的取代。
DecBin 會傳回包含指定 number 引數的二進位表示法的字串。可以轉換的最大數字為 31 位元長,或十進位的 4294967295。另請參閱 BinDec() 函式。
DecHex 會將十進位數字轉換為十六進位字串。另請參閱 HexDec() 函式。
DecOct 會將十進位數字轉換為八進位數字。另請參閱 OctDec()。
doubleval 會傳回變數的 double (浮點數) 值。另請參閱 strval() 和 intval() 函式。
Echo 不是函式。也就是說,您不會將引數放在括號中。它用於顯示 PHP 函式或 PHP 變數的結果。請參閱 跳脫字元區段以瞭解支援的特殊字元清單。format_string 是可選的,如果不存在,則不會執行任何輸出格式化。格式字串類似於 C printf 函式的格式字串。請參閱 printf 的手冊頁以瞭解更多詳細資料。單一 echo 命令最多可以列印 5 個運算式。如果您嘗試列印更多,則會收到剖析器錯誤。請注意,運算式的型別無關。如果存在格式字串,則會將運算式自動轉換為格式字串指定的適當型別。如果您想要格式化某些內容並將格式化的字串指派給變數,而不是顯示它,請使用 sprintf() 函式。
支援下列轉換,
- %d %i
- 列印帶正負號的十進位數字。
- %o
- 列印八進位數字。
- %u
- 列印不帶正負號的十進位數字。
- %x %X
- 列印十六進位數字。
- %f
- 列印浮點數。
- %e %E
- 以科學符號列印浮點數。
- %g %G
- 視情況以科學符號或一般符號列印浮點數。
- %c
- 列印單一字元。
- %s
- 列印字元字串。
- %%
- 列印文字百分比符號。
接受下列旗標。
- '-'
- 在欄位寬度內向左對齊輸出。
- '+'
- 確保所有整數都帶正負號 (帶有正號/負號)。
- ' '
- 類似於 '+',但使用空格代替正號。
- '#'
- 在十六進位和八進位數字前面列印前綴,以將它們指定為此類。
- '''
- 將數字分隔成群組 (通常是以逗號分隔的三個群組)。
- '0'
- 以零填補欄位寬度。
所有這些旗標都取決於您的 C 函式庫的 printf 函式是否支援它們(例如,''' 是 GNU 擴充功能)。
大多數轉換都會接受欄位寬度和精確度,如 /examples 目錄中的
demo_echo.html
檔案所示。沒有必要指定任何類型修飾符,事實上,如果類型修飾符沒有意義(幾乎總是這種情況),PHP 會發出抱怨。PHP 會抱怨(並拒絕接受)它無法識別的任何內容。格式字串不需要的任何額外引數都會被忽略。
End 會將指定變數的內部陣列指標移動到陣列的最後一個項目,並傳回該項目的值。這對於以相反順序遍歷關聯陣列很有用。另請參閱 Reset() 和 Prev()。以下範例會以相反順序遍歷關聯陣列
<? Reset($array); $first_key = key($array); End($array); $k = key($array); while($k != $first_key); echo $array[$k]; prev($array); $k = key($array); endwhile; echo $array[$k]; >
如果引數字串中符合正規表示式,ereg 會傳回非零值。例如,條件 <?if (ereg("^This.*", "This is an example string")>
會為真,因為 "^This.*" 表示比對字串開頭的 This 這個字,然後比對之後的任何字元。如果存在 regs 引數,則會將比對到的暫存器填入 regs 引數所命名的陣列中的位置 0-10。暫存器 0 將始終包含完整比對到的字串。有關正規表示式的更多資訊,請參閱本文件的正規表示式章節。
eregi 與 ereg() 函式相同,唯一的區別在於,正規表示式的應用方式會忽略大小寫。
ereg_Replace 會掃描整個引數字串,並將字串中任何符合給定表示式的部分替換為替換字串。例如,在字串 "This is an example string"
中,我們可以很容易地使用以下命令將每個空格替換為破折號:ereg_replace(" ","-","This is an example string")。有關正規表示式的更多資訊,請參閱本文件的正規表示式章節。
eregi_replace 與 ereg_replace() 函式相同,唯一的區別在於,正規表示式的應用方式會忽略大小寫。
EscapeShellCmd 會跳脫字串中可能被用來欺騙 shell 命令執行任意命令的任何字元。這個函式應該用於確保來自使用者輸入的任何資料在傳遞給 Exec() 或 System() 函式之前被跳脫。一個標準的用法是
<?system(EscapeShellCmd($cmd))>
Eval 採用字串引數的內容,並將其視為一個小型的 PHP/FI 腳本。它會將其作為單獨的 PHP/FI 腳本執行。從 eval 內部設定或存取的任何變數都將來自腳本中 eval 陳述式的目前環境中的全域參考框架。變數替換會在字串引數上進行,因此如果要使用字串表示式中的變數,則應該跳脫這些變數。一些範例
$a = "echo phpversion();"; eval($a); eval("echo phpversion();"); eval("\$a=1; echo \$a;");
Exec 執行給定的 unix 命令,但是不會輸出任何內容。它只會傳回命令結果的最後一行。如果您需要執行一個命令,並讓所有來自命令的資料直接傳回,而沒有任何干擾,請使用 PassThru() 函式。如果存在陣列引數,則指定的陣列將從陣列結尾開始填入 unix 命令的每一行輸出。如果您的陣列已經包含元素,並且您想要從陣列元素 0 開始填入,請在呼叫之前 UnSet 該陣列。如果 return_var 引數與陣列引數一起存在,則執行 unix 命令的傳回狀態將會寫入此變數。請注意,如果您要允許將來自使用者輸入的資料傳遞給此 Exec 函式,則應該使用 EscapeShellCmd() 函式,以確保使用者無法欺騙系統執行任意命令。另請參閱 system() 函式。
Exit 命令用於在剖析到此標籤時立即終止剖析。
Exp 傳回 e 的 arg 次方。另請參閱 pow()
fclose() 會關閉由 fopen() 開啟的檔案。引數是由 fopen() 呼叫傳回的檔案指標索引。
如果檔案指標索引引數所引用的檔案已到達檔案結尾,Feof 會傳回 true。
fgets() 會從由 fopen() 開啟的檔案中讀取一行。引數是由 fopen() 傳回的檔案指標索引,以及要讀取的最大位元組數。當讀取到最大位元組數或遇到行尾時,讀取會結束。這與 C 的 fgets() 呼叫類似。另請參閱 fputs()。
與 fgets() 函式相同,唯一不同的是,它會在讀取檔案時嘗試去除任何 HTML 標籤或 PHP/FI 腳本標籤。
File 會讀取整個檔案,並傳回一個陣列,其中每個陣列元素都包含檔案中的一行,從陣列索引 0 開始。
fileAtime 會傳回上次資料存取的時間。如果檔案不存在,或者因為其他原因無法存取,則此函式會傳回 -1。如果需要重複呼叫 fileAtime 和其他 file* 函式,且正在存取的檔案可能會變更或消失,則應該在呼叫 file* 函式之前呼叫 ClearStatCache()。
fileCtime 會傳回上次狀態變更的時間。如果檔案不存在,或者因為其他原因無法存取,則此函式會傳回 -1。如果需要重複呼叫 fileCtime 和其他 file* 函式,且正在存取的檔案可能會變更或消失,則應該在呼叫 file* 函式之前呼叫 ClearStatCache()。
fileGroup 會傳回檔案擁有者的群組 ID。如果檔案不存在,或者因為其他原因無法存取,則此函式會傳回 -1。如果需要重複呼叫 fileGroup 和其他 file* 函式,且正在存取的檔案可能會變更或消失,則應該在呼叫 file* 函式之前呼叫 ClearStatCache()。
fileInode 會傳回檔案的 inode。如果檔案不存在,或者因為其他原因無法存取,則此函式會傳回 -1。如果需要重複呼叫 fileInode 和其他 file* 函式,且正在存取的檔案可能會變更或消失,則應該在呼叫 file* 函式之前呼叫 ClearStatCache()。
fileMtime 會傳回上次資料修改的時間。如果檔案不存在,或者因為其他原因無法存取,則此函式會傳回 -1。如果需要重複呼叫 fileMtime 和其他 file* 函式,且正在存取的檔案可能會變更或消失,則應該在呼叫 file* 函式之前呼叫 ClearStatCache()。
fileOwner 會傳回檔案擁有者的 uid。如果檔案不存在,或者因為其他原因無法存取,則此函式會傳回 -1。如果需要重複呼叫 fileOwner 和其他 file* 函式,且正在存取的檔案可能會變更或消失,則應該在呼叫 file* 函式之前呼叫 ClearStatCache()。
filePerms 會傳回檔案的權限位元。這是 Unix C stat 結構的 st_mode 欄位。如果檔案不存在,或者因為其他原因無法存取,則此函式會傳回 -1。如果需要重複呼叫 filePerms 和其他 file* 函式,且正在存取的檔案可能會變更或消失,則應該在呼叫 file* 函式之前呼叫 ClearStatCache()。
fileSize 會傳回檔案的大小(以位元組為單位)。如果檔案不存在,或者因為其他原因無法存取,則此函式會傳回 -1。如果需要重複呼叫 fileSize 和其他 file* 函式,且正在存取的檔案可能會變更或消失,則應該在呼叫 file* 函式之前呼叫 ClearStatCache()。
fileType 會傳回檔案的類型。傳回值為以下其中之一:「dir」、「file」、「fifo」、「char」、「block」或「link」。這些分別對應於目錄、一般檔案、先進先出特殊檔案、字元特殊檔案、區塊特殊檔案和符號連結。
Floor() 會將浮點值向下捨入到前一個整數。傳回值的類型為 double(浮點數),以便可以在複雜的方程式中正確使用。要取得整數類型,請使用:$new = IntVal(Floor($value));
另請參閱 Ceil()。
Flush() 函式用於清除輸出緩衝區。對於 Apache 模組,它會清除 Apache 的輸出緩衝區,對於 CGI 版本,它只會清除 stdout。當在 Apache 下以 CGI 執行時,伺服器會緩衝 CGI 腳本的輸出,因此此 Flush() 函式在那裡不會有太大幫助。如果您在 Apache Web 伺服器下執行 PHP 的 CGI 版本,請考慮以 nph- 腳本的形式執行您的腳本。或者,執行 PHP 的 Apache 模組版本。
fopen() 開啟檔案並傳回檔案指標索引。如果檔案無法開啟,則此函式會傳回 -1。它與 C 語言的 fopen() 呼叫類似。filename 引數是要開啟檔案的相對或絕對路徑,而 mode 引數是下列其中一個:"r"、"r+"、"w"、"w+"、"a"、"a+"。如需更多資訊,請參閱 Unix 中關於 fopen() 呼叫的手冊頁。另請參閱 popen() 函式的說明。也請參閱 fclose() 函式的說明。
範例
$fp = fopen("/home/rasmus/file.txt","r");
fputs() 將一行寫入由 fopen() 開啟的檔案中。引數是由 fopen() 傳回的檔案指標索引,以及要寫入的字串。請注意,string 引數可能包含特殊跳脫字元,\n、\r 和 \t 分別表示輸出換行符號、歸位字元和定位點。另請參閱 fgets()。
FPassThru() 直接輸出 fp 上所有剩餘的資料。它與 ReadFile() 不同之處在於它也可以處理用 fsockopen() 開啟的檔案。它與 PassThru() 不同之處在於它不處理指令,而是處理已開啟的檔案。FPassThru() 會傳回讀取和寫入的位元組數。
fseek() 定位由 $fd 引數識別的檔案指標,該引數是 fopen() 呼叫的傳回值。檔案指標定位在檔案開頭加上 pos 引數指定的偏移量處。另請參閱 ftell() 和 rewind()。
fsockopen() 開啟一個 socket 連線並傳回一個檔案指標索引。此檔案指標索引可由 fgets、fputs 和 fclose 使用。引數是主機名稱和連接埠號碼。傳回值如下:如果無法建立 socket 則為 -3,如果主機名稱的 DNS 查詢失敗則為 -4,如果連線被拒絕或逾時則為 -5,如果實際的 fdopen() 呼叫失敗則為 -6,如果 setvbuf() 呼叫失敗則為 -7。如果連接埠號碼為 0,則如果您的作業系統支援 Unix 網域 socket,則 hostname 引數將被視為 Unix 網域 socket 的檔名。
ftell() 會傳回由 fp 引數識別的檔案指標的位置,該引數是 fopen() 呼叫的傳回值。該位置稍後可以用作 fseek() 的引數。另請參閱 fseek() 和 rewind()。
getAccDir 會傳回 PHP 存取設定檔所在的目錄。存取設定檔的檔案名稱來自表示使用者存取設定檔的數值使用者 ID。
GetEnv 會傳回由 string 指定的環境變數的值。通常不會使用此函式,因為環境變數可以直接供 PHP/FI 使用。如果參考內部符號表中找不到的變數,則會自動搜尋環境空間。當需要確保環境變數未被正常的 PHP/FI 變數覆寫時,應使用 GetEnv。依賴 HTTP 伺服器定義變數(例如 REMOTE_ADDR 和 REMOTE_HOST)的安全機制應使用 GetEnv 載入這些變數,而不是直接將它們作為 $REMOTE_ADDR 引用,以避免有人製作假的表單並將資料張貼到您的伺服器,從而繞過您可能擁有的任何安全機制。
getHostByName 會將給定的網域名稱轉換為 nnn.nnn.nnn.nnn 格式的 IP 位址。
getHostByAddr 會將給定的 nnn.nnn.nnn.nnn 格式的 IP 位址轉換為完整網域名稱。
GetImageSize() 函式會接受完整路徑檔案名稱,或相對於呼叫指令碼位置的相對路徑。它會傳回包含寬度、高度和類型的 3 個元素陣列。寬度和高度以像素為單位,類型為 1 表示 GIF,2 表示 JPG 檔案,3 表示 PNG 檔案。不支援其他檔案類型。傳回陣列中的第四個元素是一個字串,其中包含 "width=x height=y",適合直接在 IMG 標籤中使用。請務必注意,使用此函式不需要 GD 影像程式庫。範例如下
<? $result = GetImageSize("img/flag.jpg"); > <IMG SRC="img/flag.jpg" ?echo $result[3]> >
getLastAccess 會傳回上次存取目前頁面的日期和時間,格式為 Unix 時間格式。此值可以傳遞給 Date() 函式進行格式化。
只有在 PHP 編譯時啟用存取記錄時,此函式才可用。
getLastBrowser 會傳回上次存取目前頁面的使用者所用瀏覽器的識別字串。
只有在 PHP 編譯時啟用存取記錄時,此函式才可用。
getLastEmail 會傳回上次存取目前頁面的使用者的電子郵件地址。
只有在 PHP 編譯時啟用存取記錄時,此函式才可用。
getLastHost 會傳回上次存取目前頁面的使用者的主機名稱。
只有在 PHP 編譯時啟用存取記錄時,此函式才可用。
getLastMod 會傳回上次修改目前頁面的日期和時間,格式為 Unix 時間格式。此值可以傳遞給 Date() 函式進行格式化。
只有在 PHP 編譯時啟用存取記錄時,此函式才可用。
getLastRef 會傳回上次存取目前頁面的使用者之參照文件的 URL。
只有在 PHP 編譯時啟用存取記錄時,此函式才可用。
getLogDir 會傳回 PHP 記錄檔所在的頂層目錄。實際記錄檔位於此目錄下的目錄中。每個子目錄是記錄檔所屬使用者的數值使用者 ID。然後在每個目錄中,會找到一系列 DBM 記錄檔,每個記錄檔的檔案名稱的主要組成部分都是它們所代表的檔案的數值 inode。
getMyInode 會傳回目前 HTML 檔案的數值 inode。
getMyPid() 會傳回 PHP 解析程序的目前程序 ID。
getMyUid 會傳回目前 HTML 檔案擁有者的數值使用者 ID。
getRandMax 會傳回 Rand 函式將傳回的最大亂數。如果傳回的值似乎不準確,請查看 PHP 發行版本中的 php.h 原始碼檔案以取得更多資訊。
getStartLogging 會傳回開始記錄目前頁面時的日期和時間,格式為 Unix 時間格式。當使用基於 mSQL 的記錄時,此值會更準確,因為時間戳記會保存在每個記錄檔中。對於 DBM 記錄,傳回的時間是建立使用者記錄目錄的時間。
getToday 會傳回自當地時間午夜 12 點以來,目前頁面被點擊的總次數。
只有在 PHP 編譯時啟用存取記錄時,此函式才可用。
getTotal 會傳回自頁面開始存取記錄以來,目前頁面被點擊的總次數。
只有在 PHP 編譯時啟用存取記錄時,此函式才可用。
GetType 會傳回變數的類型。傳回值是一個字串,它是 "integer"、"double" 或 "string" 其中之一。另請參閱 SetType() 函式
gmDate 與 Date 函式相同,不同之處在於它使用格林威治標準時間而不是目前的本地時間。
Header 命令在 HTML 檔案的頂部使用,用於傳送原始 HTTP 標頭字串。如需更多關於原始 HTTP 標頭的資訊,請參閱 HTTP 規格。請記住,Header() 命令必須在任何實際輸出(無論是透過正常的 HTML 標籤還是 PHP echo 命令傳送)之前使用。
用法範例可以在 HTTP 驗證章節中找到。
HexDec 會將十六進位字串轉換為十進位數字。另請參閱 DecHex() 函式。
HtmlSpecialChars 會將 string 引數中介於 160 和 255(含)之間的 ASCII 碼的任何字元轉換為其對應的 HTML 實體名稱。該函式會傳回轉換後的字串。<、>、& 和 " 也會被轉換。
ImageArc 會在由 im 表示的影像中繪製以 cx,cy 為中心的局部橢圓 (左上角為 0,0)。w 和 h 分別指定橢圓的寬度和高度,而起點和終點則以 s 和 e 引數表示的度數指定。
只有在 PHP 中啟用 GD 支援時,此函式才可用。
ImageChar 會在由 im 識別的影像中,以座標 x,y (左上角為 0,0) 和 col 顏色繪製字元 c。size 引數可以是 1、2、3、4 或 5,表示要使用的字型大小。1 是最小的,而 5 是最大的。
只有在 PHP 中啟用 GD 支援時,此函式才可用。
ImageCharUp 會在由 im 識別的影像中,以座標 x,y (左上角為 0,0) 和 col 顏色垂直繪製字元 c。size 引數可以是 1、2、3、4 或 5,表示要使用的字型大小。1 是最小的,而 5 是最大的。
只有在 PHP 中啟用 GD 支援時,此函式才可用。
ImageColorAllocate 會傳回一個顏色識別碼,表示由給定 RGB 元件組成的顏色。im 引數是來自 ImageCreate 函式的傳回值。必須呼叫 ImageColorAllocate 來建立要在由 im 表示的影像中使用的每種顏色。
只有在 PHP 中啟用 GD 支援時,此函式才可用。
ImageColorTransparent 會將 im 影像中的透明顏色設定為 col。im 是 ImageCreate 傳回的影像識別碼,而 col 是 ImageColorAllocate 傳回的顏色識別碼。只有在 PHP 中啟用 GD 支援時,此函式才可用。
ImageCopyResized 將一個影像的矩形部分複製到另一個影像。dst_im 是目標影像,src_im 是來源影像的識別碼。如果來源和目標的座標以及寬度和高度不同,將會對影像片段執行適當的拉伸或縮放。座標指的是左上角。此函式可用於在同一個影像內複製區域(如果 dst_im 與 src_im 相同),但如果區域重疊,則結果將無法預測。
只有在 PHP 中啟用 GD 支援時,此函式才可用。
ImageCreate 會傳回一個影像識別碼,代表一個大小為 x_size 乘以 y_size 的空白影像。
只有在 PHP 中啟用 GD 支援時,此函式才可用。
ImageCreateFromGif 會傳回一個影像識別碼,代表從給定的 filename 取得的影像。
只有在 PHP 中啟用 GD 支援時,此函式才可用。
ImageDestroy 會釋放與影像 im 相關的任何記憶體。im 是 ImageCreate 函式傳回的影像識別碼。只有在 PHP 中啟用 GD 支援時,才能使用此函式。
ImageFill 會在影像 im 中,從座標 x,y(左上角為 0,0)開始,以顏色 col 執行填滿。
只有在 PHP 中啟用 GD 支援時,此函式才可用。
ImageFilledPolygon 會在影像 im 中建立一個填滿的多邊形。points 是一個包含多邊形頂點的 PHP 陣列。例如:points[0] = x0,points[1] = y0,points[2] = x1,points[3] = y1,依此類推。num_points 是頂點的總數。
只有在 PHP 中啟用 GD 支援時,此函式才可用。
ImageFilledRectangle 會在影像 im 中建立一個顏色為 col 的填滿矩形,該矩形從左上角座標 x1,y1 開始,到右下角座標 x2,y2 結束。0,0 是影像的左上角。
只有在 PHP 中啟用 GD 支援時,此函式才可用。
ImageFillToBorder 會執行填滿,其邊界顏色由 border 定義。填滿的起始點為 x,y(左上角為 0,0),且區域以顏色 col 填滿。
只有在 PHP 中啟用 GD 支援時,此函式才可用。
ImageGif 會從影像 im 中建立名為 filename 的 GIF 檔案。im 參數是從 ImageCreate 函式傳回的值。filename 參數是選填的,如果省略,將直接傳回原始影像串流。藉由使用 Header() 函式傳送 image/gif 內容類型,您可以建立一個 PHP/FI 指令碼,該指令碼可直接使用此函式傳回 GIF 影像。
只有在 PHP 中啟用 GD 支援時,此函式才可用。
ImageInterlace 會開啟或關閉交錯位元。如果 interlace 為 1,則 im 影像將會交錯,如果 interlace 為 0,則交錯位元會關閉。只有在 PHP 中啟用 GD 支援時,才能使用此函式。
ImageLine 會在影像 im 中,從 x1,y1 到 x2,y2(左上角為 0,0)繪製一條顏色為 col 的線條。
只有在 PHP 中啟用 GD 支援時,此函式才可用。
ImagePolygon 會在影像 im 中建立一個多邊形。points 是一個包含多邊形頂點的 PHP 陣列。例如:points[0] = x0,points[1] = y0,points[2] = x1,points[3] = y1,依此類推。num_points 是頂點的總數。
只有在 PHP 中啟用 GD 支援時,此函式才可用。
ImageRectangle 會在影像 im 中建立一個顏色為 col 的矩形,該矩形從左上角座標 x1,y1 開始,到右下角座標 x2,y2 結束。0,0 是影像的左上角。
只有在 PHP 中啟用 GD 支援時,此函式才可用。
ImageSetPixel 會在影像 im 中,於 x,y(左上角為 0,0)繪製一個顏色為 col 的像素。
只有在 PHP 中啟用 GD 支援時,此函式才可用。
ImageString 會在由 im 識別的影像中,於座標 x,y(左上角為 0,0)以顏色 col 繪製字串 s。size 參數可以是 1、2、3、4 或 5,表示要使用的字型大小。1 是最小的,而 5 是最大的。
只有在 PHP 中啟用 GD 支援時,此函式才可用。
ImageStringUp 會在由 im 識別的影像中,於座標 x,y(左上角為 0,0)以顏色 col 垂直繪製字串 s。size 參數可以是 1、2、3、4 或 5,表示要使用的字型大小。1 是最小的,而 5 是最大的。
只有在 PHP 中啟用 GD 支援時,此函式才可用。
ImageSX 會傳回由 im 識別的影像寬度。
ImageSY 會傳回由 im 識別的影像高度。
Include 命令可用於將其他檔案插入目前的 html 檔案中。這對於可能需要在數百個 HTML 檔案中加入的標頭和頁尾非常方便。藉由使用 include 命令,您只需要在需要變更時,在一個地方修改標頭或頁尾檔案即可。由於會對包含的檔案執行完整的 PHP 剖析,因此您也可以使用 include 命令來包含您可能已編寫的通用 PHP 指令碼。這有點像是擁有一個基本共用指令碼庫,您可以從 HTML 檔案中呼叫。您可以將這類通用的程式庫檔案放置在一個目錄中,並設定 PHP 的 include 路徑,而無需使用路徑名稱來參照這些檔案。對於 Apache 模組使用者,可以使用 phpIncludePath 指令來設定,對於 CGI 使用者,可以使用 PHP_INCLUDE_PATH 環境變數來設定。此路徑是以冒號分隔的,就像 UNIX Shell 中的 $PATH
一樣。例如:
<?include("/path/filename.txt")>
InitSyslog() 會定義在使用 OpenLog() 和 Syslog() 時需要的某些 PHP 變數。基於效率考量,預設不會定義這些變數。這些變數的命名方式與 <syslog.h> C 包含檔案中相同(例如 $LOG_LOCAL0)。如需更多詳細資訊,請參閱 syslog(3) UNIX 手冊頁面。另請參閱 InitSyslog()、Syslog() 和 CloseLog()。
intval 會傳回變數的長整數值。另請參閱 strval() 和 doubleval() 函式。
如果定義了給定的變數,IsSet 函式會傳回 1,如果沒有定義,則傳回 0。
Key 會傳回目前陣列項目的索引鍵。目前項目是由給定變數的陣列指標位置所決定。可以使用 Reset()、End()、Next() 和 Prev() 函式來操作此陣列指標。此函式主要用於判斷關聯陣列中項目的索引鍵值,不過它也適用於一般陣列。
Link() 會建立硬連結。如需建立符號連結(軟連結),請參閱 Symlink() 函式。另請參閱 ReadLink 和 LinkInfo 函式。
LinkInfo 會傳回 lstat 系統呼叫傳回的 UNIX C stat 結構的 st_dev 欄位。此函式用於驗證連結(由 path 指向)是否真的存在(使用與 stat.h 中定義的 S_ISLNK 巨集相同的方法)。如果發生錯誤,則傳回 -1。
Log 會傳回 arg 的自然對數。
Log10 會傳回 arg 的以 10 為底的對數。
LogAs() 函式會將目前頁面的點擊視為實際收到在參數 filename 上。
Mail 會自動將訊息參數中指定的訊息郵寄至 to 參數中指定的接收者。可以在 to 參數中使用空格分隔來指定多個收件者。
例如。
mail("rasmus@lerdorf.on.ca", "My Subject", "Line 1\nLine 2\nLine 3");如果傳遞了第四個字串參數,則此字串會插入標頭的末尾,例如
mail("ssb@guardian.no", "the subject", $message, "X-Mailer: PHP/FI " + phpversion());
Max 會傳回 PHP 陣列的最大值。也就是說,它會在整個陣列中搜尋最大元素。如果它是字串陣列,則傳回的字串是如果排序後在陣列中字母順序最後的字串。
Md5 會傳回字串值的 MD5 雜湊。
mi_Close 將關閉與指定連線識別碼相關聯的 Illustra 資料庫連線。
只有在 PHP 中啟用 Illustra 支援時,才能使用此函式。
mi_Connect 會開啟與 Illustra 資料庫的連線。每個引數都應該是引號括住的字串。此函式會傳回 connection_id。其他 Illustra 函式需要此識別碼。您可以同時開啟多個連線。要連線的主機由執行 PHP 可執行檔的電腦上的 MI_PARAMS 檔案控制。目前不支援遠端呼叫。如果發生錯誤,此函式會傳回 -1。
只有在 PHP 中啟用 Illustra 支援時,才能使用此函式。
mi_DBname 會傳回指定 Illustra 連線識別碼所連線的資料庫名稱。
只有在 PHP 中啟用 Illustra 支援時,才能使用此函式。
mi_Exec 會將 SQL 陳述式傳送至由 connection_id 指定的 Illustra 資料庫。connection_id 必須是 mi_Connect 傳回的有效識別碼。此函式的傳回值是一個識別碼,可用於存取其他 Illustra 函式的結果。如果發生錯誤,此函式會傳回 -1。
只有在 PHP 中啟用 Illustra 支援時,才能使用此函式。
mi_FieldName 會傳回具有指定 Illustra 結果和連線識別碼的給定欄位號碼所佔據的欄位名稱。欄位編號從 0 開始。
如果發生錯誤,此函式會傳回 -1。
只有在 PHP 中啟用 Illustra 支援時,才能使用此函式。
mi_FieldNum 會傳回與指定 Illustra 結果識別碼中命名欄位對應的欄位位置編號。欄位編號從 0 開始。如果發生錯誤,此函式會傳回 -1。
只有在 PHP 中啟用 Illustra 支援時,才能使用此函式。
mi_NumFields 會傳回 Illustra 結果中的欄位(欄)數。引數是由 mi_Exec 傳回的有效結果識別碼。如果發生錯誤,此函式會傳回 -1。
只有在 PHP 中啟用 Illustra 支援時,才能使用此函式。
mi_NumRows 會傳回 Illustra 結果中的列數。引數是由 mi_Exec 傳回的有效結果識別碼。如果發生錯誤,此函式會傳回 -1。
只有在 PHP 中啟用 Illustra 支援時,才能使用此函式。
mi_Result 會從 mi_Exec 產生的結果識別碼傳回值。row_number 和欄位名稱會指定要傳回的結果表格中的儲存格。列編號從 0 開始。您可以改用欄位索引(未加引號的數字),而不是命名欄位。欄位索引從 0 開始。
由於目前沒有可用的類型偵測,因此從資料庫傳回的所有值都是字串形式。
只有在 PHP 中啟用 Illustra 支援時,才能使用此函式。
Microtime() 會傳回字串「msec sec」,其中 sec 是自 1970 年 1 月 1 日格林威治標準時間 00:00 以來的秒數,而 msec 是微秒部分(以秒為單位的小數)。例如:「0.87633900 825010464」。
只有在支援 gettimeofday() 系統呼叫的作業系統上才能使用此函式。
Min 會傳回 PHP 陣列的最小值。也就是說,它會在整個陣列中搜尋最小元素。如果它是字串陣列,則傳回的字串是如果排序後在陣列中字母順序第一個的字串。
MkDir 會建立目錄。mode 參數必須以 八進位 表示法給定。例如:MkDir("DirName",0755);
MkTime 函式會回傳 Unix 時間戳記(長整數)格式的時間,該時間對應於引數指定的日期和時間。引數可以省略,在這種情況下,給定的元件會根據目前的本地時間和日期設定為目前值。這些省略的引數只能從右到左省略。例如,MkTime(hour,min,sec)
是有效的,但 MkTime(mon,day,year)
是無效的。請注意,此函式作為日期算術和日期驗證的工具非常方便。您可以傳入無效的參數,例如大於 12 的月份或大於 31 的天數,它仍然會計算出正確的日期。如果任何參數超出正常值,它也會產生錯誤訊息。在使用此函式之前,請使用 SetErrorReporting(0) 函式關閉此錯誤報告,然後您可以檢查 $phperrmsg 中是否有任何錯誤發生。
例如。
SetErrorReporting(0); $a = MkTime(0,0,0,13,1,1997); SetErrorReporting(1); echo $phperrmsg;
msql 函式會傳送一個 mSQL 查詢。引數是資料庫名稱和查詢字串。例如,<?msql("MyDatabase" , "select * from table")>
。此函式的回傳值是一個結果識別碼,用於存取其他 msql_ 函式的結果。結果識別碼是一個正整數。當未建立任何結果識別碼時,函式會回傳 0。這適用於任何不回傳任何內容的查詢,例如 create、update、drop、insert 和 delete。如果發生錯誤,函式會回傳 -1。描述錯誤的字串會放在 $phperrmsg 中,除非函式以 @msql() 的方式呼叫,否則此錯誤字串也會列印出來。對於 mSQL 2.0,$result 變數會包含 SQL 指令影響的列數。如果您希望您的應用程式可移植到 mSQL 1.0,請不要依賴此功能。
只有在 PHP 中啟用 mSQL 支援時,此函式才可用。
如果存在開啟的連線,msql_Close 會關閉與 msql daemon 的 socket 連線。請注意,由於任何時間只能開啟一個並行的 mSQL 會話,因此此函式不接受引數。
msql_Connect 指定 mSQL 資料庫引擎所在的伺服器名稱或 IP。這相當於 mSQL C API 中的 msqlConnect() 函式。此函式與 C API 對應函式之間的一個區別是,如果未呼叫此函式,則在第一次呼叫 msql() 函式時,預設會連線到本機伺服器。而且,由於任何時間只能有一個連線處於活動狀態,因此不需要 msql_close 函式。如果在檔案中第二次呼叫 msql_connect(),則會自動關閉與第一個伺服器的連線。若要明確連線到本機伺服器上的 msql daemon,請使用:<?msql_connect("localhost")>
只有在 PHP 中啟用 mSQL 支援時,此函式才可用。
msql_CreateDB 會建立指定的資料庫。
只有在 PHP 中啟用 mSQL 支援時,此函式才可用。
msql_dbName 會回傳從 msql_ListDbs() 函式回傳的結果指標中位於 $i 位置的資料庫名稱。msql_NumRows() 函式可用於判斷有多少個資料庫名稱可用。
只有在 PHP 中啟用 mSQL 支援時,此函式才可用。
msql_DropDB 會刪除指定的 mSQL 資料庫。使用此函式時請務必小心,因為資料庫中的所有資料都會遺失。
只有在 PHP 中啟用 mSQL 支援時,此函式才可用。
msql_FieldFlags 會回傳指定欄位的欄位旗標。目前,此值可以是 "not null"、"primary key"、兩者的組合或 ""(空字串)。
只有在 PHP 中啟用 mSQL 支援時,此函式才可用。
msql_FieldLen 會回傳指定欄位的長度。
只有在 PHP 中啟用 mSQL 支援時,此函式才可用。
msql_FieldName 會回傳指定欄位的名稱。此函式的引數是結果識別碼和欄位索引。例如,msql_FieldName($result,2);
會回傳與結果識別碼相關的結果中的第二個欄位的名稱。
只有在 PHP 中啟用 mSQL 支援時,此函式才可用。
msql_FieldType 與 msql_FieldName() 函式類似。引數相同,但回傳的是欄位類型。此值將是 "int"、"char" 或 "real" 其中之一。
只有在 PHP 中啟用 mSQL 支援時,此函式才可用。
只有在您擔心腳本執行時使用太多記憶體時,才需要呼叫 msql_FreeResult。當腳本完成時,所有結果記憶體都會自動釋放。但是,如果您確定在腳本中不再需要結果資料,您可以呼叫 msql_freeresult 並將結果識別碼作為引數,與之相關的結果記憶體將會釋放。
只有在 PHP 中啟用 mSQL 支援時,此函式才可用。
msql_ListDBs 會回傳一個結果指標,其中包含目前 mSQL daemon 中的可用資料庫。使用 msql_dbName() 函式來走訪此結果指標。
只有在 PHP 中啟用 mSQL 支援時,此函式才可用。
msql_listfields 會擷取指定表格名稱的相關資訊。引數是資料庫名稱和表格名稱。會回傳一個結果指標,可與 msql_fieldflags、msql_fieldlen、msql_fieldname、msql_fieldtype 一起使用。結果識別碼是一個正整數。如果發生錯誤,函式會回傳 -1。描述錯誤的字串會放在 $phperrmsg 中,除非函式以 @msql() 的方式呼叫,否則此錯誤字串也會列印出來。
只有在 PHP 中啟用 mSQL 支援時,此函式才可用。
msql_ListTables 接受資料庫名稱和結果指標,與 msql() 函式類似。msql_TableName() 函式應該用於從結果指標中擷取實際的表格名稱。
只有在 PHP 中啟用 mSQL 支援時,此函式才可用。
msql_NumFields 會回傳結果中的欄位數。引數是由 msql() 函式回傳的結果識別碼。
只有在 PHP 中啟用 mSQL 支援時,此函式才可用。
msql_NumRows 只是簡單地回傳結果中的列數。引數是由 msql() 函式回傳的結果識別碼。
只有在 PHP 中啟用 mSQL 支援時,此函式才可用。
msql_RegCase 接受字串引數,並將其轉換為傳送至 mSQL 以取得不區分大小寫的相符項所需的正規表示式。這會將 "abc" 之類的字串轉換為 "[Aa][Bb][Cc]"。
只有在 PHP 中啟用 mSQL 支援時,此函式才可用。
msql_Result 會顯示回傳記錄中的欄位。引數是由 msql() 函式回傳的結果識別碼、要檢視的記錄的索引整數以及欄位名稱。欄位引數支援 "table.field" 語法,用於處理聯結的結果。使用完整的範例說明此函式可能最好
<? $name = "bob"; $result = msql($database,"select * from table where firstname='$name'"); $num = msql_numrows($result); echo "$num records found!<p>"; $i=0; while($i<$num); echo msql_result($result,$i,"fullname"); echo "<br>"; echo msql_result($result,$i,"address"); echo "<br>"; $i++; endwhile; >
上述腳本連線到本機上的 mSQL 引擎,將 name 變數設定為 bob,並傳送一個查詢,該查詢會要求表格中 firstname 欄位設定為 bob 的所有欄位。然後,它會顯示找到的記錄數,之後它會迴圈瀏覽每個找到的記錄,並顯示每個記錄的 fullname 和 address 欄位。如您所見,在列印的欄位周圍新增 HTML 標記以表格或任何所需的方式格式化結果是很簡單的。請注意,沒有 msql_connect() 呼叫。只有在需要連線到遠端資料庫時,才需要呼叫 msql_connect()。
只有在 PHP 中啟用 mSQL 支援時,此函式才可用。
msql_TableName 接受由 msql_ListTables() 函式回傳的結果指標以及整數索引,並回傳表格的名稱。msql_NumRows() 函式可用於判斷結果指標中的表格數。一個範例會是
<? $result = msql_listtables("dbname"); $i=0; while($i < msql_numrows($result)); $tb_names[$i]=msql_tablename($result, $i); echo $tb_names[$i]; echo "<BR>"; $i++; endwhile; >
mysql 函式會傳送一個 mysql 查詢。引數是資料庫名稱和查詢字串。例如,<?mysql("MyDatabase" , "select * from table")>
。此函式的回傳值是一個結果識別碼,用於存取其他 mysql_ 函式的結果。結果識別碼是一個正整數。當未建立任何結果識別碼時,函式會回傳 0。這適用於任何不回傳任何內容的查詢,例如 create、update、drop、insert 和 delete。如果發生錯誤,函式會回傳 -1。描述錯誤的字串會放在 $phperrmsg 中,除非函式以 @mysql() 的方式呼叫,否則此錯誤字串也會列印出來。
只有在 PHP 中啟用 mysql 支援時,此函式才可用。
mysql_affected_rows() 會回傳上次 INSERT、UPDATE 或 DELETE 查詢影響的列數。
如果存在開啟的連線,mysql_Close 會關閉與 mysql daemon 的 socket 連線。
mysql_Connect 指定 mysql 資料庫引擎所在的伺服器名稱或 IP。這相當於 mysql C API 中的 mysqlConnect() 函式。此函式與 C API 對應函式之間的一個區別是,如果未呼叫此函式,則在第一次呼叫 mysql() 函式時,預設會連線到本機伺服器。而且,由於任何時間只能有一個連線處於活動狀態,因此不需要 mysql_close 函式。如果在檔案中第二次呼叫 mysql_connect(),則會自動關閉與第一個伺服器的連線。
可以提供選用的使用者名稱和密碼。請注意,當 PHP 編譯為在 安全模式 中執行時,使用者名稱必須與正在處理的檔案擁有者或 httpd 程序(通常是 nobody)的擁有者相同。任何其他使用者名稱都會失敗。
若要明確連線到本機伺服器上的 mysql daemon,請使用:<?mysql_connect("localhost")>
只有在 PHP 中啟用 mysql 支援時,此函式才可用。
mysql_CreateDB 會建立指定的資料庫。
只有在 PHP 中啟用 mysql 支援時,此函式才可用。
mysql_dbName 會回傳從 mysql_ListDbs() 函式回傳的結果指標中位於 $i 位置的資料庫名稱。mysql_NumRows() 函式可用於判斷有多少個資料庫名稱可用。
只有在 PHP 中啟用 mysql 支援時,此函式才可用。
mysql_DropDB 會刪除指定的 mysql 資料庫。使用此函式時請務必小心,因為資料庫中的所有資料都會遺失。
只有在 PHP 中啟用 mysql 支援時,此函式才可用。
mysql_FieldFlags 會回傳指定欄位的欄位旗標。目前,此值可以是 "not null"、"primary key"、兩者的組合或 ""(空字串)。
只有在 PHP 中啟用 mysql 支援時,此函式才可用。
mysql_FieldLen 會回傳指定欄位的長度。
只有在 PHP 中啟用 mysql 支援時,此函式才可用。
mysql_FieldName 會回傳指定欄位的名稱。此函式的引數是結果識別碼和欄位索引。例如,mysql_FieldName($result,2);
會回傳與結果識別碼相關的結果中的第二個欄位的名稱。
只有在 PHP 中啟用 mysql 支援時,此函式才可用。
mysql_FieldType 與 mysql_FieldName() 函式類似。引數相同,但回傳的是欄位類型。此值將是 "int"、"char" 或 "real" 其中之一。
只有在 PHP 中啟用 mysql 支援時,此函式才可用。
只有在您擔心腳本執行時使用太多記憶體時,才需要呼叫 mysql_FreeResult。當腳本完成時,所有結果記憶體都會自動釋放。但是,如果您確定在腳本中不再需要結果資料,您可以呼叫 mysql_freeresult 並將結果識別碼作為引數,與之相關的結果記憶體將會釋放。
只有在 PHP 中啟用 mysql 支援時,此函式才可用。
mysql_insert_id() 會回傳為 AUTO_INCREMENT 欄位產生的 ID。此函式不接受任何引數。它會回傳由上次執行的 INSERT 查詢回傳的自動產生 ID。
mysql_ListDBs 會回傳一個結果指標,其中包含目前 mysql daemon 中的可用資料庫。使用 mysql_dbName() 函式來走訪此結果指標。
只有在 PHP 中啟用 mysql 支援時,此函式才可用。
mysql_listfields 會擷取指定表格名稱的相關資訊。引數是資料庫名稱和表格名稱。會回傳一個結果指標,可與 mysql_fieldflags、mysql_fieldlen、mysql_fieldname、mysql_fieldtype 一起使用。結果識別碼是一個正整數。如果發生錯誤,函式會回傳 -1。描述錯誤的字串會放在 $phperrmsg 中,除非函式以 @mysql() 的方式呼叫,否則此錯誤字串也會列印出來。
只有在 PHP 中啟用 mysql 支援時,此函式才可用。
mysql_ListTables 函數的作用與 mysql() 函數類似,它會接收一個資料庫名稱和一個結果指標。而 mysql_TableName() 函數則用於從結果指標中提取實際的資料表名稱。
只有在 PHP 中啟用 mysql 支援時,此函式才可用。
mysql_NumFields 函數會回傳結果中的欄位數量。參數是 mysql() 函數回傳的結果識別碼。
只有在 PHP 中啟用 mysql 支援時,此函式才可用。
mysql_NumRows 函數單純回傳結果中的列數。參數是 mysql() 函數回傳的結果識別碼。
只有在 PHP 中啟用 mysql 支援時,此函式才可用。
mysql_Result 函數會顯示回傳記錄中的一個欄位。參數包括 mysql() 函數回傳的結果識別碼、一個表示要檢視的記錄索引的整數,以及一個欄位名稱。欄位參數支援 "table.field" 語法,用於處理來自聯結 (join) 的結果。mSQL 1.0 和 mysql 的一個區別在於,mysql 支援可以對結果資料執行的函數。這些函數可以在這個函數中使用。這個函數最好用一個完整的範例來說明。
<? $name = "bob"; $result = mysql($database,"select * from table where firstname='$name'"); $num = mysql_numrows($result); echo "$num records found!<p>"; $i=0; while($i<$num); echo mysql_result($result,$i,"lcase(fullname)"); echo "<br>"; echo mysql_result($result,$i,"address"); echo "<br>"; $i++; endwhile; >
上述腳本連接到本機的 mysql 引擎,將 name 變數設定為 bob,然後發送一個查詢,要求從資料表中取得 firstname 欄位設定為 bob 的所有欄位。接著它會顯示找到的記錄數,然後迴圈遍歷每個找到的記錄,並顯示每個記錄的 fullname 和 address 欄位。結果函數中的 lcase() 呼叫會將回傳的字串變為小寫。如需完整可應用於結果資料的函數列表,請參閱您的 mysql 文件。如您所見,在列印的欄位周圍加入 HTML 標記以格式化表格或任何您想要的方式,將會是微不足道的。請注意,這裡沒有 mysql_connect() 呼叫。只有在需要連線到遠端資料庫時才需要呼叫 mysql_connect。
只有在 PHP 中啟用 mysql 支援時,此函式才可用。
mysql_TableName 函數接收一個由 mysql_ListTables() 函數回傳的結果指標,以及一個整數索引,並回傳資料表的名稱。mysql_NumRows() 函數可以用來判斷結果指標中的資料表數量。一個範例會是:
<? $result = mysql_listtables("dbname"); $i=0; while($i < mysql_numrows($result)); $tb_names[$i]=mysql_tablename($result, $i); echo $tb_names[$i]; echo "<BR>"; $i++; endwhile; >
Next 函數會將內部陣列指標移動到陣列中的下一個項目。當使用非索引方法 ($array[]) 存取陣列時,會自動發生這種情況。該函數會回傳新項目的值。此函數可用於在不必明確存取陣列的情況下,將指標向前移動。一個用途是遍歷關聯陣列,並且只列印出陣列的鍵,而不是實際的內容。
<? Reset($array); $i=0; while($i < count($array)); echo key($array); next($array); $i++; endwhile; >
OctDec 函數會將八進位數字轉換為十進位數字。另請參閱 DecOct()。
openDir 函數會開啟指定的目錄,並將內部指標放置在目錄的開頭。使用 readDir 函數讀取目錄條目,並且應使用 closeDir 函數關閉已開啟的目錄。
OpenLog() 函數會初始化系統以進行後續的 Syslog() 呼叫。如需更多詳細資訊,請參閱 openlog(3) UNIX 手冊頁。另請參閱 InitSyslog()、Syslog() 和 CloseLog()。
以下是一個 Ora_Bind() 函數的使用範例:
/* This is the PHP variable to be bound */ $rc = "12345"; /* This is the SQL query. */ $query = "SELECT * FROM my_table where my_index = :indiana"; ........ if (Ora_Parse($cursor, $query) < 0) { echo("Parse failed!\n" Ora_Logoff($conn); exit; } if (Ora_Bind($cursor, "rc", ":indiana", strlen($rc)) < 0) { echo("Binding failed!\n" Ora_Logoff($conn); exit; } /* Execute the SQL statement associated with $cursor and prepare storage for select-list items. */ $ncols = Ora_Exec($cursor); ......
Ord 函數會回傳 arg 的第一個字元的 ASCII 值。
Parse_str 函數會接收一個與一般 URL 編碼字串相同的字串,並提取變數及其值。
例如:
<? parse_str("a[]=hello+world&a[]=second+variable"); echo $a[],"<br>"; echo $a[],"<br>"; > produces hello world second variable
PassThru() 函數與 Exec() 函數類似,它會執行 Unix 命令。如果存在 return_var 參數,則 Unix 命令的回傳狀態將會放置在此處。當 Unix 命令的輸出為需要直接傳回給瀏覽器的二進位資料時,應該使用此命令來代替 Exec 或 System。一個常見的用途是執行諸如 pbmplus 公用程式之類的程式,這些程式可以直接輸出影像串流。藉由將 content-type 設定為 image/gif,然後呼叫 pbmplus 程式以輸出 gif,您可以建立直接輸出影像的 PHP/FI 腳本。
Pclose 函數會關閉使用 popen() 函數開啟的管道。
pg_Close 函數將會關閉與給定連線識別碼相關聯的 Postgres 資料庫連線。
只有在 PHP 中啟用 Postgres 支援時,此函數才可用。
pg_Connect 函數會開啟與 Postgres 資料庫的連線。每個引數都應該是一個引號括住的字串,包括埠號。options 和 tty 引數是可選的,並且可以是空字串。此函數會回傳一個 connection_id。其他 Postgres 函數需要這個識別碼。您可以同時開啟多個連線。此函數在發生錯誤時會回傳 0。
只有在 PHP 中啟用 Postgres 支援時,此函數才可用。
pg_DBname 函數會回傳給定 Postgres 連線識別碼所連線的資料庫名稱。
只有在 PHP 中啟用 Postgres 支援時,此函數才可用。
如果最後一次存在有效連線的資料庫動作發生錯誤,此函數將會回傳一個字串,其中包含後端伺服器產生的錯誤訊息。
只有在 PHP 中啟用 Postgres 支援時,此函數才可用。
pg_Exec 函數會將 SQL 語句傳送到由 connection_id 指定的 Postgres 資料庫。connection_id 必須是由 pg_Connect 回傳的有效識別碼。此函數的回傳值是一個識別碼,用於存取其他 Postgres 函數的結果。此函數在發生錯誤時會回傳 0。當命令正確執行,但預期不會回傳資料(例如,insert 或 update 命令)時,則會回傳 1。請注意,回傳沒有資料的 select 仍然會回傳大於 1 的有效結果。
只有在 PHP 中啟用 Postgres 支援時,此函數才可用。
pg_FieldName 函數會回傳在給定 Postgres 結果識別碼中,佔用給定欄號的欄位名稱。欄位編號從 0 開始。
只有在 PHP 中啟用 Postgres 支援時,此函數才可用。
pg_FieldPrtLen 函數會回傳 Postgres 結果中特定值的實際列印長度(字元數)。列編號從 0 開始。此函數在發生錯誤時會回傳 -1。
只有在 PHP 中啟用 Postgres 支援時,此函數才可用。
pg_FieldNum 函數會回傳給定 Postgres 結果識別碼中,對應於指定欄位的欄位位置編號。欄位編號從 0 開始。此函數在發生錯誤時會回傳 -1。
只有在 PHP 中啟用 Postgres 支援時,此函數才可用。
pg_FieldSize 函數會回傳給定 Postgres 結果中,指定欄位的內部儲存大小(以位元組為單位)。欄位大小為 0 表示可變長度欄位。此函數在發生錯誤時會回傳 -1。
只有在 PHP 中啟用 Postgres 支援時,此函數才可用。
pg_FieldType 函數會回傳一個字串,其中包含給定 Postgres 結果識別碼中給定欄位的型別名稱。欄位編號從 0 開始。
只有在 PHP 中啟用 Postgres 支援時,此函數才可用。
只有當您擔心您的腳本執行時會佔用過多記憶體時,才需要呼叫 pg_FreeResult。當腳本執行完成時,所有結果記憶體都會自動釋放。但是,如果您確定在腳本中不再需要結果資料,您可以呼叫 pg_freeresult 並將結果識別碼作為參數傳遞,相關的結果記憶體將會被釋放。
只有在 PHP 中啟用 Postgres 支援時,此函數才可用。
如果透過 pg_Exec 發送的最後一個指令是 SQL Insert,則可以使用 pg_GetLastOid 來檢索分配給插入元組的 Oid。如果存在有效的 Oid,此函數將返回一個正整數。如果發生錯誤或透過 pg_Exec 發送的最後一個指令不是 Insert,則會返回 -1。
只有在 PHP 中啟用 Postgres 支援時,此函數才可用。
pg_Host 將返回給定的 Postgres 連接識別碼所連接的主機名稱。
只有在 PHP 中啟用 Postgres 支援時,此函數才可用。
pg_NumFields 將返回 Postgres 結果中的欄位(列)數量。參數是由 pg_Exec 返回的有效結果識別碼。如果發生錯誤,此函數將返回 -1。
只有在 PHP 中啟用 Postgres 支援時,此函數才可用。
pg_NumRows 將返回 Postgres 結果中的列數。參數是由 pg_Exec 返回的有效結果識別碼。如果發生錯誤,此函數將返回 -1。
只有在 PHP 中啟用 Postgres 支援時,此函數才可用。
pg_Options 將返回一個字串,其中包含在給定的 Postgres 連接識別碼上指定的選項。
只有在 PHP 中啟用 Postgres 支援時,此函數才可用。
pg_Port 將返回給定的 Postgres 連接識別碼所連接的連接埠號碼。
只有在 PHP 中啟用 Postgres 支援時,此函數才可用。
pg_Result 將從 pg_Exec 產生的結果識別碼中返回值。row_number 和欄位名稱指定要返回的結果表中的哪個儲存格。列編號從 0 開始。您可以將欄位索引作為不帶引號的數字,而不是命名欄位。欄位索引從 0 開始。
Postgres 內建許多類型,這裡僅直接支援基本類型。所有形式的整數、布林值和 Oid 類型都以整數值返回。所有形式的浮點數和實數類型都以雙精度值返回。所有其他類型,包括陣列,都以與您在 'monitor' 或 'psql' 程式中看到的相同的預設 Postgres 方式格式化的字串返回。
計劃在稍後的日期支援從 Postgres 結果返回數值和字串資料的 PHP 陣列。
只有在 PHP 中啟用 Postgres 支援時,此函數才可用。
pg_tty 將返回在給定的 Postgres 連接識別碼上將伺服器端偵錯輸出發送到的 tty 名稱。
只有在 PHP 中啟用 Postgres 支援時,此函數才可用。
phpInfo 列印與您將 "?info" 新增至 PHP/FI 解析的 URL 或單獨執行 php.cgi 二進位檔時所獲得的相同頁面。它對於在 Apache 模組版本中偵錯腳本特別有用,因為它會顯示許多有用的內部資料。
phpVersion 返回目前正在執行的 PHP/FI 的版本號碼。
Popen 會開啟一個管道到命令並返回一個檔案指標索引。這個檔案指標索引可以被 fgets、fputs 和 fclose 使用。參數是要執行的命令和模式。模式可以是 "r" 代表讀取,或 "w" 代表寫入。請參閱 UNIX C 程式庫 popen 手冊頁以瞭解更多詳細資料。任何使用 popen() 開啟的檔案都應使用 pclose() 函數關閉。
Pos() 函數會返回陣列元素在該陣列中的數值位置。這對於一般陣列不是很有用,但對於關聯陣列來說可能會很方便。
計算 x 的 y 次方。另請參閱 Exp()
Prev 會將指定變數的內部陣列指標移動到陣列中的前一個項目。如果已經在列表的開頭,則指標將指向第一個項目。該函數會返回新項目的值。此函數對於以相反順序遍歷關聯陣列很有用。請參閱 End() 定義中的範例。另請參閱 Next()。
PutEnv 會將給定的字串放入環境中。由於 PHP 完成頁面時會清除本機環境變數,因此這並不是非常有用,但在某些情況下,如果從 PHP 腳本中呼叫的其他內容檢查環境變數,則很有用。例如,如果您要執行多個 mSQL 精靈程序,則需要使用 PutEnv 在不同的通訊端之間來回切換。
QuoteMeta 會返回一個字串,該字串由 arg 組成,其中任何正規表示式特殊字元都使用反斜線逸脫。
Rand 會返回介於 0 和 RANDMAX 之間的隨機數字。請記住在使用 rand() 之前,先呼叫 srand() 來播種您的隨機數字產生器。您只需要播種隨機數字產生器一次。可以使用 getRandMax 函數來確定 RANDMAX。通常,只需對結果使用模數運算子即可選擇特定範圍。
readDir 會從目前開啟的目錄結構中讀取下一個項目。讀取項目後,指標會前進到目錄中的下一個項目,並且下一次呼叫此函數將返回目錄中的下一個項目。在使用此函數之前,請使用 openDir 函數開啟目錄。
$size = ReadFile(Filename) - 讀取檔案名稱,並直接輸出檔案。它會返回實際讀取的位元組數。它與 File() 命令的不同之處在於它不會將檔案儲存在記憶體中,並且可以安全地用於二進位檔。此函數通常用於其他情況下可能會執行 PassThru("cat filename") 的地方。使用 ReadFile 效率更高。
此函數已被 ereg() 函數取代。但是,它仍然可用於向後相容。
如果正規表示式與參數字串相符,則 reg_Match 會返回非零值。例如,條件 <?if (reg_match("^This.*", "This is an example string")>
為真,因為 "^This.*" 表示式表示要比對字串開頭的單字 This,然後比對之後的任何字元。如果存在 regs 引數,則比對暫存器會填入由 regs 引數所命名之陣列中的位置 0-10。暫存器 0 將始終包含完整比對的字串。如需有關正規表示式的詳細資訊,請參閱此文件的 正規表示式章節。
此函數已被 ereg_replace() 函數取代。但是,它仍然可用於向後相容。
reg_Replace 會掃描整個參數字串,並將字串中與指定表示式比對的任何部分取代為取代字串。例如,在字串 "This is an example string"
中,我們可以很容易地使用命令:reg_replace(" ","-","This is an example string") 將每個空格取代為破折號。如需有關正規表示式的詳細資訊,請參閱此文件的 正規表示式章節。
此函數已被 ereg() 函數取代。但是,它仍然可用於向後相容。
reg_Search 將掃描整個參數字串中是否有與指定正規表示式比對的任何項目。如果找到比對項目,則會返回從比對發生位置開始的字串部分。如果找不到比對項目,則會返回零長度的字串。如果存在 regs 引數,則比對暫存器會填入由 regs 引數所命名之陣列中的位置 0-10。暫存器 0 將始終被指派為完整比對的字串。如需有關正規表示式的詳細資訊,請參閱此文件的 正規表示式章節。
將檔案名稱從舊名稱重新命名為新名稱。與 Unix C rename() 函數類似。
Reset 會將指定陣列變數的內部陣列指標移動到陣列的第一個項目,並返回此項目的值。這對於遍歷關聯陣列和非索引陣列很有用。另請參閱 End() 和 Next()。以下範例會遍歷關聯陣列
<? Reset($array); $i=0; while($i < count($array)); echo $array[]; /* pointer automatically moves ahead one */ $i++; endwhile; >
Return 會結束目前的函數呼叫,並將指定的值返回給呼叫者。如需更多資訊,請參閱 使用者定義函數 一節。
rewind() 會重設由 $fd 引數識別的檔案指標,該引數是 fopen() 呼叫的傳回值。檔案指標會定位在檔案的開頭。另請參閱 ftell() 和 fseek()。
rewindDir 會將目前目錄指標移回目錄的開頭。在使用此函數之前,請使用 openDir 函數開啟目錄。
RmDir() 會移除給定的目錄。請參閱 Unlink() 函數以移除一般檔案。
SetCookie() 會定義要與其餘標頭資訊一起傳送的 Cookie。除了名稱引數之外,所有引數都是選用的。如果只有名稱引數存在,則會從遠端用戶端刪除該名稱的 Cookie。您也可以使用空字串 ("") 來取代任何引數,以跳過該引數。expire 和 secure 引數是整數,無法使用空字串跳過。請改用零 (0)。expire 引數是常規的 Unix 時間整數,由 time() 或 mktime() 函數返回。以下是一些範例
SetCookie("TestCookie","Test Value"); SetCookie("TestCookie",$value,time()+3600); /* expire in 1 hour */ SetCookie("TestCookie",$value,time()+3600,"/~rasmus/",".utoronto.ca",1);
請注意,當您傳送 Cookie 時,Cookie 的值部分會自動進行 URL 編碼,並且當接收到 Cookie 時,它會自動解碼並使用與 Cookie 名稱相同的名稱指派給變數。也就是說,若要在腳本中查看我們測試 Cookie 的內容,只需執行
echo $TestCookie;
SetErrorReporting 會將目前的錯誤報告狀態設定為 arg 的值。如果為非零值,則會列印錯誤,如果為 0,則不會列印錯誤。此函數會返回先前的錯誤報告狀態。這是一種比在個別函數前面加上 '@' 字元來停用錯誤報告的更一般方法。如需更多資訊,請參閱 停用函數呼叫錯誤 一節。
SetLogging() 會啟用或停用頁面的存取統計資料記錄。如果 arg 為非零值,則會啟用記錄,如果為零,則會停用記錄。
SetShowInfo() 會啟用或停用透過 PHP 載入的所有頁面底部的資訊頁尾。如果 arg 為非零值,則會啟用頁尾,如果為零,則會停用頁尾。
SetType 會設定變數的類型。type 引數是 "integer"、"double" 或 "string" 其中之一。另請參閱 GetType() 函數。
將值 n 向左位移 b 個位元。
將值 n 向右位移 b 個位元。
Sleep 將延遲 secs 秒。與 Unix C sleep() 函數類似。另請參閱 USleep() 函數。
Solid_Close 將關閉與給定連線識別碼關聯的 Solid 伺服器的連線。
只有在 PHP 中啟用 Solid 支援時,此函數才可用。
Solid_Connect 開啟與 Solid 伺服器的連線。每個參數都應為帶引號的字串。第一個參數(資料來源名稱)可以為空字串,這會連線到本機主機上的預設伺服器。此函式會傳回 connection_id。其他 Solid 函式需要此識別碼。您可以同時開啟多個連線。此函式在發生錯誤時會傳回 0。
只有在 PHP 中啟用 Solid 支援時,此函數才可用。
Solid_Exec 會將 SQL 陳述式傳送到 connection_id 所指定的 Solid 伺服器。connection_id 必須是由 Solid_Connect 傳回的有效識別碼。此函式的傳回值是用於存取其他 Solid 函式結果的識別碼。此函式在發生錯誤時會傳回 0。當命令執行成功但預期不會傳回資料時(例如,插入或更新命令),它會傳回 1。請注意,即使選取查詢沒有傳回任何資料,仍會傳回大於 1 的有效結果。
只有在 PHP 中啟用 Solid 支援時,此函數才可用。
Solid_FetchRow 會擷取由 Solid_Exec 傳回的資料列。在呼叫 Solid_FetchRow 之後,可以使用 Solid_Result 存取該資料列的欄位。每次呼叫 Solid_FetchRow 都可透過 Solid_Result 存取新的資料列。如果 Solid_FetchRow 成功(有新的資料列),則會傳回 1,如果沒有更多資料列,Solid_FetchRow 會傳回 0。Solid_FetchRow 的傳回值可以用作 while 迴圈的條件。
只有在 PHP 中啟用 Solid 支援時,此函數才可用。
Solid_FieldName 會傳回指定的 Solid 結果識別碼中,佔用給定欄位編號的欄位名稱。欄位編號從 0 開始。
只有在 PHP 中啟用 Solid 支援時,此函數才可用。
Solid_FieldNum 會傳回指定的 Solid 結果識別碼中,對應於命名欄位的欄位索引。欄位編號從 0 開始。此函式在發生錯誤時會傳回 -1。
只有在 PHP 中啟用 Solid 支援時,此函數才可用。
只有在您擔心腳本執行時使用過多記憶體時,才需要呼叫 Solid_FreeResult。當腳本完成時,所有結果記憶體都會自動釋放。但是,如果您確定腳本中不再需要結果資料,您可以將結果識別碼作為參數呼叫 Solid_FreeResult,相關的結果記憶體將會被釋放。
只有在 PHP 中啟用 Solid 支援時,此函數才可用。
Solid_NumFields 會傳回 Solid 結果中的欄位(列)數量。參數是由 Solid_Exec 傳回的有效結果識別碼。此函式在發生錯誤時會傳回 -1。
只有在 PHP 中啟用 Solid 支援時,此函數才可用。
Solid_NumRows 會傳回 Solid 結果中的資料列數量。參數是由 Solid_Exec 傳回的有效結果識別碼。此函式在發生錯誤時會傳回 -1。重要警告:SOLID SQL 伺服器使用 ODBC 作為其主要(也是唯一)介面。SolidNumRows() 在底層使用 SQLRowCount 來取得資料列的數量。SQLRowCount 遵循 Microsoft 長期以來不必要的限制、奇怪的例外情況和其他奇怪事物的傳統。這表示此函式僅會傳回受 INSERT、UPDATE 或 DELETE 子句影響的資料列數量。不適用於 SELECT!作為一種解決方法,您可以嘗試 SQL 的 count() 陳述式或計算資料列數量的 while 迴圈。如果您需要 Solid_NumRows() 來計算 SELECT 子句之後要讀取的記錄數量,請嘗試檢查 Solid_FetchRow() 的傳回值。所以,不要使用
$num = Solid_NumRows(); $i=0; while ($i < $num) { /* print results... */ $i++; }
您可以嘗試
while(Solid_FetchRow($result)) { /* print results... */ }
只有在 PHP 中啟用 Solid 支援時,此函數才可用。
Solid_Result 會從 Solid_Exec 產生的結果識別碼傳回值。欄位名稱指定要傳回的資料列中的哪個儲存格。您可以將欄位索引作為未加引號的數字來使用,而不是命名欄位。欄位索引從 0 開始。
只有在 PHP 中啟用 Solid 支援時,此函數才可用。
Sort 用於依遞增順序排序 PHP 陣列。若要依遞減順序排序,請使用 RSort() 函式。它了解三種變數類型,如果陣列包含字串,則會依字母順序排序;如果陣列包含數字,則會依數值排序。如果陣列包含混合類型,則陣列中的第一個類型將指定排序方法。請注意,如果您要排序關聯陣列,則應使用 ASort() 函式。
此函式接受一個字串參數,並傳回該字串的 soundex 鍵。Soundex 鍵的特性是,發音相似的單字會產生相同的 soundex 鍵,因此可用於簡化在資料庫中的搜尋,其中您知道發音但不知道拼寫。此 soundex 函式會傳回一個長度為 4 個字元的字串,並以字母開頭。
此特定的 soundex 函式是 Donald Knuth 在「The Art Of Computer Programming, vol. 3: Sorting And Searching」一書中描述的,Addison-Wesley (1973), pp. 391-392。
範例
Euler and Ellery map to E460 Gauss and Ghosh map to G200 Hilbert and Heilbronn map to H416 Knuth and Kant map to K530 Lloyd and Ladd map to L300 Lukasiewicz and Lissajous map to L222
Sprintf 會傳回由 format 參數和 arg 定義的格式化輸出建立的字串。它與 echo 命令的格式化版本類似,但此命令只傳回字串,而 echo 則顯示字串。它也與 C 語言中同名的函式類似。不同之處在於,此版本不接受超過 5 個 arg 參數。如果您需要將超過 5 個參數格式化為單一字串,只需為每組參數多次呼叫 sprintf()。請注意,參數的類型不會影響輸出。參數類型會自動轉換為符合格式字串中指定的類型。
Sqrt 會傳回 arg 的平方根。
Srand 會設定亂數產生器的種子。此函式接受任何整數作為參數。種子值的一個選擇是使用 date 函式來提供您目前分鐘過去的秒數。請注意,此函式不傳回值!此函式僅設定亂數產生器的種子,以供後續呼叫 rand() 函式使用。例如
<?srand(date("s"))>
strchr 和 strstr 實際上是相同的函式。它們可以互換使用,並且為了完整性而同時包含兩者。它們會傳回字串參數的一部分,從找到給定子字串的位置開始。例如,在上面的字串「This is an example string」中,呼叫:<?echo strchr($string,"an ")>
會傳回字串:"an example string"
。
StripSlashes 會取消跳脫字串參數。另請參閱 AddSlashes()。
strlen 會傳回字串的長度。
strrchr 會從參數字串的結尾開始往回搜尋單一字元。如果找到該字元,則會傳回從搜尋字元開始的字串,如果沒找到,則會傳回空字串。
strstr 和 strchr 實際上是相同的函式。它們可以互換使用,並且為了完整性而同時包含兩者。它們會傳回字串參數的一部分,從找到給定子字串的位置開始。例如,在上面的字串「This is an example string」中,呼叫:<?echo strstr($string,"an ")>
會傳回字串:"an example string"
。
strtok 用於將字串符號化。也就是說,如果您有一個像 「This is an example string」 這樣的字串,您可以使用空格字元作為符號,將此字串符號化為個別單字。您會使用下列腳本程式碼
<? $string = "This is an example string"; $tok = strtok($string," "); while($tok); echo "Word=$tok<br>"; $tok = strtok(" "); endwhile; >
請注意,只有第一次呼叫 strtok 時才會使用字串參數。後續每次呼叫 strtok 時,只需要使用要使用的符號,因為它會追蹤目前字串中的位置。若要重新開始,或將新的字串符號化,您只需再次使用字串參數呼叫 strtok 來初始化它。請注意,您可以在 arg 參數中放入多個符號。當找到參數中的任何一個字元時,字串會被符號化。
strtolower 會將字串參數轉換為全部小寫字元。
strtoupper 會將字串參數轉換為全部大寫字元。
strval 會傳回變數的字串值。另請參閱 intval() 和 doubleval() 函式。
substr 會傳回給定字串的一部分。起始位置由 start 參數給定。字串中的第一個位置是位置 0。length 參數指定從起始位置傳回的字元數。
如果已建立與資料庫的連線,此函式會傳回 1,否則傳回 0。
此函式會針對指定的資料庫發出 Sybase Transact-SQL use 命令。此函式唯一的參數是要使用的資料庫名稱。範例:sybsql_dbuse("pubs2");
此函式在成功時會傳回 1,在失敗時會傳回 0。
此函式會開啟與 sybase 伺服器的網路連線。此函式取決於多個環境變數,這些變數必須由呼叫者在呼叫此函式之前設定。
環境變數為
DSQUERY - sybase 介面檔案中定義的 sybase 伺服器別名。
DBUSER - 以此使用者連線到 sybase 伺服器。
DBPW - 使用者的密碼。
這些變數可以透過多種方式設定。如果 php/fi 作為 CGI 程式執行,則可以使用 shell 包裝器來設定這些變數,或者您可以使用內建的 PHP/FI 函式 putenv() 直接在 HTML 頁面中設定這些變數。您可以使用表單輸入來取得這些值,而不是直接在 putenv() 中使用這些值。這些變數可以在檔案中定義,並使用 PHP/FI include
陳述式包含在 html 檔案中。
此函式在成功時會傳回 1,在失敗時會傳回 0。
此函式會強制關閉 Sybase 連線。如果未呼叫,則會在完全剖析 PHP 頁面時自動關閉連線,因此呼叫此函式是選擇性的。
此函式會傳回規則結果欄的欄位名稱。此函式的參數為欄位索引。範例:sybsql_fieldname(0);
。注意:欄位索引從 0 開始。
如果結果欄沒有任何名稱,此函式會傳回空字串 ("")。
此函式會取得目前結果資料列的特定欄的值。此函式唯一的參數是指定欄位的字串。範例:$value=sybsql_getfield("@10");
注意:必須先呼叫 sybsql_nextrow(),才能呼叫此函式。如果需要遞增資料列指標,則必須呼叫 sybsql_nextrow(),因為此函式只會讀取資料列緩衝區中的目前資料列。
如果指定的欄位有值,則此函式會傳回該值作為字串,否則此函式會傳回空字串 ("")。
此函式會指示目前的 SQL 命令是否傳回任何資料列。
如果 SQL 命令傳回任何資料列,則此函式會傳回 1;如果命令沒有傳回任何資料列,則會傳回 0。
此函式會將資料列指標遞增到下一個結果資料列。
只要有資料列可以讀取,此函式就會傳回 1。如果沒有更多資料列可以讀取,或發生錯誤,此函式會傳回 0。
此函式會傳回目前結果資料列中的欄位數量。
此函式會傳回目前結果資料列中的資料列數量。如果沒有欄位,此函式會傳回 0。
此函數會回傳目前結果緩衝區中的列數。注意:當此函數被呼叫時,它會立即尋找第一列,然後呼叫 dbnextrow() 直到沒有更多列,並遞增一個內部計數器來計算結果緩衝區中的列數。然後它會指回第一列。因此,在呼叫此函數後,列計數器總是會指向第一列。這很笨拙,但我目前不知道任何其他方法。
如果結果緩衝區中沒有列,此函數將回傳 0。
此函數會將 Sybase SQL 查詢請求提交到伺服器。此函數唯一的參數是查詢字串。範例:$rc=sybsql_query("select * from authors");
如果查詢成功傳遞,此函數會回傳 1,如果請求失敗,則回傳 0。
此函數會列印目前結果列的特定欄位。此函數唯一的參數是一個字串,其中包含要列印欄位的相關資訊。欄位是以 @ 符號後接數字指定。例如,@0 表示第一欄,@10 表示第 11 欄。請注意,欄位編號從 0 開始。此函數最好用完整的範例來說明
<? /* ** assuming all the necessary variables for ** connection is already set. please note, NO error checking is ** done. You should always check return code of a function. */ /* connect */ $rc=sybsql_connect(); /* use the pub2 database */ $rc=sybsql_dbuse("pubs2"); /* send the SQL request */ $rc=sybsql_query("select * from authors"); $i=0; /* find the no of rows returned */ $nrows=sybsql_numrows(); /* start table */ echo "<table border>\n"; /* ** print only first and 2nd field */ while($i<$nrows) { sybsql_result("<tr><td>@0</td>@1</td></tr>\n"); $i++; } /* end table */ echo "</table>\n"; >
以上範例使用 HTML 表格來格式化輸出。當然,也可以使用任何其他有效的 HTML 標籤。
此函數會列印目前結果緩衝區中的所有列。結果會以硬編碼的 HTML 表格格式列印。請注意,不應在迴圈內呼叫此函數。如果輸出中有任何欄標題,此函數會列印欄的名稱。
此函數會將請求的列號設定為列緩衝區中的目前列。此函數唯一的參數是列號。範例:$rc=sybsql_seek(10);
請注意,列號從 0 開始。
如果尋找成功,此函數會回傳 1,如果尋找失敗,則回傳 0。當目前結果緩衝區中的所有列都已造訪過時,列指標會指向最後一列。如果需要向後移動並造訪更多列,可以使用此函數。
Symlink() 會建立符號連結。請參閱 Link() 函數以建立硬連結。
Syslog() 會使用 UNIX 的 syslog(3) 功能將訊息記錄到系統。請參閱您的 UNIX 手冊頁以取得更多詳細資訊。另請參閱 InitSyslog()、OpenLog() 和 CloseLog()。
System 就像 C 語言中的 system() 命令一樣,它會執行指定的 unix 命令並輸出結果。如果將變數做為第二個引數提供,則執行的 unix 命令的回傳狀態碼將會寫入此變數。請注意,如果要允許將來自使用者輸入的資料傳遞到此 System 函數,則應該使用 EscapeShellCmd() 函數,以確保使用者無法欺騙系統執行任意命令。如果 PHP 做為 Apache 模組執行,則 System() 呼叫也會在每行輸出後自動清除 Apache 輸出緩衝區。如果需要執行命令並讓所有來自命令的資料直接傳回,而沒有任何干擾,請使用 PassThru() 函數。另請參閱 Exec 函數。
TempNam 會回傳位於 path 指示的目錄中,且檔案名稱前綴為 prefix 的唯一檔案名稱。它與 Unix C tempnam() 函數相同。
Time 只會回傳自 Unix 時間戳 (1970 年 1 月 1 日 00:00:00) 以來的目前本地時間 (以秒為單位)。它相當於呼叫 Date("U")。如果需要比每秒更好的精細度,請使用 Microtime 函數。
Umask(mask) 會將 PHP 的 umask 設定為 mask & 0777,並回傳舊的 umask。如果 PHP/FI 是 Apache 模組,當 PHP/FI 完成時,會還原 Apache 的舊 umask。mask 必須以 八進位 表示法指定,就像 ChMod() 一樣。不帶引數的 Umask() 只會回傳目前的 umask。
UniqId 會回傳以前綴字串加上以微秒為單位的目前時間為基礎的唯一識別碼。如果同時在可能會在同一微秒產生識別碼的多個主機上產生識別碼,前綴可能很有用。前綴最多可以有 114 個字元長。
Unlink 會刪除指定的檔案名稱。類似於 Unix C unlink() 函數。請參閱 RmDir() 函數以移除目錄。
UnSet 會取消定義指定的變數。在陣列的情況下,會清除整個陣列。也可以取消設定個別的陣列元素。
UrlDecode 會解碼使用 UrlEncode 函數編碼的字串。在一般使用中,不需要解碼 URL 編碼的字串,因為當字串在頁面之間傳遞時,會自動解碼這些字串。但是,為了完整起見,已包含此函數。
UrlEncode 會編碼 arg 中不是 "a-zA-Z0-9_-" 的任何字元,方法是將它們取代為 %xx,其中 xx 是它們的十六進位 ASCII 值。會回傳編碼的字串。
Sleep 會延遲指定的微秒數。類似於 Unix C usleep() 函數。另請參閱 Sleep() 函數。
Virtual 是 Apache 特有的函數,相當於 mod_include 中的 <!--#include virtual...-->。它會執行 Apache 子請求。它對於包含 CGI 指令碼或 .shtml 檔案,或是任何其他您會透過 Apache 剖析的內容 (對於 .phtml 檔案,您可能想要使用 <?Include>) 很有用。
在您開始修改 PHP/FI 的內部之前,您需要取得最新版本的 Bison 的複本。Bison 是 GNU 的 YACC (Yet Another Compiler Compiler) 實作。您的作業系統隨附的 YACC 可能夠好,也可能不夠好,但為了確保起見,請取得 Bison。您可以在 ftp://prep.ai.mit.edu/pub/gnu 找到它。
您也應該看一下 Makefile 並啟用偵錯。只需取消註解 Makefile 中的 DEBUG 行即可。偵錯資訊的輸出檔案是由 php.h 中的 DEBUG_FILE 指定。預設值為 /tmp/php.err。您可以變更此設定以符合您的需求。
您可能想要記住的最後一件事是,php 會以系統上 httpd 的使用者 ID 執行,除非您是以設定 setuid 位元的方式執行它,而且此 httpd 使用者通常沒有寫入各種目錄的權限。這表示,如果您執行的某些動作導致 php 核心傾印,您將不會取得核心檔案。解決此問題的簡單方法是讓您保留測試 .html 檔案的目錄可供所有人寫入。PHP 會將其目前目錄變更為正在讀取的 .html 檔案的目錄,因此如果可以,它會將其核心傾印在那裡。
在接下來的步驟中,我們將使用 Time() 函數來說明如何新增函數。
如果您的函數採用 0 到 6 個引數,則有可用的預先定義文法。您可以跳過此步驟。
您的函數的文法是在 parse.raw 檔案中定義。要新增的第一件事是符號。符號是一個大寫關鍵字,通常與您的函數名稱相同。所有符號都在 parse.raw 檔案的頂端附近定義。順序並不重要。然後,您需要建立實際的 YACC 文法規則。查看現有的規則,並尋找與您要新增的函數類似的函數。請記住,大多數正常函數都是從運算式堆疊讀取其引數的標準函數。您的函數很可能會屬於此群組,在這種情況下,您不需要碰觸 parse.raw 檔案。
若要執行此操作,請編輯 lex.c 並尋找檔案頂端附近的雜湊表。尋找這行:static cmd_table_t cmd_table[22][30] = {
,其定義雜湊表的開頭。[22][30]
定義保存雜湊表的二維陣列的大小。22 比最大函數名稱長度大 1,而 30 則是指任何一個雜湊清單中的最大函數數目。如果您超過這些限制的任一個,只需在此處將它們增加即可。
此雜湊表可能會被評為整個世界中最絕對簡單的雜湊表。雜湊值是要雜湊的函數名稱字串長度。因此,對於我們的 Time() 範例,我們需要為雜湊值 4 新增一個項目。因此,我們將以下行新增到 4 的雜湊清單中
{ "time",INTFUNC0,UnixTime },
此項目會將字串對應到 INTFUNC0 符號。您可以在 parse.raw 中查閱 INTFUNC0 符號的文法,您將會看到它是具有 0 個引數的內部函數呼叫的泛型文法。在上面的引號中的字串是您將在 .html 檔案中用來呼叫函數的實際字串。請記住,PHP/FI 函數名稱不區分大小寫。而最後的 UnixTime 元素是要呼叫的實際函數。
您實際上可以使用您喜歡的任何語言撰寫函數,只要它可透過一般 C 函數呼叫慣例呼叫,並且您有一種方法可以建立與系統上的連結器相容的物件檔或程式庫檔案。一般而言,我們將假設您以 C 語言撰寫函數。PHP/FI 隨附的所有函數都是以 C 語言撰寫的。可以在 date.c 中找到 Time() 函數,或是在 PHP 內部稱為 UnixTime() 的函數,看起來像這樣
void UnixTime(void) { char temp[32]; sprintf(temp,"%ld",(long)time(NULL)); Push(temp,LNUMBER); }
請注意,此函式為 void。這表示它不回傳任何值。這對您來說可能有點令人困惑,因為顯然函式需要以某種方式回傳時間。時間確實會回傳,但不是作為函式的回傳值。它會被推送到一個稱為運算式堆疊的東西上。運算式堆疊只是一個字串和相關類型的堆疊。PHP/FI 只理解 3 種基本變數類型:STRING、LNUMBER 和 DNUMBER。STRING 是一個字元字串,LNUMBER 是一個長整數,而 DNUMBER 是一個雙精度或浮點數值。在此 Time() 範例中,要回傳的值是以 Unix 格式表示的時間(自 1970 年 1 月 1 日以來的秒數),因此是一個整數。運算式堆疊只接受字串,因此我們使用 sprintf 將長整數格式化為字串,並將其推送到堆疊上,並使用以下程式碼行表示它實際上是一個長整數:Push(temp,LNUMBER);
在 php.h 檔案的下半部分,您會找到所有 php 函式的完整原型清單。它們會依據其出現的檔案分組。只需將您的原型新增至此檔案中適當的位置即可。對於我們的 Time() 範例,會新增以下程式碼行
void UnixTime(void);
每當您變更 parse.raw 檔案時,都必須記得重新製作剖析器。輸入:make parser 來執行此操作。您必須至少具有 Bison 的 1.25 版本才能製作 PHP 剖析器。然後,輸入:make 來執行一般編譯。
如果您希望將您的函式新增至 PHP/FI 的下一個版本,請將它們傳送給我。最好的方法可能是製作一個上下文相關的差異。為此,您需要一份未經修改的乾淨發行版本副本。只需對您已變更的檔案執行 diff -c,將它們與原始檔案進行比較。請不要將 parse.c 中變更的差異傳送給我,因為該檔案是自動產生的。請改為傳送來自 parse.raw 的差異。
Time() 範例說明了新增函式所涉及的步驟。您希望新增的函式很可能比此範例複雜得多。您可能需要能夠將引數傳遞給您的函式,並讓它以某種方式處理這些引數。您甚至可能希望以不同的方式呼叫它。這些概念將透過 PHP/FI crypt() 函式來說明。另請參閱標題為 程式碼破解注意事項 的章節,以取得有關為 PHP/FI 編寫程式碼的更多技術詳細資料。
parse.raw 中的 Crypt() 文法
%token CRYPT . . . | CRYPT '(' expr ',' expr ')' { if(GetCurrentState(NULL) || inCase || inElseIf) Crypt(1); } | CRYPT '(' expr ')' { if(GetCurrentState(NULL) || inCase || inElseIf) Crypt(0); }
此處顯示如何定義一個文法,讓您可以使用 1 個或 2 個引數呼叫函式。您可以編寫不同的函式來處理這兩種情況,或者只需傳送一個模式參數,就像這裡一樣,以表示呼叫函式的模式。請注意,在這種情況下,您無法使用預先定義的 INTFUNCn 文法,因為您的函式可以採用可變數量的引數。
顯示的另一個方面是如何實際表示函式引數。在大多數情況下,您會想要使用 expr 識別碼。此識別碼表示引數是一個運算式。運算式可以是常值、函式呼叫或多個運算式的組合。如需更多詳細資訊,請參閱 parse.raw 中運算式的完整 yacc 文法定義。
lex.c 中的雜湊表項目
{ "crypt",CRYPT,NULL },
請注意,在這種情況下,最後一個項目是 NULL,因為函式呼叫會在 parse.raw 中直接處理。如果您使用 INTFUNCn 文法,那麼您會將您的函式名稱放在此 NULL 的位置。crypt.c 中的實際 Crypt() 函式
/* * If mode is non-zero, a salt is expected. * If mode is zero, a pseudo-random salt will be selected. */ void Crypt(int mode) { #if HAVE_CRYPT Stack *s; char salt[8]; char *enc; salt[0] = '\0'; if(mode) { s = Pop(); if(!s) { Error("Stack error in crypt"); return; } if(s->strval) strncpy(salt,s->strval,2); } s = Pop(); if(!s) { Error("Stack error in crypt"); return; } if(!salt[0]) { salt[0] = 'A' + (time(NULL) % 26); salt[1] = 'a' + (time(NULL) % 26); salt[2] = '\0'; } enc = (char *)crypt(s->strval,salt); #if DEBUG Debug("Crypt returned [%s]\n",enc); #endif Push(enc,STRING); #else Error("No crypt support compiled into this version"); #endif }
此函式最重要的方面是 s = Pop() 呼叫。函式的引數必須逐個從運算式堆疊中彈出。當您編寫一個採用多個引數的函式時,請記住,堆疊是一種後進先出 (LAST-IN, FIRST-OUT) 的資料結構。這表示您會以相反的順序從堆疊中彈出引數。最後一個引數會先彈出。在上述範例中,我們會檢查是否處於 2 個引數模式。如果處於此模式,我們會從堆疊中彈出引數並儲存它。然後,我們會從堆疊中彈出下一個引數。Pop() 會回傳指向 Stack 結構 (s) 的指標。Stack 結構如下所示(來自 php.h)
/* Expression Stack */ typedef struct Stack { short type; unsigned char *strval; long intval; double douval; VarTree *var; struct Stack *next; } Stack;
type 通常會是 STRING、LNUMBER 或 DNUMBER 的其中之一。strval、intval 和 douval 元件分別是該值的字串、整數和雙精度表示法。如果運算式實際上是一個已定義的變數,則 var 元件會包含指向定義此變數的變數結構的指標。
在我們的 Crypt() 函式中,我們只對引數的字串值感興趣,因此我們使用 s->strval。許多 PHP/FI 函式可以根據變數的類型執行不同的操作,只需檢查 s->type 並適當地使用 s->strval、s->intval 和/或 s->douval 即可。
在呼叫 real crypt() 函式並取得加密的字串後,我們的 Crypt() 函式會呼叫 Push(enc,STRING); 以將回傳值推送到運算式堆疊上。應該注意的是,運算式堆疊會在每個 PHP/FI 行之後清除,因此如果您將永遠不會被任何內容彈出的運算式推送到此堆疊上,則沒有關係。
Crypt() 範例中的 Debug() 呼叫顯示如何將偵錯輸出新增至您的函式。Debug() 是一個 varags(可變引數清單)函式,就像 printf 一樣。
PHP/FI 中的記憶體管理是一件棘手的事情。由於我們可以作為伺服器模組執行,因此我們必須非常小心記憶體資源。我們不僅需要可重入,而且還需要處理我們隨時可能收到逾時訊號的事實,在這種情況下,我們會退出模組。我們不會收到警告,也沒有時間釋放我們可能已配置的任何記憶體。而且必須釋放此記憶體,否則我們連結到的 httpd 程序的資料空間可能會無限期地成長。當 PHP 以 CGI 模式執行時,也會應用此規則,因為它可以設定為以 FastCGI 持續性程序執行。
解決方案是使用記憶體的子池。當工作階段終止時,這些池會由 Apache 自動清除;或者在 FastCGI 持續性程序的情況下,這些池會在 main.c 中每次執行 FastCGI 包裝函式迴圈時清除。目前使用了三個這樣的池。它們的編號為 0、1 和 2。子池編號是 emalloc 和 estrdup 函式的第一個引數。
使用子池完全消除了在程式碼中任何地方明確釋放記憶體的需求,只有一個例外,那就是使用各種可能會連結到 PHP 中的程式庫的常規 malloc 呼叫所配置的記憶體。gdbm 程式庫就是一個這樣的範例。