【1】頁面之間無法傳遞變量 get,post,session在最新的php版本中自動全局變量是關閉的,所以要從上一頁面取得提交過來得變量要使用$_GET['foo'],$ _POST['foo'],$_SESSION['foo']來得到。當然也可以修改自動全局變量為開(php.ini改為 register_globals = On);考慮到兼容性,還是強迫自己熟悉新的寫法比較好。
: w: C# n" |: U- L/ {1 H w
- \ z2 d% P& p8 p: e0 W$ x【2】Win32下apache2 用get方法傳遞中文參數會出錯:
/ _( W. w- ~ X+ A( D7 ]
2 A/ E) `, ?# O9 `1 m, ctest.php?a=你好&b=你也好8 \: ~* ]$ b- f. _3 t- d% D
- V2 M/ a) F+ l4 c
傳遞參數是會導致一個內部錯誤
9 G! K. I8 q1 ?2 a/ x
1 y/ I6 A! U6 s8 j& ^0 ]: r" T解決辦法:"test.php?a=".urlencode(你好)."&b=".urlencode(你也好)# i6 F& w$ z4 Y" x. m/ x
) a ]5 C3 k. Q3 D, o.............
& t2 `4 u9 @9 k! I: O1 g Z1 p' ] p: l; |
【3】win32下的session不能正常工作
7 x* d1 p0 N: L8 u) o2 ^$ O
3 |0 m, Z% h- D; Y! ]* h jphp.ini默認的session.save_path = /tmp
( r2 _# e8 Y7 A0 E: d W' B5 T* Y: c, b6 {# q: A8 w
這顯然是linux下的配置,win32下php無法讀寫session文件導致session無法使用,把它改成一個絕對路徑就可以了,例如session.save_path = c:windows emp& _/ H2 z' H' a* _ F
0 M' v0 O( x+ `+ c$ I4 x
【4】顯示錯誤信息
: {3 R2 l* x0 K# L1 i5 V) ^$ j! ^, s1 v# R- S6 X) d/ D& V
當php.ini的display_errors = On並且error_reporting = E_ALL時,將顯示所有的錯誤和提示,調試的時候最好打開以便糾錯,如果你用以前php寫法錯誤信息多半是關於未定義變量的。變量在賦值以前調用會有提示,解決辦法是探測或者屏蔽。7 H2 U1 ?3 L" R' M( z/ j
0 O$ Q3 N4 |' j
例如顯示$foo,可以if(isset($foo)) echo $foo 或者echo @$foo
8 r8 |& h3 X" P2 N
# \7 H6 t0 C9 g1 }, ]【5】Win32下mail()不能發送電子郵件
8 n' X) d: Y& @! T) L/ l4 u
! t Q7 W& R# x在linux下配置好的sendmail可以發送,在win32下需要調用smtp服務器來發送電子郵件,修改php.ini的SMTP = ip //ip是不帶驗證功能的smtp服務器(網上很難找到)6 G0 E7 t7 f5 L' x
) l* t3 c, t- e& m4 z7 F$ b& ]* Cphp發送郵件的最好解決方法是用socket直接發送到對方email服務器而不用轉發服務器。% }' {9 \8 E4 j% T' c
. P* p4 a9 v8 O3 }& h【6】初裝的mysql如果沒有設置密碼,應該使用update mysql.user set password="yourpassword" where user="root" 修改密碼: I; o: d& c) X# W" ~
: P5 d0 a! i3 u. x+ p【7】header already sent' [" I6 P$ e% m: `' D t
( V8 t; g6 ]7 u+ q
這個錯誤通常會在你使用HEADER的時候出現,他可能是幾種原因:1,你在使用HEADER前PRING或者ECHO了2.你當前文件前面有空行3.你可能INCLUDE了一個文件,該文件尾部有空行或者輸出也會出現這種錯誤。!
8 x: c4 j8 Y; G6 G' f6 s7 \' U! y3 E) x) A* r
【8】更改php.ini後沒有變化
4 o* _* o9 v/ K3 ^6 U; \2 K; ^0 k( s# i8 l S$ u% ?
重新啟動web server,比如IIS,Apache等等,然後才會應用最新的設置。
# f* r" V* y) N0 a; I5 x; M. C& o7 S+ ~5 T$ C" i
【9】php在2003上面安裝(ISAPI的安裝方法懇請高手指教)2 v* A$ j* L- c W/ w
& V* e' _3 j5 u. s3 @3 i7 C
PHP4的php4isapi.dll好像和2003有些衝突,只能用CGI模式安裝+ n! T9 I4 l5 O! | V/ h
/ `0 a& m% z0 }% s步驟一,先www.php.net 下在一個安裝程序,我是裝的是:php-4.2.3-installer.exe,你也可以去找最新的版本,在安裝php-4.2.3- installer.exe之前保證你的IIS6.0啟動了,並能夠訪問。安裝好以後,在默認網站-->應用程序配置。
t9 f, D6 f9 v3 z! c
+ g+ z" T; @* T" l步驟二:點擊 web服務擴展 -->新建web服務擴展。
9 ]' f5 t4 X& ]# A2 M) d- }1 s p; A( O
步驟三: 擴展名-->php,然後添加% N9 M6 c" [2 `$ y+ b! `$ b5 v
. V3 q- `, R% f; z
步驟四:找到php.exe的路徑添加上去。
" ^$ G) S8 ?8 h1 T- e( {; _! f0 `1 X5 Q% K
步驟五: 確定就可以了!
2 w2 j" F0 l# H' N2 O) w6 \6 l0 t( o) j r1 d8 h
步驟六: 選擇php的服務擴展,然後點擊允許。- u* ?* K% {& E3 Z. E( a
3 X: M, a7 I! A【10】有時候sql語句不起作用,對數據庫操作失敗,最簡便的調試方法,echo那句sql,看看變量的值能得到不。 L& Y7 ~4 `- s: Q" t: r* d% P
) d: d. h5 L- |; t; s! F
【11】include和require的區別
3 N! t% N# e) {* {, J, ~% p) {8 G" X W. \4 a# K0 C
兩者沒有太大的區別,如果要包含的文件不存在,include提示notice,然後繼續執行下面的語句,require提示致命錯誤並且退出。
$ d3 a+ k1 e' V f/ K2 [7 a
5 I* |+ |) T3 M; e9 x據我測試,win32平台下它們都是先包含後執行,所以被包含文件裡最好不要再有include或require語句,這樣會造成目錄混亂。或許*nux下情況不同,暫時還沒測試。
8 T! K) X. p$ w+ h7 V( l6 M
/ ~! ^$ U z: ?/ b2 W如果一個文件不想被包含多次可以使用include_once或require_once## 讀取,寫入文檔數據。# J/ U/ V* O4 \' t( [$ O
& t. a. e* l9 U' U2 t" `, c* O
PHP 代碼:% T ?! Q/ v. [3 a5 t1 _9 W
function r($file_name) {4 I2 V& M' A; {" @* n% _& O& w# _
$filenum=@fopen($file_name,"r");+ W- w3 x7 C* _% {
@flock($filenum,LOCK_SH);5 G \: Z( B% e/ w# k: G4 ?# A! o
$file_data=@fread($filenum,filesize($file_name));
9 _* j# [6 L- g6 `# x @fclose($filenum);& Z) @* U1 y U3 G
return $file_data;1 M& _7 P4 ?. }+ U3 ^9 T
}( t( c' Z% {( U8 Z* C
function w($file_name,$data,$method="w"){2 G' ^( U- w) D# V% m: s
$filenum=@fopen($file_name,$method);6 t7 Y* I" n% @/ ?, U$ U
flock($filenum,LOCK_EX);
- Q* d" Y- R3 L# D $file_data=fwrite($filenum,$data);1 x% |5 i% @8 u. e7 B4 X2 V/ `& g
fclose($filenum);
@, g8 c! b7 Y, Y return $file_data;& M$ z7 }% O: `4 I8 w0 `4 y
} : u& j* X( k) I0 B$ ]8 y6 h0 ~! v# y5 ]
7 S- t! B4 l3 g【12】isset()和empty()的區別* Q# t& ~( E% c5 R& o: H- l3 D/ ?
! D; b) X# `/ j
兩者都是測試變量用的,但是isset()是測試變量是否被賦值,而empty()是測試一個已經被賦值的變量是否為空。2 D0 g% K2 W0 a' {3 h( J
& |6 n, p; U$ q+ v) N如果一個變量沒被賦值就引用在php裡是被允許的,但會有notice提示,如果一個變量被賦空值,$foo=""或者$foo=0或者 $foo=false,那麼empty($foo)返回真,isset($foo)也返回真,就是說賦空值不會註銷一個變量。
* W2 }3 p, d8 H# {3 u- c# A; ~
: k6 L9 S S0 |要註銷一個變量,可以用 unset($foo)或者$foo=NULL R7 Z+ ^* {# }' i1 d: h
* R6 \! p" {6 i【13】mysql查詢語句包含有關鍵字/ ?, ^+ d. J& S, n* V9 f i3 ?
* e# k% a8 E" ?1 {
php查詢mysql的時候,有時候mysql表名或者列名會有關鍵字,這時候查詢會有錯誤。例如表名是order,查詢時候會出錯,簡單的辦法是sql語句裡表名或者列名加上`[tab鍵上面]來加以區別,例如select * from `order`
2 J5 E. Y1 V) E+ a w1 q5 o6 o
! F0 ?. o& L1 y* T9 W+ ?/ Z【14】通過HTTP協議一次上傳多個文件的方法: G4 f* I8 Y5 \7 a
8 U4 B! R1 x- g3 U+ y; @0 y1 _有兩個思路,是同一個方法的兩種實現。具體程序還需自己去設計。2 O7 i( i n# E9 `8 ?
. x! K3 q! B: N X1、在form中設置多個文件輸入框,用數組命名他們的名字,如下: v1 a) G+ V9 K
. ~6 V1 R; V; }1 E4 a. a* hPHP 代碼:$ |5 Y$ O! |$ e7 X+ E
<form action="" method=post>- L7 J% L0 F8 R) S
<input type=file name=usefile[]>) N- v* ]5 c: }% o9 N0 p" ~! O/ W
<input type=file name=usefile[]>4 ]/ S9 `0 @) |) ~3 P$ p7 f
<input type=file name=usefile[]>
& n: f6 M. w3 e N: Y! O</form> & V6 c. E. c" {/ f/ @
3 X' ?4 p# M, A! z
這樣,在服務器端做以下測試:
* n8 n: W3 N5 M" v+ b9 Z0 T) m+ P t& A
PHP 代碼:
, _: X. S8 A( o7 jecho "<pre>";' v* ~7 b- C7 G- G7 D* C
print_r($_FILES);) m; V5 T4 a8 f$ |( y1 t& R% ?
echo "</pre>"; 4 {5 O" g7 Z. [% E
% K1 S& B: _$ B* g+ G# Y2、在form中設置多個文件輸入框,但名字不同,如下:
7 c6 J0 K% M. q* G8 L. M6 I6 \
! R) C; j& F, d- `PHP 代碼:/ L0 [( H) I+ { p4 ]
<form action="" method=post>0 ?% t2 l3 {8 H7 i7 s8 V) g# D% `! x
<input type=file name=usefile_a>7 S1 d# a/ D5 G# F
<input type=file name=usefile_b>
2 v6 t# x( `! t+ Y/ e0 u! Y<input type=file name=usefile_c>
8 i! ]0 m+ D @! k v2 x }2 e</form> * q, Y7 V) D$ z2 K+ N, O
6 e2 T( a7 _+ c6 }; W, I% t
在服務器端做同樣測試:0 A/ B" J% J" z( l. ]" f8 Y
' F" [" w2 n2 G0 [PHP 代碼:
; Z+ F: w6 H0 x' J& Uecho "<pre>";
8 W8 |* n# Z4 S3 |* F" n; H9 Mprint_r($_FILES);
' Z# n. G4 L& \) {8 Q! j5 vecho "</pre>"; |
評分
-
查看全部評分
|