【1】頁面之間無法傳遞變量 get,post,session在最新的php版本中自動全局變量是關閉的,所以要從上一頁面取得提交過來得變量要使用$_GET['foo'],$ _POST['foo'],$_SESSION['foo']來得到。當然也可以修改自動全局變量為開(php.ini改為 register_globals = On);考慮到兼容性,還是強迫自己熟悉新的寫法比較好。
( a! Q1 R) G0 N& `( a1 o6 e$ W4 x4 U# l s1 Q) m1 [5 ^ n" t
【2】Win32下apache2 用get方法傳遞中文參數會出錯:7 d, D' s9 ] `
) [7 {- G' w4 Q5 V: R* ktest.php?a=你好&b=你也好
1 D9 o. @6 b* O$ l; ?; A w: C, N1 `* \
) [* e- g' c2 d* G% \9 Y6 x" w傳遞參數是會導致一個內部錯誤
, k* ]8 f3 k) U0 A! ~ W0 K& }! _. A- d5 d
解決辦法:"test.php?a=".urlencode(你好)."&b=".urlencode(你也好) r5 X; L( P7 j' K6 f
2 A4 a; X r2 L0 Q6 @+ G; [.............
# W% g/ v$ f0 J2 i# E. T- n
3 O# @4 Y/ k" C7 ]8 t, p; P【3】win32下的session不能正常工作
+ i8 j# _: |/ |( m( f
- r7 B: L( c0 F, R: gphp.ini默認的session.save_path = /tmp
H, L2 c4 \4 n0 D$ }) o: ]9 e2 Q8 y/ B
這顯然是linux下的配置,win32下php無法讀寫session文件導致session無法使用,把它改成一個絕對路徑就可以了,例如session.save_path = c:windows emp
; d+ Q/ F- ]$ q5 W! G3 b) g
" [. x& s8 x/ @. F/ y7 ~3 l【4】顯示錯誤信息$ o! K1 v1 e4 K/ }( y- _
& }- A7 \2 n4 a8 }9 @+ `: ^' q
當php.ini的display_errors = On並且error_reporting = E_ALL時,將顯示所有的錯誤和提示,調試的時候最好打開以便糾錯,如果你用以前php寫法錯誤信息多半是關於未定義變量的。變量在賦值以前調用會有提示,解決辦法是探測或者屏蔽。5 X: o9 m) N. a3 c2 \$ k
) I1 E: {3 q% l# Y3 [# C' d" @9 @
例如顯示$foo,可以if(isset($foo)) echo $foo 或者echo @$foo
3 O; u; J& F$ I8 Q0 S. Z
' W) V6 P4 ^: X5 D: t' B【5】Win32下mail()不能發送電子郵件4 k! _$ D/ `/ E# H. q8 `& U/ K
; j$ W# h1 T5 _. E( [
在linux下配置好的sendmail可以發送,在win32下需要調用smtp服務器來發送電子郵件,修改php.ini的SMTP = ip //ip是不帶驗證功能的smtp服務器(網上很難找到)
4 e" N! Q/ O- S1 T8 t
% {9 J8 g- T1 }+ b0 {8 k5 Z' vphp發送郵件的最好解決方法是用socket直接發送到對方email服務器而不用轉發服務器。: [& u+ R1 I0 f5 D9 P) o
$ i, @& _ \4 h1 D8 p【6】初裝的mysql如果沒有設置密碼,應該使用update mysql.user set password="yourpassword" where user="root" 修改密碼) F0 ?) Z2 ~& ]6 `: Z$ d3 W. q
! G# a1 j+ F# I9 ?, N5 X
【7】header already sent+ B, H4 T0 J3 z+ t4 n+ x" u
0 K; Z: g; m9 I# a7 m0 g
這個錯誤通常會在你使用HEADER的時候出現,他可能是幾種原因:1,你在使用HEADER前PRING或者ECHO了2.你當前文件前面有空行3.你可能INCLUDE了一個文件,該文件尾部有空行或者輸出也會出現這種錯誤。!
5 B* U, y! ~% Z, T9 c
2 N6 {! N7 J4 v【8】更改php.ini後沒有變化+ d8 X- ?, v2 o4 ~. S: M
9 q" x; J; \# O: @( t, ?7 S重新啟動web server,比如IIS,Apache等等,然後才會應用最新的設置。
5 C8 h2 d- m8 A; l0 ^+ a2 B/ D& X+ z9 |
【9】php在2003上面安裝(ISAPI的安裝方法懇請高手指教)) {& h) Q# T- \' i6 w7 t
( H" [' D; O2 ~' _PHP4的php4isapi.dll好像和2003有些衝突,只能用CGI模式安裝
; F$ b% S+ {5 @
# K6 P& H/ \3 B" M步驟一,先www.php.net 下在一個安裝程序,我是裝的是:php-4.2.3-installer.exe,你也可以去找最新的版本,在安裝php-4.2.3- installer.exe之前保證你的IIS6.0啟動了,並能夠訪問。安裝好以後,在默認網站-->應用程序配置。
0 ~ r/ I; j0 z) t0 M
8 S8 f; v: N f) Y, {& G步驟二:點擊 web服務擴展 -->新建web服務擴展。% s9 {* L. T: L9 O/ i
. O A7 A+ z+ J- q3 m, R
步驟三: 擴展名-->php,然後添加1 g! c& j5 _8 Y8 m
! h9 ^( Y/ \4 Y9 Q/ @; @% P
步驟四:找到php.exe的路徑添加上去。
: w) C: ~$ b" n, i% f( g% `: a, M1 A2 q1 c
步驟五: 確定就可以了!
* G$ D9 I( C8 T+ U' @" m& y& t
/ c' p9 e; n K9 L! @- ]$ B5 C- U步驟六: 選擇php的服務擴展,然後點擊允許。
( U% l: A1 W/ h: C; b E5 @" |$ ?! d) L( U) N9 |
【10】有時候sql語句不起作用,對數據庫操作失敗,最簡便的調試方法,echo那句sql,看看變量的值能得到不。: a- s" D8 i8 a9 _
/ ?5 _" {( ^( D& R7 [: W& b【11】include和require的區別
1 X: W% N; r0 \/ e% D+ B; O
9 R l' v0 J. [5 K" T兩者沒有太大的區別,如果要包含的文件不存在,include提示notice,然後繼續執行下面的語句,require提示致命錯誤並且退出。
# V: \3 ~! {2 P5 z% O$ o& Y' x" L0 ?& Q& d+ O2 e
據我測試,win32平台下它們都是先包含後執行,所以被包含文件裡最好不要再有include或require語句,這樣會造成目錄混亂。或許*nux下情況不同,暫時還沒測試。
' R3 r! T# g1 E& O" M% f
# z4 X9 Z2 |5 [0 a% l6 ?如果一個文件不想被包含多次可以使用include_once或require_once## 讀取,寫入文檔數據。
( |2 T1 H& F7 Q( J* Y- t6 l$ r% z
PHP 代碼:5 j& @$ @+ k* `; N3 r
function r($file_name) { I o% x, S/ U7 l- D6 Z" v# w
$filenum=@fopen($file_name,"r");5 R2 a3 i0 }; M2 @
@flock($filenum,LOCK_SH);
; p( L- Z% S/ h' g $file_data=@fread($filenum,filesize($file_name));
! [; N! R) A+ \2 a @fclose($filenum);
2 _; ?- g3 b+ t return $file_data;/ d; Y7 b8 r( u: M8 l! C" F6 |" w
}1 V& _- q2 {: A- s# b# Z; i4 Z
function w($file_name,$data,$method="w"){; z: y5 ]6 M3 t M/ f2 z
$filenum=@fopen($file_name,$method);
/ _5 |- ^! C' B; Z flock($filenum,LOCK_EX);
' s/ [7 C* Y$ L/ I' M $file_data=fwrite($filenum,$data);
4 J) j2 D. C, w, P0 T, @ S fclose($filenum);! C+ e& Q3 I- ^& O3 E
return $file_data;
+ ] e* }/ i7 {, F} , w4 W8 n. o: h; W* v3 \
4 W2 E5 e( w, t' }" m+ ^' r
【12】isset()和empty()的區別
; P( @- q7 L, Z7 F! v: z; \8 J0 O! j
兩者都是測試變量用的,但是isset()是測試變量是否被賦值,而empty()是測試一個已經被賦值的變量是否為空。
& y- R s/ Q5 m7 b6 n: s6 |) H6 k- j; U0 h9 A* @9 U
如果一個變量沒被賦值就引用在php裡是被允許的,但會有notice提示,如果一個變量被賦空值,$foo=""或者$foo=0或者 $foo=false,那麼empty($foo)返回真,isset($foo)也返回真,就是說賦空值不會註銷一個變量。4 x a% x7 q: t
) Q: n. T L W要註銷一個變量,可以用 unset($foo)或者$foo=NULL# S% L- _) u) |& w e
- n. v }& [# F$ `+ k【13】mysql查詢語句包含有關鍵字
3 n' p$ e" `/ s1 j+ u* S8 E( K& \$ v# }# @& N0 W2 R
php查詢mysql的時候,有時候mysql表名或者列名會有關鍵字,這時候查詢會有錯誤。例如表名是order,查詢時候會出錯,簡單的辦法是sql語句裡表名或者列名加上`[tab鍵上面]來加以區別,例如select * from `order`! B* h. E0 C$ o4 W
+ `5 \5 L# a) m4 P5 c* y5 T. n
【14】通過HTTP協議一次上傳多個文件的方法& W; N. w! @" V* o" J: I! z# z
7 k* I1 q; D; W" R. Z
有兩個思路,是同一個方法的兩種實現。具體程序還需自己去設計。
# L' T$ z, C; U8 E( f# d7 w! z
4 I& f! p* K6 e- d9 i1、在form中設置多個文件輸入框,用數組命名他們的名字,如下:- d$ l+ s. h7 l* C* ?! A
0 `# J) v# y W/ N8 L3 P3 _% |8 BPHP 代碼:7 [4 [% y4 u" C; O: f2 M
<form action="" method=post>
1 O) L) A/ c" S- L% [' F<input type=file name=usefile[]>
/ c5 }' ]) m) H) k5 g: ]<input type=file name=usefile[]>/ M& p& k1 \# ?( y8 N2 x$ r+ }
<input type=file name=usefile[]>( y$ M3 N; G, |) H- x' {' O! K7 a
</form>
: N, ^! X4 g& z X8 K' q
& @1 z: E6 \( P8 S- ~這樣,在服務器端做以下測試:1 n7 I! T/ ^2 ?7 a1 W# e8 G
# ?0 V% s: K$ i& X
PHP 代碼:
' n3 K7 V9 w1 R! ]echo "<pre>";
6 ]% ` c/ |/ F8 [print_r($_FILES);
) F/ H& }" q3 B; Fecho "</pre>";
* S' _3 X8 Q% } U# x% o, a: ~: `- d3 s7 V* Y9 b E$ @7 X
2、在form中設置多個文件輸入框,但名字不同,如下:2 L8 o+ ]6 F5 d" T/ f
4 N! U+ i$ f& n( s# A( ]PHP 代碼:
! v# k/ @% F3 o+ j/ b<form action="" method=post>& z/ g: c& D+ J0 n" I6 u
<input type=file name=usefile_a>+ Y3 q, C7 @3 N! \+ O2 `
<input type=file name=usefile_b>6 u6 x1 K# S' W" z2 k' e) Q
<input type=file name=usefile_c>; d0 {% Z) n7 J7 x
</form> 0 G4 t6 W. p$ n8 Q! {! i
2 r% x: D! C0 a' f4 Q& f g8 R1 k5 D& H
在服務器端做同樣測試:
: a" o* T1 D- I1 V. `7 Q) f! h$ c @! E3 i9 M) x5 E
PHP 代碼:
' i) o9 ?8 ~8 c% cecho "<pre>";' Y" j( x. {3 W2 R: L. B* G( ]
print_r($_FILES);
) r) G2 \! R, H$ `% C( iecho "</pre>"; |
評分
-
查看全部評分
|