【1】頁面之間無法傳遞變量 get,post,session在最新的php版本中自動全局變量是關閉的,所以要從上一頁面取得提交過來得變量要使用$_GET['foo'],$ _POST['foo'],$_SESSION['foo']來得到。當然也可以修改自動全局變量為開(php.ini改為 register_globals = On);考慮到兼容性,還是強迫自己熟悉新的寫法比較好。
# J2 B! u- E7 w' j+ u* P
# | \4 Z: m3 Z; c2 K8 \9 S2 j# x【2】Win32下apache2 用get方法傳遞中文參數會出錯:
* ?. c+ f) X" V+ D5 G$ A- Q- }, s- k, g0 _2 i3 x& ?
test.php?a=你好&b=你也好
" {! ^, ^4 q) Z! S3 s6 y: C7 r
7 u9 }# W, R$ ]" l! ?! _傳遞參數是會導致一個內部錯誤
5 T* h* Q- Y! `, Y4 d7 |- ?3 b' |; F
解決辦法:"test.php?a=".urlencode(你好)."&b=".urlencode(你也好)8 j1 K% }; i" K( P; I2 E" A
% t$ s( x- `; e
.............2 ^4 k9 [ v3 n, u1 G1 Q
, C3 n6 Y; T+ ]; o; T( }【3】win32下的session不能正常工作
$ t( d6 _* t p) w! v
- @) t: J' ^0 ]/ Kphp.ini默認的session.save_path = /tmp
5 ]9 q% X' h" C6 ]3 M) s: M5 c- Z2 G: `
這顯然是linux下的配置,win32下php無法讀寫session文件導致session無法使用,把它改成一個絕對路徑就可以了,例如session.save_path = c:windows emp) E1 J* L4 S* g" @: f5 _5 p# Y
4 N! | @9 A; s1 K6 D6 d1 k, T0 `【4】顯示錯誤信息# x6 J* U+ [9 \6 I
6 i7 u0 H- f' o/ u: a' e當php.ini的display_errors = On並且error_reporting = E_ALL時,將顯示所有的錯誤和提示,調試的時候最好打開以便糾錯,如果你用以前php寫法錯誤信息多半是關於未定義變量的。變量在賦值以前調用會有提示,解決辦法是探測或者屏蔽。
. r! F/ O/ U* a6 ~1 I' S' C0 f( g+ ~( K b8 ~" c: n
例如顯示$foo,可以if(isset($foo)) echo $foo 或者echo @$foo3 s9 h' k* w) f
, ` P' s, C; V
【5】Win32下mail()不能發送電子郵件) ]- l% d% d; I7 b
( }! z. A# F$ ^2 X* K2 Q在linux下配置好的sendmail可以發送,在win32下需要調用smtp服務器來發送電子郵件,修改php.ini的SMTP = ip //ip是不帶驗證功能的smtp服務器(網上很難找到); {/ i9 M8 {4 K& n C1 ~ h& B
6 K7 O/ j1 q' r6 \7 \: K
php發送郵件的最好解決方法是用socket直接發送到對方email服務器而不用轉發服務器。
u+ P6 d0 |9 g: ^6 X+ w6 J# Y3 s P( q
【6】初裝的mysql如果沒有設置密碼,應該使用update mysql.user set password="yourpassword" where user="root" 修改密碼
& G2 s% e1 Z9 W W, D0 E4 ?3 p$ g1 c K# ?/ P: n
【7】header already sent7 A0 C( ]+ r1 k. w/ v. y" j
9 g7 x8 o X0 a: B% `: }' F
這個錯誤通常會在你使用HEADER的時候出現,他可能是幾種原因:1,你在使用HEADER前PRING或者ECHO了2.你當前文件前面有空行3.你可能INCLUDE了一個文件,該文件尾部有空行或者輸出也會出現這種錯誤。!
* x' n2 k- F3 j) k5 g/ e
" D! ~( ^4 H# b7 z$ `$ k【8】更改php.ini後沒有變化8 J7 G* P% ?. O7 \+ Q
, R1 m. S8 ?( V5 r重新啟動web server,比如IIS,Apache等等,然後才會應用最新的設置。5 g1 b7 p. U$ w5 n+ l% w/ L# C
9 Y( I- i$ w1 i7 u/ k3 S【9】php在2003上面安裝(ISAPI的安裝方法懇請高手指教)
( e6 V9 b" H/ e4 L" ?3 d4 r3 N- ]/ e" r3 u8 D# u4 Z* @" }! {) k
PHP4的php4isapi.dll好像和2003有些衝突,只能用CGI模式安裝6 a0 U5 Q O& q) e+ t. p0 ^
4 G& S& w" y2 v; I. W步驟一,先www.php.net 下在一個安裝程序,我是裝的是:php-4.2.3-installer.exe,你也可以去找最新的版本,在安裝php-4.2.3- installer.exe之前保證你的IIS6.0啟動了,並能夠訪問。安裝好以後,在默認網站-->應用程序配置。
1 E i3 M, R" E1 j7 r% R/ I
' O* q/ \0 j+ U: D7 k: }* I% g: F步驟二:點擊 web服務擴展 -->新建web服務擴展。
8 m, B! M" Y$ m% e$ U) x" W R! |
D1 [1 s, M" c z% A% f步驟三: 擴展名-->php,然後添加
) B0 e3 W2 y$ c5 V% z$ Q
8 X9 z, K6 K6 s' O1 ]' Z3 a步驟四:找到php.exe的路徑添加上去。8 B. ]4 [4 I: V, J) ?: q# E; ~
, }" k. _4 ]* n6 _8 ^$ W. f
步驟五: 確定就可以了!
* u2 R7 _4 g J6 j+ X. J
2 r4 C6 V, L# U, ?$ N# m7 q7 a步驟六: 選擇php的服務擴展,然後點擊允許。
# t( a1 N6 [( \; n
4 P+ u* s( _+ n. T0 O【10】有時候sql語句不起作用,對數據庫操作失敗,最簡便的調試方法,echo那句sql,看看變量的值能得到不。
3 P( C8 Y6 E: o& M. n' J" V- S1 i8 y
【11】include和require的區別
/ x5 B% i6 x9 z8 q \* t# m4 h) A
$ G+ Q5 w1 o7 o, v0 p! l0 b) |兩者沒有太大的區別,如果要包含的文件不存在,include提示notice,然後繼續執行下面的語句,require提示致命錯誤並且退出。" a, R) A! b) a: T& U8 `
( y- L) R/ O* G, \3 b4 M6 e
據我測試,win32平台下它們都是先包含後執行,所以被包含文件裡最好不要再有include或require語句,這樣會造成目錄混亂。或許*nux下情況不同,暫時還沒測試。
. r9 H( H3 B( m$ L3 D7 W( [" {. g: }; s/ i; d
如果一個文件不想被包含多次可以使用include_once或require_once## 讀取,寫入文檔數據。
7 v/ _" H" j% N9 G
2 E; W+ ?( V' t1 _4 T l5 y, \PHP 代碼:
, @- O! w2 j C- J6 Y4 ~3 Afunction r($file_name) {
# l7 x% j7 t; v4 h: c* r $filenum=@fopen($file_name,"r");
( K7 q# v& h! G' z) i @flock($filenum,LOCK_SH);
6 w0 [7 ?! G8 o) @- n $file_data=@fread($filenum,filesize($file_name));/ h7 @4 B8 R4 G z$ k2 w. `# E; A
@fclose($filenum);
]( j+ L# O& e& | return $file_data;* t8 F& ` o4 g2 i5 g
}
- P Z- i$ P3 i2 P9 rfunction w($file_name,$data,$method="w"){
( m; v( f. \) Y; d# P9 I8 d $filenum=@fopen($file_name,$method);
8 _' n0 ^9 h1 o+ k0 R flock($filenum,LOCK_EX);/ R8 J" e6 D) Q* r& E8 G3 u' U
$file_data=fwrite($filenum,$data);) U9 T/ S. o/ s* |
fclose($filenum);3 [+ j) Q/ c$ E
return $file_data;
. o2 L2 z) C5 w} / A3 {& p2 x+ P! d6 r0 A
4 E2 b- Q; A, w( V7 ?, E
【12】isset()和empty()的區別7 M: z. g: f) x9 x0 }# h7 G
- R* {4 Y }9 ?3 p" y" ~兩者都是測試變量用的,但是isset()是測試變量是否被賦值,而empty()是測試一個已經被賦值的變量是否為空。
( F, q C( \# @. d6 p5 y2 w
' p$ E/ D# ^8 r: \- m0 G如果一個變量沒被賦值就引用在php裡是被允許的,但會有notice提示,如果一個變量被賦空值,$foo=""或者$foo=0或者 $foo=false,那麼empty($foo)返回真,isset($foo)也返回真,就是說賦空值不會註銷一個變量。 Y1 D. r. u- \/ i
, I, y8 f* e+ [% _
要註銷一個變量,可以用 unset($foo)或者$foo=NULL& F. G: X& M1 u: s; v
6 F1 P. i) I$ M% f4 h" V
【13】mysql查詢語句包含有關鍵字
$ g% @" M$ k+ x3 I/ r p& P8 _0 D/ U, g5 l# p* |& P$ K
php查詢mysql的時候,有時候mysql表名或者列名會有關鍵字,這時候查詢會有錯誤。例如表名是order,查詢時候會出錯,簡單的辦法是sql語句裡表名或者列名加上`[tab鍵上面]來加以區別,例如select * from `order`
4 r! s- S: @- ~# O7 t2 E* a8 Z- X7 I0 u$ X% z
【14】通過HTTP協議一次上傳多個文件的方法, G( m$ @. z9 ^3 Y5 Z# t
9 \# @) S; ]5 ^( G有兩個思路,是同一個方法的兩種實現。具體程序還需自己去設計。
; q$ k6 u, u- P% _3 L! w. l+ Z
! Q7 b, E8 O& g# y1、在form中設置多個文件輸入框,用數組命名他們的名字,如下:2 e( p1 y0 s, f) v) ~& T
0 p$ A/ }. y# `. I) Q2 Q2 o2 [PHP 代碼:; |& r0 Q, D b
<form action="" method=post>
6 y D; }0 k5 C7 ?( |. G<input type=file name=usefile[]>
9 e9 _& V% Y( K0 N$ a0 H. o<input type=file name=usefile[]>
# h8 x; @) k& e* v<input type=file name=usefile[]>
& P: I9 I* S* ? f! S( V</form> * R$ ~7 v, h% Q: y. Q8 y Z2 V
9 n- @# g2 s9 |* ?7 n$ D; D: r這樣,在服務器端做以下測試:7 S/ m# x: x, X
# T6 K: L/ q- U! y( |. WPHP 代碼:
( f. U, m+ c P" u! X4 z* Lecho "<pre>";
( l8 T5 F" a# k5 D9 `1 ~1 j9 Mprint_r($_FILES);
' S: e" D% H0 c* v4 w( ]! k( X5 t* ?echo "</pre>"; : S# D, U2 E- p8 m( A' P; v/ h; ]
( _( x2 x8 p. |3 H. q' J% q# w- Q2、在form中設置多個文件輸入框,但名字不同,如下:: W* h" @1 X S
% d$ w, I3 R1 ^0 F EPHP 代碼:
- q1 a6 K/ Y! y* x v0 T K! x8 ~<form action="" method=post>
& k x8 _; `- z4 T9 z8 {6 D<input type=file name=usefile_a>
& r2 { [, G3 C- z<input type=file name=usefile_b>
6 L0 E+ h7 g" C<input type=file name=usefile_c>$ r" V1 x4 x0 k& H
</form> 7 C; V: x6 A- x, o+ [/ p" V6 o
( `0 V" \$ s: A2 h+ Z在服務器端做同樣測試:9 _* W* x7 |7 N* l P+ A7 X5 n9 G
, D4 r0 n8 {8 Y) U Z
PHP 代碼:
" O5 N1 j- v. V+ Qecho "<pre>";# d o, Z; u6 u+ m
print_r($_FILES);2 `7 U- l. }2 S* s; l
echo "</pre>"; |
評分
-
查看全部評分
|