65241
[簡介] [FAQ] [索引] [Windows專欄] [下載中心]
[PHP3 文件] [PHP4 文件] [JS文件] [Qmail文件]中文版 PHP3 常問問題集 (PHP3 FAQ)
版本: 1.0原文文件:
http://www.php.net/FAQ.php3工作人員:
工作項目 負責團員 計畫負責人 Hyper 第一章中文化 ernest 第二章中文化 chChen 第三章中文化 Hyper 第四章中文化 ttj 第五章中文化 Leo 第六章中文化 ttj 第七章中文化 Leo
這是一份有關 PHP 的 FAQ。如果你對這份文件有任何的建議 ,可以寫信到 php3@lists.php.net.
- 1. 一般性問題
- 2.
取得PHP- 3.
安裝- 4.
安裝設定的問題- 5.
使用 PHP- 6.
新功能特色- 7.
常見問題- 8. Migrating from PHP2 to PHP3
1. 一般性問題
- 1.1 什麼是 PHP?
- 根據 PHP 的官方說明文件 (manual):
PHP(版本3.0)是種內嵌於HTML之中的手稿語言(script language). PHP的語法結構大部分是採用自 C, JAVA 及 Perl 等的結構, 並加入一些PHP所獨有的特點. 而PHP的發展目標是希望能讓網頁設計者, 可以更快速地完成可動態更新的網頁.
- 1.2 PHP和 PHP/FI是什麼關係呢?
- PHP 可以說是 PHP/FI 2.0 的繼承者.
- 1.3 我可以同時執行 PHP/FI 2.0 和 PHP 嗎?
- 是的, PHP 在設計時就考慮到不會去影響到現存已安裝的 PHP/FI 2. 您可以在 這裡 找到如何設定Apache 1.3.0,使其可同時執行PHP/FI 2及PHP的簡介. 另外一種方法可在 這裡 找到, 雖然在其第一個步驟中所提的用PHP regex code來取代PHP2 regex code是多餘的. 那兩個regex目錄是相同的.
- 1.4 PHP 和 PHP/FI 2.0 之間有什麼相異之處呢?
- 完整的改變列表請參閱 CHANGES 這個檔案, 這個檔案可在PHP的下載檔中找到.其中一些較顯著的改變有:
- 全新的語法解析器.
- 增強的資料庫連接.
- 可使用Windows95/NT port.
- IMAP, SNMP, 和 LDAP 等擴充功能.
- 1.5 我聽說可以用PHP存取 Microsoft SQL Server. 我該如何做呢?
- 在 Windows 95/NT 的機器上, 你可以輕鬆地使用內含的 ODBC 支援功能及適當的 ODBC 驅動程式.
有份教你如何一步步設定 ODBC 的文件, 你可以在 這裡 找到.
在 Unix 的機器上, 你可以使用 Sybase-CT 驅動程式來存取 Microsoft SQL Servers 因為他們使用 (至少大部分是) 相容的通訊協定. Sybase 有在Linux系統上所須函式庫的免費版本. 在其他種 Unix 作業系統上, 你需要和Sybase聯繫以取得合適的函式庫. 另外也請參考下一個問題 1.6 的答覆.
- 1.6 請問我可以存取 Microsoft Access databases 嗎?
- 是的. 如果你是在 Windows 95/98 或 NT 下使用 ODBC 與 Microsoft Access資料庫的 ODBC 驅動程式,你已經擁有所有你需要的工具了.
如果你是在 Unix 環境下執行 PHP , 且想要存取 WIndows 環境下的 MS-Access ,你需要 Unix ODBC 驅動程式. OpenLink Software 有很多 Unix 下的 ODBC 驅動程式可以做這件事.你可以免費下載沒有期限的評估版本.商業版本的售價從美金$675起算.
另一個可替代的方法是使用有 Windows ODBC 驅動程式且可以存取 Microsoft Access 資料的SQL Server. 那麼你就可以透過 ODBC 來存取 MS-Access 的資料且用 PHP 內建的模組來存取 SQL Server. 或者你也可以使用 Access 和 PHP 都認識的檔案格式作為其媒介, 例如用純文字格式或 dBase 資料庫. 關於這一點, OpenLink software 的 Tim Hayes 寫道:
當你可以使用 ODBC 使 PHP 可以直接存取你的資料庫時(例如,使用 OpenLink 的驅動程式.), 使用另一個資料庫來作為媒介就不是個好的方法.如果你真的需要使用某個檔案格式作為媒介, OpenLink 現在有個在 NT, Linux 及其他 unix 平台的 Virtuoso (一個虛擬的資料庫引擎).歡迎到我們的 網站 來下載.有個已被證明成功的選擇,是使用 MySQL 及其在 Windows上的 MyODBC 驅動程式來存取資料庫. Steve Lawrence 寫道:
一些小技巧:
- 根據 MySQL 的說明文件在你的作業平台上安裝 MySQL. 你可以在 www.mysql.org 取得最新的版本 (請透過離你最近的鏡射站下載!). 你除了建立資料庫之外, 沒有什麼特殊且必須的安裝設定. 而當你在設定使用者帳號時, 你需要在 host 欄位中填入 % , 或是那台你要用來存取 MySQL 的 Windows 電腦的機器名稱. 並將你的伺服器的名稱, 使用者名稱, 及密碼記錄下來.
- 從 MySQL 的站台下載 Windows 平台的 MyODBC 驅動程式. 最新的版本是 myodbc-2_50_19-win95.zip (也有 NT 的版本, 而且還有原始碼). 把它安裝到你的 Windows 電腦裡. 你可以用其內附的工具測試其運作情形.
- 在你的 ODBC資料來源(你可以在 控制台 找到) 裡建立一個使用者或系統資料來源名稱. 若想要為你在第一個步驟所設定的 MySQL 資料庫建立一個資料來源名稱, 請輸入你的主機名稱, 使用者名稱, 密碼, 及所使用的 port 等等.
- 請完整安裝 Access , 這可以保證你能得到所需的 add-ins. 至少你將需要 ODBC 功能與連結資料表管理員.
- 接著是較有趣的部分! 請先建立一個新的 access 資料庫. 然後請在資料表視窗中按滑鼠右鍵並選擇 連結資料表 , 或是在 檔案 選單中, 選擇 取得外部資料 下的 連結資料表. 當檔案瀏覽視窗出現時, 選擇 ODBC資料庫 這個檔案類型. 選擇 檔案資料來源 下你在步驟3建立的資料來源名稱. 接著選擇欲連結的資料表, 並按確定鈕. 你現在可以開啟該資料表, 並能在你的 MySQL server 新增/刪除/編輯 資料! 你也可以建立查詢(queries), 或是匯入/匯出資料表至 MySQL, 或建立表單和報表等等.
- 你可以先在 access 建構你的資料表並將之匯出至 MySQL, 然後再將資料表連結回來. 這會使資料表的建立更快一些.
- 當你在 access 中建立資料表時, 你必須要設定一個主索引才能在 access 中做存取的動作. 因此在你連結資料表至 access 前, 請確定你有在 MySQL 中建立主索引.
- 如果你在 MySQL 中改變了資料表, 你需要重新將它連結進 access. 點選工具選單>資料庫公用程式>連結資料表管理員, 接著到你 ODBC 資料來源名稱的視窗, 並選擇該資料表以重新連結. 你也可以移動你的資料來源名稱到那裡, 只要在按確定鈕之前點選一下新位置.
- 1.7 請問有沒有 PHP 的討論郵件清單 (mailing list) ?
- 當然! 若想要訂閱, 請寄信到
php3-subscribe@lists.php.net. 你不用在郵件標題或郵件正文中填寫其他資訊.若想取消訂閱, 則請寄到
php3-unsubscribe@lists.php.net.
- 1.8 幫幫我啊! 我好像沒辦法訂閱討論郵件清單 (mailing list) !
- 幫幫我啊! 我好像沒辦法取消訂閱討論郵件清單 (mailing list)!
- 如果你在訂閱或取消訂閱PHP討論郵件清單時發生問題, 可能是因為郵件處理系統無法辨識你所使用的電子郵件位址. 假設你的電子郵件位址是
joeblow@example.com, 你可以寄你的訂閱請求至php3-subscribe-joeblow=example.com@lists.php.net, 或你的取消訂閱請求至php3-unsubscribe-joeblow=example.com@lists.php.net.
- 1.9 請問有沒有個資料庫是收集各地的討論郵件清單 (mailing list)?
- 是的, 你可以在 支援 頁, 找到你所要的討論郵件清單列表.
- 1.10 你們是如何是做那些用來搜尋的彈出式視窗及鏡射站的按鈕?
- 我們的網站設計師, Colin Viebrock (cmv@privateworld.com), 表示:
那些花俏的彈出式圖層是使用 Dynamic HTML (DHTML), Cascading Style Sheets (CSS) 和 Javascript (version 1.2)所製作的.
在網路上有許多關於 DHTML 和 CSS的資源, 包括了有:
- CSS Level 1 Spec: www.w3.org/TR/REC-CSS1
- Macromedia's DHTML Zone: www.dhtmlzone.com/index.html
- Webreference's DHTML Lab: www.webreference.com/dhtml/
- Guide to Cascading Style Sheets: www.htmlhelp.com/reference/css/
- Dynamic Duo - Cross-Browser DHTML: www.dansteinman.com/dynduo/
- Netscape's Guide to JS 1.2: developer.netscape.com/docs/manuals/communicator/jsguide/js1_2.htm
但你的最佳資訊來源應是藉由查看網頁的原始碼. 想要看到實際的 DHTML/Javascript 原始碼, 請用你瀏覽器中的 "檢視原始碼" 功能. 想要了解本站的程式碼是如何用PHP來產生的, 請點選本站任何頁面右上方的"Source"按鈕. 你或許也想看看"shared.inc"這個檔案的內容, 在所有source頁面底下都有個連結可以讓你看到其內容.
- 1.11 請問我可以存取 Empress RDBMS 資料庫嗎?
- 是的. PHP 3.0.6 和 Empress RDBMS v8.10 及其更新版本之間是相容的.
在你使用 ODBC 及 Empress ODBC 驅動程式的 Windows 95/98/NT 平台上, 就有所有你需要的工具.
如果你在 Unix 跑 PHP, 且想要存取 Empress databases, 你可以直接連結 Empress ODBC 客戶端驅動程式(client driver) 到 PHP 的統一 ODBC API.
注意那並不是使 PHP 成為一個 ODBC 客戶端. 統一的 ODBC 介面(unified ODBC interface) 純粹是使用 ODBC API.因為 Empress 使用 PHP 的統一 ODBC 介面, 因此較不需要用到 Empress 自己的語法. 當然在其 SQL 敘述中也可以使用 Empress 自己的語法, 但這並不影響到介面. 這是個在任何時間都適用的一般性方法來存取標準的 ANSI SQL.
- Empress 細節: 在 PHP 中有兩個函式
odbc_connect ()與odbc_pconnect ()可具體指定 DNS 給 Empress .其連結語法如下:為了使 Empress dsn 可以被具體指定:
odbc_connect (dsn, user_id, password)odbc_pconnect (dsn, user_id, password)不論你選擇何種方式, 都各有其優缺點. 使用 完整連結字串 表示你不需要 ODBC.INI 這個檔案來存取資料庫. 而不管如何, 只要你移動資料來源或更改 RDBMS server 的 port, 你將需要改變所有呼叫的 odbc_connect/pconnect 函式.
- 資料原始名稱(Data source name)
- 這是在 ODBC.INI 檔案中定義的邏輯資料庫名稱.
- 完整連結字串(A full connection string), 作為標準 ODBC 定義.
- 例如
dsn="DATABASE=db_name;SERVER=server_name;PORT=server_port"注意這個字串有其它選項. 但這裡提出的三個是和 PHP 一起使用時最重要的.
由你自己選擇吧...
- Empress 的安裝: 要在 PHP 中增加 Empress 介面, 你需要有Empress Connectivit 的 Empress RDBMS. 如果你 PHP 和 RDBMS 是安裝在同一平台上, 可以設定 EMPRESS_PATH 至安裝目錄, 並會自動指向 Empress ODBC 客戶端驅動程式. 無論如何, 如果 PHP 和 RDBMS 不是安裝在同一平台上,在該平台你也將需要一個 ODBC 客戶端, 而且當你設定 PHP 安裝時, 將需要指定驅動程式所在的位置.
2.
取得PHP從哪裡可以取得PHP?
- 2.1
你可以從任何一個PHP網站成員下載PHP. 你可以從 http://www.php.net/ 找到這些成員. 你也可以使用 anonymous CVS 來獲得最新版本的原始檔. 若想獲得更多的資, 請至 http://cvs.php.net. 2.2 我還可以取得舊版的PHP可執行版本嗎? 可以, 雖然它們都已經過期了. Windows的可執行檔通常都是最新的版本, 但是舊的Unix可執行版本只有某些平台的才有. 您可以從 這裡 下載它們. 2.3 若我想加入一些選擇性的PHP延伸功能,從哪裡可以得到這些函式庫?
- 注意: 標有星號 * 的並不是安全的執行緒函式庫, 不要使用在多執行緒的 Windows web 伺服器上(IIS, Netscape). Unix平台則無影響.
- LDAP (unix): ftp://ftp.openldap.org/pub/openldap/openldap-stable.tgz
- LDAP* (unix): ftp://terminator.rs.itd.umich.edu/ldap/ldap-3.3.tar.Z
- LDAP (unix/win): Netscape Directory (LDAP) SDK 1.1 There is also a free LDAP server at: ftp://ftp.critical-angle.com/pub/cai/slapd/.
- Berkeley DB2 (Unix/Win): http://www.sleepycat.com/
- SNMP* (Unix): http://www.ece.ucdavis.edu/ucd-snmp/ (Note: PHP uses the native SNMP interface in Windows.)
- GD* (Unix/Win): http://www.boutell.com/gd/#buildgd
- mSQL* (Unix): http://www.hughes.com.au/
- mSQL* (Win) : MSQL PC Home Page
- MySQL (Unix): http://www.mysql.com/
- IMAP* (Win/Unix): ftp://ftp.cac.washington.edu/imap/old/imap-4.5.tar.Z
- Sybase-CT* (Linux, libc5): Available locally
- FreeType (libttf): http://www.freetype.org/
- ZLib (Unix/Win32): http://www.cdrom.com/pub/infozip/zlib/
- expat XML parser (Unix/Win32): http://www.jclark.com/xml/expat.html
- PDFLib: http://www.pdflib.com
- mcrypt: ftp://argeas.cs-net.gr/pub/unix/mcrypt/
- mhash: http://sasweb.de/mhash/
- t1lib: http://www.neuroinformatik.ruhr-uni-bochum.de/ini/PEOPLE/rmz/t1lib/t1lib.html
- dmalloc: http://www.dmalloc.com/
- aspell: http://download.sourceforge.net/aspell/aspell-.29.1.tar.gz
- Readline: ftp://prep.ai.mit.edu/pub/gnu/readline/
- 2.4
如何讓這些函式庫產生作用?- 你應該要依照函式庫廠商所提供的步驟來安裝它們. 當你執行PHP的 'configure'時, 一些函式庫可以自動偵測到 (像GD函式庫), 而其它的, 則需要在執行 'configure' 時附加參數 '--with-EXTENSION' . 執行 'configure --help' 可以獲得更多的資訊.
- 2.5 我使用Windows 95/NT,並從CVS repository取得最新版本的PHP原始碼, 我還需要什麼東西來編譯它?
- 首先, 你會需要用到 Microsoft Visual C++ 6.0以上的版本 (5.0 也可以, 但我們是用6.0做的), 而且你會需要下載支援檔案.把這個檔案解壓縮到PHP原始檔的 win32 子目錄內(內含有子目錄,所以請確定您的解壓縮程式能支援) .
2.6 我從哪裡可以找到瀏覽器的辨識檔?
- 你可以從 http://php.netvision.net.il/browscap/ 取得PHP專用的 browscap.ini . 或是 http://www.cyscape.com/asp/browscap/ 也可以.
3. 安裝
要安裝 PHP, 只要按照 INSTALL 這個檔案中所下的指令. Windows 95 和 NT 的使用者也可以參照 README.WIN32 這個檔案. 另外在 這裡 也有一些對於 Windows 的使用者有用的一些提示。
如果你想要在 UNIX 的 Netscape Web Server上安裝 PHP 可以到: http://www.webgenx.com/php/phpnes.php3 我安裝後的 php3.ini 這個檔案會放到那裡?
在 UNIX 中的預設位置是在 /usr/local/lib. 大部份的使用者可以在編譯時使用 --with-config-file-path 來改變他的位置。比如說,你可以設定如下: --with-config-file-path=/etc然後你可以從解開的檔案中找到 php3.ini-dist ,並且把這個檔複製到 /etc/php3.ini 並且根據你的需要來修改.3.2 我使用 RPMS 來安裝 PHP, 但是 Apache 並不能處理 PHP ! 這到底是怎麼一回事?
- 假設你已使用 RPMS 完整地在 Apache 上安裝 PHP, 你需要在你的 http.conf 檔中加入下列幾行。
# Extra Modules
AddModule mod_php.c
AddModule mod_php3.c
AddModule mod_perl.c
# Extra Modules
LoadModule php_module modules/mod_php.so
LoadModule php3_module modules/libphp3.so
LoadModule perl_module modules/libperl.so
- 並增加:
AddType application/x-httpd-php3 .php3
到 global properties, 或到你想要加入 PHP 支援的 VirtualDomain 中的 properties。
3.3 我使用 RPMS 來安裝 PHP, 但是不能和我所需的資料厙一起編譯!這到底是怎麼一回事? 根據現行 PHP 建立的方式, 要去建立一個有完全彈性的 PHP RPM 是不容易的。這個問題在 PHP4 中會被提出。對 PHP 而言, 我們建議使用在 INSTALL.REDHAT 中所提到的方式。 如果你堅持使用 RPM 的 PHP,現行 RPM packagers 設定的 RPMS 為了精簡安裝過程,所以並沒有包含資料厙。 而且因為 RPMS 使用 /usr/ 來取代標準的 /usr/local/ 檔案目錄。 你必須告訴 RPM spec file 要支援那種資料厙和你資料厙伺服器 top-level 的位置。以下這個範例是解釋在 Apache 使用 mod installation 的方式加入廣為使用的 MySQL 伺服器的過程。
當然這些所有的資料可以因任何 PHP 所支援的資料厙來作不同的調整。我們建議你也參考範例中使用 RPMS 來完整地安裝 MySQL 和 Apache。
- 首先移除 mod_php3
rpm -e mod_php3
- 然後取得 source rpm 並安裝,千萬不要 --rebuild
rpm -Uvh mod_php3-3.0.5-2.src.rpm
- 再來,編輯 /usr/src/redhat/SPECS/mod_php3.spec 這個檔案
在 %build section 加入你所要支援的資料厙,和路徑。
以 MySQL 為例,你必須加入--with-mysql=/usr \
而 %build section 將會出現的內容如下
./configure --prefix=/usr \
--with-apxs=/usr/sbin/apxs \
--with-config-file-path=/usr/lib \
--enable-debug=no \
--enable-safe-mode \
--with-exec-dir=/usr/bin \
--with-mysql=/usr \
--with-system-regex
- 一旦修改完成,以下列方式重建 binary rpm
rpm -bb /usr/src/redhat/SPECS/mod_php3.spec
確定重新啟動 Apache,然後你現在就有了 PHP 和 MySQL 的支援。注意,根據在 INSTALL.REDHAT 中的指令來建立可能容易多了。
- 然後安裝 rpm
rpm -ivh /usr/src/redhat/RPMS/i386/mod_php3-3.0.5-2.i386.rpm
4. 安裝設定的問題
我以暱名CVS服務管道( anonymous CVS service)取得最新版本的PHP, 但發現裡面沒有組態設定檔案(configure script) !
- 4.1
你必須先安裝GNU autoconf套件以便可以利用 configure.in 產生組態設定檔案. 只要在從CVS伺服器取回的原始程式的最上層目錄(top-level directory)執行 make -f build.mk就行了.(另外, 除非你是以--enable-maintainer-mode選項來執行編譯, 否則組態設定檔 將不會自動重建, 除非 configure.in 有被更新過, 所以當你發覺該檔案有更新過時, 你必須要手動去完成這動作. 發覺這現象的其中一症狀或方式就是在進行設定組態 (configure)後, 找找看 Makefile 或 config.status 中類似 @VARIABLE@ 的字串.)4.2 我已經指定了正確的路徑位置, 但還是無法設定 PHP以結合Apache, 它會顯示無法找到 httpd.h , 檔案明明就在所指定的路徑中!你需要提供 configure/setup 檔案有關 Apache原始檔的最上層目錄路徑, 也意味著你要指定' --with-apache=/path/to/apache' 而非 '--with-apache=/path/to/apache/src'.4.3 當我執行 configure 時, 它回應無法找到 include 檔案或 GD library, gdbm, 或其他的套件(package) !你可以讓組態設定檔去找位於非標準或一般路徑中的header檔或一些函式庫檔案, 只要指定一旗標給 C的前置處理器(preprocessor)及連結器(linker), 即: CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure如果你是使用變種csh shell (csh-variant shell)則:env CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure4.4 在編譯 language-parser.tab.c 時會顯示 'yytname undeclared'.你必須更新你的Bison版本. 你可以在 ftp://prep.ai.mit.edu/pub/gnu/找到最新版本. 4.5 執行 'make' 時, 起初是很順利的, 但會在連結(link) 一些應用程式時出現無法找到某些檔案的訊息.有些舊版的make會將編譯檔案放進錯誤的目錄路徑中 (不在functions目錄), 請執行" cp *.o functions" 然後重新 'make'看看是否奏效. 如果還是不行, 那就請更新到近版的GNU make吧!4.6 在連結(linking) PHP時會出現一些無定義的引數 (undefined references)的錯誤訊息.請檢查一下 link 的那行看看是否所有的函式庫都已在最後被宣告了. 最常遇到 的很可能是沒有 '-ldl'或忘了include所要用到的函式庫. 如果你是用PHP結合 Apache 1.2.x, 你是否記得在Configuration檔中的EXTRA_LIBS行 加上確切的資訊, 並重新執行Apache的組態設定檔(Configure script)?? 欲知所有安裝檔案的詳細資訊請參考 INSTALL.
有使用者也曾反映過他們在連結(linking)Apache時一定要在'libphp3.a'之後加上'-ldl' 才行, 而且是緊接著其後.
4.7 我搞不懂如可使 PHP 融入 Apache 1.3 之中.這其實很簡單. 請仔細按照以下步驟進行:
注意: 你也可以使用新的 Apache ./configure設定檔. 詳細的指示請參考Apache原始檔中的 README.configure檔案. 另外, 也請看看PHP中的INSTALL檔案.
- 取得最近版的Apache 1.3 www.apache.org.
- 在某目錄下解壓縮, 比如說在 /usr/local/src/apache-1.3.
- 先編譯PHP ./configure --with-apache=/<path>/apache-1.3 (請以你確實的Apache-1.3 目錄來取代 <path>)
- 執行 'make'然後再'make install'以產生PHP並將Apache所需要的檔案複製到 Apache 的原始檔目錄之中.
- 變更 /<path>/apache-1.3/src 路徑並編輯 Configuration 檔案, 在檔案結尾處加上: AddModule modules/php3/libphp3.a.
- 執行: './Configure' 及 'make'.
- 現在你己有 PHP-enabled httpd binary檔案了.
4.8 我已經按照所有的安裝程序來安裝UNIX平台上的Apache PHP模組(module version), 但PHP程式碼還是會在瀏覽器上被顯示出來或會出現存檔提示, 請幫幫我吧!這意味著PHP模組因某種因素而沒有發生作用. 在做進一步詢問前你必須先檢查三這件事:
- 請確定你所用的httpd可執行檔是你剛產生的, 你可以用 /path/to/binary/httpd -l
來檢查看看是否該檔有無包含 mod_php3.c. 若否, 則你執行了錯的httpd. 請重新執行有包含PHP的那個吧!- 請確定你已在Apache .conf檔中加了正確的MIME格式. 格式應該是這樣的: AddType application/x-httpd-php3 .php3
而且請注意這行並不是加在 <Virtualhost> 或 <Directory> 區塊之中的.- 最後, Apache 1.2 及 1.3 組態檔在預設位罝上已有所差異.所以請確定你加的該行 格式設定是加到有被Apache讀取的設定檔而非無作用的設定檔. 要確定某個 httpd.conf是不是真的有作用(有被Apache讀取), 你可以加上很明顯的錯誤語法, 這樣在執行時它會向你發出警告的便是有被讀取的檔案了.
4.9 舉例說: --activate-module=src/modules/php3/libphp3.a, 但該檔案並不存在, 所以我把它換成 --activate-module=src/modules/php3/libmodphp3.a 還是沒作用, 請問這是什麼回事?這... 你是否想打敗那些幫你設計好一步一腳印的安裝程序的人? 但事實上真的是被你給打敗了! 你這是在自作聰明. 因為libphp3.a是不應該出現的, 而是由Apache的編譯過桯中所產生的檔案. 4.10 當我用 --activate-module=src/modules/php3/libphp3.a 把PHP設定成Apache靜態模組(static module)時, 它會告訴我說所使用的編譯器(compiler) 為非ANSI相容(ANSI compliant).這是有問題的錯誤訊息並且己在 Apache-1.3.10 中解決了. 你也可以編輯 src/Configure 並在大約 2140 行左右你可以找到像這樣的語法: if ./helpers/TestCompile sanity; then把它變成:if ./helpers/TestCompile -v sanity; then並重新configure Apache.這時就會顯示你的真正錯誤原因到底出在哪兒了. 一般都是因為找不到正確的函式庫所致.4.11當我使用--with-apxs選項來安裝PHP時會得到一些奇怪的錯誤訊息. 有兩件事是要檢查的. 首先, 由於某些因素, 當Apache產生 apxs Perl script時, 都會不正確的 編譯器或旗標變數來結尾.編輯你的 apxs (一般可以在 /usr/local/apache/bin/apxs 或 /usr/sbin/apxs中找到)並檢查這些行: my $CFG_CFLAGS_SHLIB = ' '; # substituted via Makefile.tmpl my $CFG_LD_SHLIB = ' '; # substituted via Makefile.tmpl my $CFG_LDFLAGS_SHLIB = ' '; # substituted via Makefile.tmpl如果這是和你所看到的一樣, 恭喜你找已到問題了. 只要把這些改成:my $CFG_CFLAGS_SHLIB = '-fpic -DSHARED_MODULE'; # substituted via Makefile.tmpl my $CFG_LD_SHLIB = 'gcc'; # substituted via Makefile.tmpl my $CFG_LDFLAGS_SHLIB = q(-shared);# substituted via Makefile.tmpl第二個可能的問題只會發生在RedHat-6.1. 因為RedHat的 apxs script已有問題. 請找:my $CFG_LIBEXECDIR = 'modules'; # substituted via APACI install如有發現請更之為:my $CFG_LIBEXECDIR = '/usr/lib/apache'; # substituted via APACI install
5. 使用 PHP
- 5.1我想要寫個 PHP script 來處理來自任何形式的資料,我要怎麼知道哪一種 POST 方法可以使用?
- 請確定在您的 php3.ini 檔案中 track_vars 這個參數開啟成 ON。如果您在編譯 PHP 時有加 "--enable-track-vars" 這個參數,那麼 track_vars 的預設值便會是 ON。 你可以在你的每個 PHP script 中的檔頭加上 <?php_track_vars?>, 當 track_vars 參數為 ON,會產生三個陣列。$HTTP_GET_VARS,$HTTP_POST_VARS, 和 $HTTP_COOKIE_VARS。所以,寫一個 PHP script 來處理來自任何形式的資料,你需要一些類似 這樣的寫法:
while (list($var, $value) = each($HTTP_POST_VARS)) { echo "$var = $value<br>\n"; }
- 5.2我需要轉換單引號(')至單引號加上反斜線('\) 我要如何正常的顯示?
- 首先,參考一下 addslashes() 函數。它將精確地做你想要做的。也許你可以參考一下 php3.ini 檔案中的 magic_quotes_gpc 參數。
無論如何,你可以找找 ereg_replace 函數,它很簡單像這樣:
$escaped = ereg_replace("'", "\\'", $input);
- 5.3 當我這樣寫的時候,它會顯示這是錯的指令:
function myfunc($argument) { echo $argument + 10; } $variable = 10; echo "myfunc($variable) = " . myfunc($variable);怎麼回事呢?
- 為了能夠使你的函式結果能夠顯現出來(如同上例中串聯其他字串一樣),您 必須使用 return,而不是 echo。
- 5.4 我的換行發生了什麼事了:
<PRE> 1 <?echo $result[1];?> 2 <?echo $result[2];?>- 在 PHP 裡,一個段落結尾碼不是 "?>" 就是 "?>\n" (在這 \n 表示換行)。 在上面的例子中,表示在每一段落的 PHP 碼之後您必須插入額外的換行符號(\n)。
為什麼 php 這麼做呢? 因為在格式化一般 HTML 文件時,這樣會更簡單。因為你不 想要換行,但是必須要寫很長在同一行中,或用別的方法不換行。不換行的影響會使 網頁原始碼不能讀取。
- 5.5我要直接存取 header 的資訊,我要怎麼做?
- 如果你使用 php 的模組,getallheaders() 函式可以做到。你只要加一點程式碼就可以 顯示所有 header 資訊:
$headers = getallheaders(); for(reset($headers); $key = key($headers); next($headers)) { echo "headers[$key] = ".$headers[$key]."<br>\n"; }
- 5.6當我試著用 IIS 的認證,我得到訊息'No Input file specified'。
- IIS 的安全模組在這裡有問題。這是一個 IIS 上 CGI 程式的共同問題。 解決方法是建立一個簡單的 HTML 檔(不是使用 php)於認證的目錄裡面。 然後使用 META 標籤改寫到 PHP 網頁,或者做連結到 PHP 網頁。PHP 會將它們正確的辨別。 當 ISAPI 模組可用,將不再是問題了。這不會影響其他 NT web 伺服器。更多的資訊請參考 http://support.microsoft.com/support/kb/articles/q160/4/22.asp.
- 5.7 我照所有方法做了,還是沒辦法讓 PHP 和 IIS 一起使用!
- 確定每個使用者有執行 php.exe 的權限。當 IIS 安裝的時候,IIS 使用 anonymous, 這個使用者需要有執行 php.exe 的權限。也許每個認證過的使用者都需要有執行 php.exe 的權限。 對 IIS4 來說,你需要告訴它支援 PHP script。
- 5.8我的 PHP script 可以在 IE 及 Lynx 顯示,但是在 Netscape 上有些 顯示不見了!當我做 "View Source",我在 IE 上看得到但不能在 Netscape 看到。 但是我直接 telnet 到 port 80,還是可以正確顯示出來。這怎麼一回事? PHP 是個伺服器端,我的瀏覽器卻不能讀取 PHP 產生的網頁,怎麼回事呢?
- 非常好的問題! ;) 這是問題有點爭議,過去的兩個月中已經來過兩次這個問題。 這兩次結束時我花了 20 分鐘試著去想到底是怎麼一回事。答案就是 IE 和 Lynx 忽視 HTML 中的任何 NULs (\0)。但 Netscape 則不。最好的方法是檢查編譯時 PHP 的版本, (同樣知道 CGI 版本),以及從指令行測試你的 script 及使用 'od -c' 和找到任何 \0 字元。 (如果你使用 Windows 你需要用編輯器或其他工具可以編輯二進位的檔案)當 Netscape 遇到 檔案中 NUL 部分,在文件中它將不輸出那行上的任何事情。但那一行 IE 和 Lynx 將會輸出。 如果你也發生了!恭喜!你並不孤獨。
- 5.9我要怎麼得到多選擇式的 HTML 項目內容?(SELECT MULTIPLE HTML tag)
- 多選擇式在 HTML 架構中允許使用者從清單中選擇多種項目。這些項目將會傳給處理端。問題是 它們全部傳同樣的名字。例如:
<SELECT NAME="var" MULTIPLE>每一個被選擇的選項將傳到處理端成:var=option1 var=option2 var=option3每一個選項將覆寫以前的 $var 變數。解決方式為使用 PHP 的非索引性陣列(non-indexed array) 接下來應該這麼使用:<SELECT NAME="var[]" MULTIPLE>這是告訴 PHP 把 var 看做陣列,每一個項目名稱 var[] 加入到陣列裡。第一個項目是 $var[0] 接著是 $var[1],等等。count()函數可以用來算出多少個選項被選擇。如有必要可以用 sort() 函數來 排列選項。附註,如果你使用 JavaScript,當你試著取得元件命名的名稱,元件名稱使用 [] 命名可能會造 成你的問題。最好用數字來取代元件名稱,或用單引號圍住變數。使用元件陣列來索引,如:
variable = documents.forms[0].elements['var[]'];
- 5.10我要如何讓 XML 及 PHP 共同使用?它不相容我的 <?xml> 標籤。
- 你必須把 short tags 關掉,就是在 php3.ini 檔案中把 short_tags 設定成 0。或者使用 Apache 指令 php3_short_tags。(你也可以選擇性地使用 <File> )。你也可以用 short_tags() 關掉及重新開啟 short tags。
- 5.11我要如何讓 PHP 和 FrontPage 或 Dreamweaver 一起使用,或者有其他 HTML 編輯器?因為它一直更變我的程式碼。
- 一個簡單的方法是將 ASP 標籤開啟。這樣可以允許您使用像 ASP 的 <% 及 %> 定義碼。現在許多 受歡迎的 HTML 編輯器可以聰明地處理。要讓 ASP 定義碼可以使用,你必須在 php3.ini 中把 asp_tags 變數設定成可用(即 php3.ini 中參數 asp_tags = on),或使用 Apache 的 php3_asp_tags 指令。
- 5.12我在哪裡可以讓找到每個可以設定的變數列表,為什麼這些不是 PHP 的文件?
- 最好的方法為在網頁寫 <? phpinfo() ?> ,並讀取這個網頁。這將顯示給你排序過的關於 PHP 設定 資料,包括了伺服器中環境變數的列表及特殊變數的設定。這個列表沒有辦法被寫到 PHP 文件說明中, 因為這個列表會因不同的伺服器而改變。
- 5.13為什麼我總是得到類似這種錯誤:
Warning: 0 is not a MySQL result index in file on line 8
我做錯了什麼?- 你想使用結果為 0 值。0 表示你的查詢因一些原因而失敗。在送出查詢後或使用傳回結果之前,你需要檢查 一下錯誤!適當的作法,像這樣:
$result = mysql_query("select * from tables_priv"); if(!$result) { echo mysql_error(); exit; }或者這樣:$result = mysql_query("select * from tables_priv") or die("Bad query: ".mysql_error());
- 5.14我試著使用 <INPUT TYPE="image"> 標籤,但是 $foo.x 和 $foo.y 變數卻不能使用,它們跑到哪去了?
- 當送出 form 時,它很可能使用一個圖檔取代標準的送出按鈕,像:
<INPUT TYPE="image" SRC="image.gif" NAME="foo">當使用者在圖上按下滑鼠,隨著 form 將被送到伺服器上且產生兩個變數:foo.x 及 foo.y。因為 $foo.x 及 $foo.y 在 PHP 中命名是無效的,它們會自動被改變成 $foo_x 和 $foo_y。點(.)被底線(_)取代了。
6. New Features
6. 新功能特色
我發現PHP提供了永久性的資料庫連結 (persistent database connection), 請問那是什麼?
- 6.1
- 永久連結即是在程式檔結執行完畢後也不會關閉的SQL連結. 當有一永久連結 發出時, PHP會檢查是否已有相同的永久連結(也就是之前已被建立的), 如有存在, 則繼續使用. 否則再建立一連結. 所謂相同的連結即有提供或指定同樣的主機, 使用者及密碼的資訊者.
對於還不是很了解web伺服器如何操作及分散負荷的人可能會誤解永久連結的真義. 實質上它並不會讓你在同一SQL連結上產生一"user sessions", 更不會 提供你有效的交易功能(transaction), 它並不會像想像中的做了那麼多件事情. 事實上, 很明確的說就是永久連結並不提供任何在非永久連結中所無法達成的功能.
為何如此?
這是因為web伺服器的本質問題. Web伺服器可使用三種方式來讓PHP產生網頁.
第一種方法是以CGI "wrapper"的方式使用PHP. 使用這種方式時一即時PHP直譯器會被啟動並在每頁執行結束後關畢. 由於每次結束時關畢後會切斷或釋放所有的SQL連結及所佔用的資源. 在這種情況下你將不會從永久連結中得到任何好處, 因為它是非永久性的.
第二種方式, 也是最常用的, 就是以PHP模組並以多程序(multiprocess) 的web伺服器中執行(目錄只限Apache). 一多程序伺服器一般會有一主程序並產生一堆 子程序, 也就是真正處理網頁存取服務工作的程序. 每當一客戶端發出一要求時都會傳 給其中一閒置中的子程序. 這意味著當同一客戶端發出第二個要求時, 它有可能是被另 一子程序所服務. 一永久連結在這裡所扮演的角色就是在每一個子程序中都用第一次所 發出的資料庫連結, 重新使用前子程序所建立並遺留下來的資料庫連結.
最後一種是以plug-in式multithreaded web伺服器. 目前這僅次於理論上的探討而已, PHP乃無法以plug-in multithreaded web伺服器上工作. 而在使PHP支援ISAPI, WSAPI, 及 NSAPI (Windows上)的努力一直在進行著, 也另PHP可在Netscape FastTrack, Microsoft's Internet Information Server (IIS), 和 O'Reilly's WebSite Pro上執行. 當這實現時, 則情況就與上述的多程序 模組一樣.
如果永久連結沒有任何附加的功能, 那它有什麼好處?
答案很簡單 -- 效率. 永久連結對於過高或頻繁的SQL連結是有好處的. 不過連結資料庫的成本高低其實也是基於各種不同的因素的. 比如, 用何種 資料庫系統, 或是否資料庫與web伺服器是否同在一台主機上, 資料庫主機的負載 如何等等. 基本的想法就是如果有很多的連結次數則可考慮使用永久連結. 子程序只會發出一次的連結要求, 而非每個子程序都在處理每頁時各發出一次資料庫 連結要求. 舉個例子, 如有20個不同的子程序在處理同一個程式並連結到同樣的資料庫時, 你將會有20個不同的資料庫連結. 這是種資源浪費.
重要的總結: 永久連結是為一對一的一般資料庫連結而設計的. 就是你可以任意 把永久連結換成非永久連結, 這將不會影響程式的運作特性, 而可能 會影響一程式的效率, 而非其特性(behavior)!
7.
常見問題我安裝了 PHP,但是我每次讀取一個文件,就得到訊息 'Document Contains No Data'!怎麼了?
- 7.1
這很可能表示 PHP 有一些排序的問題及核心錯誤。看看你的伺服器中錯誤紀錄檔(error log), 及把這種錯誤程式碼寫在小程式中再試試看。如果你知道怎麼使用 'gdb',它對你提供找到的問題,報告給 程式開發者非常有幫助。如果你使用 Apache 的 PHP 模組,試著這樣做:
- 停止你的 httpd 程序
- gdb httpd
- > run -X -f /path/to/httpd.conf
- 然後開瀏覽器到這個造成錯誤的網址。
- 如果核心錯誤,gdb 會告知你,請打 bt
- 然後請把這個結果寄到 php-dev@lists.php.net
如果你的程式使用者用能規則表示的 function,(像
ereg()和其他類似的 function) 你必須確定你編譯好的 PHP 及 Apache 用相同能規則地表示的程式。(這應該會自然發生在 PHP 及 Apache 1.3.x)
7.2我在一個使用者定義的 function 中試著存取一個 CGI 標準變數 (像 $DOCUMENT_ROOT 或 $HTTP_REFERER),但變數卻無法變數,怎麼了? 環境變數現在是全域變數了。所以現在無論在你的 function 中宣告為全域變數 (例如使用 " global $DOCUMENT_ROOT;")或使用全域變數陣列 (如 "$GLOBALS["DOCUMENT_ROOT"]")都可以了。
7.3 我用 FrontPage extensions 更新檔更新了 Apache,PHP 竟停止運作 了!是因為 PHP 不相容於 FrontPage extensions 嗎? 不是的,PHP 可以在 FrontPage extensions 中相容得很好。這個問題是 FrontPage 更新檔 修改了一些 Apache 中支援 PHP 的某些程式。請在 FP 更新後重新編譯 PHP(使用 'make clean ; make')就可以解決這個問題了。
7.4 我想我發現 bug 了!我該告訴誰? 你可以到 PHP Bug 資料庫並且確定這不是已經知道的 Bug。如果你在資料庫中 沒有看到這個 Bug,請您說明這個 Bug。使用 bug 資料庫代替是很重要的, 請寄一封信給在郵件名單中的一個人。因為這個 Bug 將會被分配一個追蹤編號以 及那時有可能你會寫信來查驗這個 Bug 的狀態。這個資料庫可以在這裡找到: http://bugs.php.net.
8. Migrating from PHP2 to PHP3
- 8.1 When I add two strings together and then echo it, it echoes zero instead of the concatenation of the two strings! What's going on? Wouldn't it be great if adding two strings just concatenated them together?
- PHP3 does not support the overloading of the addition operator for strings because values that arrive via the GET and POST methods and from databases are always stored as strings. This means that if the plus operator were overloaded to concatenate strings, you could add what you thought were two numbers and get the wrong result! (For example, "4" + "5" would be equal to "45".) One way around this would be to explicitly type-cast one or both of the operands, which is what PHP/FI 2 did.
This has been simplified in PHP3 by the addition of a real string concatenation operator. If you want to "add" two strings together, just write it like:
"this" . "that"which will result in the string "thisthat".The answer to the final part of the question is an emphatic no. Operator overloading can be a source of great confusion, especially when variables aren't very strongly typed to begin with, as they are in PHP3.
- 8.2 When I use the chmod(), umask(), or mkdir() functions, the permissions are wrong!
- Unlike PHP/FI 2, PHP3 does not interpret the numeric arguments for these functions any differently than for any other function, which means you need to pass in an octal value if you are specifying an octal number, such as:
chmod($myfile, 0600);notchmod($myfile, 600);- 8.3 I converted my script from PHP/FI 2.0 to PHP3 syntax, but now it just hangs! When I looked at the processes running on my server, there was one process that was chewing up all of the CPU cycles!
- You probably missed the semi-colon on a
while (condition);statement. This will cause PHP3 to spin out of control because it is simply executing an empty body for your while loop! Change the semi-colon to a colon and it should work correctly.- 8.4 My user-functions don't work any more! I get a "Parse error (expecting '('" on the first line of the function.
- PHP3's function declaration now resembles C function declarations, so your function should look like:
function printsum($a, $b) { echo $a + $b; }You can also use old-style function declarations by use the 'old_function' designation, like so:
old_function printsum $a, $b ( echo $a + $b; );- 8.5 What happened to the securevar() function that was in PHP2? How can I make sure that a GET-method variable does not overwrite a POST-method one?
- The securevar() function in PHP2 was a badly named function. It gave the impression that when used the POST-method was secure. It is not. It is only slightly more difficult to fake POST-method variables than GET-method ones.
There are a couple of ways to achieve similar things in PHP3. The most straightforward way is to do it manually by using the $HTTP_POST_VARS array. See FAQ question 5.1 for instructions on how to enable it. To make sure that $foo, for example, comes from the POST data and nowhere else you would do:
$foo = $HTTP_POST_VARS["foo"];A second way to do this is to change the gpc_order setting in your php3.ini file. The default setting is "GPC" which means that GET variables are parsed first followed by POST variables and lastly by COOKIE variables. This means that GET vars are overwritten by POST vars which are in turn overwritten by COOKIE vars. So, by default if you have the same variables in your GET and POST data the POST one will be the one that shows up in the main PHP symbol table and you would have to use the $HTTP_GET_VARS to get at it. Along with changing the order from "GPC" to something like "CGP" which would make POST variables have the highest priority, you can leave out any of the letters to completely disable PHP's ability to see a certain type of variable. If you never wanted GET-method data to be turned into PHP variables you could use a gpc_order setting of "PC".
Credits
This FAQ was originally written by Jim Winstead. It is currently maintained by the PHP Development Team.