过期域名预定抢注

 找回密碼
 免费注册

令PHP初學者們最頭疼的幾個問題及解決辦法 --轉

[複製鏈接]
發表於 2009-1-20 11:42:17 | 顯示全部樓層 |閱讀模式
【1】頁面之間無法傳遞變量 get,post,session在最新的php版本中自動全局變量是關閉的,所以要從上一頁面取得提交過來得變量要使用$_GET['foo'],$ _POST['foo'],$_SESSION['foo']來得到。當然也可以修改自動全局變量為開(php.ini改為 register_globals = On);考慮到兼容性,還是強迫自己熟悉新的寫法比較好。
  \# E$ Y: C+ j; }2 c7 G6 d/ n- H2 q" x" O% X
【2】Win32下apache2 用get方法傳遞中文參數會出錯:+ v# X3 B8 Y: m4 F" e0 O
$ \; C  Z/ s& t" r: S
test.php?a=你好&b=你也好/ G# h  \4 q' b2 V8 S6 v

$ m! s+ b5 R" r9 @+ m1 h- y傳遞參數是會導致一個內部錯誤: y2 g8 `/ X3 e# l  y. Q

! B& B( }! l/ O解決辦法:"test.php?a=".urlencode(你好)."&b=".urlencode(你也好)9 g3 m* ?3 H; O
$ Y3 [3 f/ z( C0 j
.............0 F; O! d" F% I% a8 `2 z% t+ [: X
+ x+ Z) b# U2 G% k# s7 m
【3】win32下的session不能正常工作* ^  C7 r1 L; {4 |% i' m; D
8 X* u5 J" A3 o4 _
php.ini默認的session.save_path = /tmp
4 W' a' Q- M) g$ p( |# |, P7 w
, ?' f- _3 U: ?' Y3 U1 B這顯然是linux下的配置,win32下php無法讀寫session文件導致session無法使用,把它改成一個絕對路徑就可以了,例如session.save_path = c:windows emp2 A; m- `/ Q1 W+ u# \
# |9 e" S+ G% h9 U4 Y( I, _
【4】顯示錯誤信息9 Q4 F. c) o1 G# X/ F9 A1 p
/ X/ L- l% E5 @5 q" A! Z
當php.ini的display_errors = On並且error_reporting = E_ALL時,將顯示所有的錯誤和提示,調試的時候最好打開以便糾錯,如果你用以前php寫法錯誤信息多半是關於未定義變量的。變量在賦值以前調用會有提示,解決辦法是探測或者屏蔽。
* \. ]5 `7 |% H$ u0 O* U$ U) w0 |, e% Q6 ~2 `
例如顯示$foo,可以if(isset($foo)) echo $foo 或者echo @$foo
; x& |0 v$ b' W' l( w* _. U, k$ E( G+ O) D
【5】Win32下mail()不能發送電子郵件& k! D+ H+ Y2 q8 Y
* L) Z: h2 `; H) L& D4 y
在linux下配置好的sendmail可以發送,在win32下需要調用smtp服務器來發送電子郵件,修改php.ini的SMTP = ip //ip是不帶驗證功能的smtp服務器(網上很難找到)
. B' d- E- Q8 @3 N* ]' F/ B
" s, y3 B9 V1 F; w1 a3 @* uphp發送郵件的最好解決方法是用socket直接發送到對方email服務器而不用轉發服務器。. X4 ~/ n  j0 a" C9 [- F4 C7 t

0 x2 Q* }2 {( Y* d【6】初裝的mysql如果沒有設置密碼,應該使用update mysql.user set password="yourpassword" where user="root" 修改密碼
6 B4 m5 p; S$ i3 T) Z3 c9 ?3 c/ h& K" S) d7 R& n* }
【7】header already sent
; M" {1 n. s- U9 G9 O
8 ^5 i4 |8 t- Z3 }  t! Q5 a0 h* L這個錯誤通常會在你使用HEADER的時候出現,他可能是幾種原因:1,你在使用HEADER前PRING或者ECHO了2.你當前文件前面有空行3.你可能INCLUDE了一個文件,該文件尾部有空行或者輸出也會出現這種錯誤。!
. E5 c, l+ w& }" G
7 M3 G8 l) K" b8 ~+ L【8】更改php.ini後沒有變化" E3 G5 V/ L* m7 B

! C+ f; n' I& w  f4 ~6 c重新啟動web server,比如IIS,Apache等等,然後才會應用最新的設置。
! s5 l* `" q& X- ^/ [
6 @+ Q* ^) V$ m! R9 P【9】php在2003上面安裝(ISAPI的安裝方法懇請高手指教)
1 I' n: ?% l& i0 {. |+ P* d4 ~5 s+ N) h) ~% V
PHP4的php4isapi.dll好像和2003有些衝突,只能用CGI模式安裝) J4 q! v" q1 W

, l7 u- I) S7 |步驟一,先www.php.net 下在一個安裝程序,我是裝的是:php-4.2.3-installer.exe,你也可以去找最新的版本,在安裝php-4.2.3- installer.exe之前保證你的IIS6.0啟動了,並能夠訪問。安裝好以後,在默認網站-->應用程序配置。
0 X% E3 m- }$ z/ X# H* A$ G& W0 S8 }' _: {( ~6 H
步驟二:點擊 web服務擴展 -->新建web服務擴展。0 C& J* ^' u; M3 C  @4 p6 t
1 G; @% h* L) i/ t
步驟三: 擴展名-->php,然後添加
% ]6 u4 u! Z% h9 {; o2 T5 p: O8 h2 y4 A; ^- Q! F$ z& ~! L
步驟四:找到php.exe的路徑添加上去。
6 C! \% @+ H5 E5 S4 ]" g! ^8 V$ _
步驟五: 確定就可以了!! `4 B3 L+ \! X) w$ U

) d9 k# F+ g& @4 u% U- V  q  [步驟六: 選擇php的服務擴展,然後點擊允許。% S0 O/ i  Y0 J

' c3 O; k! X3 Q) q1 J) v【10】有時候sql語句不起作用,對數據庫操作失敗,最簡便的調試方法,echo那句sql,看看變量的值能得到不。
, a3 o6 i$ W1 V6 r
% T# O% i$ S! `* o【11】include和require的區別
5 G3 n0 Z" N+ L: i; s
4 Y1 c  }( C, M* b3 }8 n兩者沒有太大的區別,如果要包含的文件不存在,include提示notice,然後繼續執行下面的語句,require提示致命錯誤並且退出。5 n  r2 V% ]% P2 p: V6 l$ M7 h& v3 v
! O$ }, v" ~8 K6 M9 u' z1 I
據我測試,win32平台下它們都是先包含後執行,所以被包含文件裡最好不要再有include或require語句,這樣會造成目錄混亂。或許*nux下情況不同,暫時還沒測試。
; G8 q' t4 t  |* D) Q
; Z: N% d, D! n' E1 N+ S8 i如果一個文件不想被包含多次可以使用include_once或require_once## 讀取,寫入文檔數據。1 ~* f9 H' P! J* V# }) ]0 @9 W

8 [$ r0 E' b& y) O2 i8 FPHP 代碼:
6 |& f; n0 T3 M! P  Sfunction r($file_name) {
% U/ D+ n& z! b0 L7 ?$ y  $filenum=@fopen($file_name,"r");
/ V# D4 P. y4 r8 x. J* w" n7 E  @flock($filenum,LOCK_SH);
9 v% C8 `. L7 X- j# I4 R6 F  $file_data=@fread($filenum,filesize($file_name));: G; c1 |& ^+ P; O# O
  @fclose($filenum);8 q8 k8 F( w2 d/ Y* }4 ~1 r
  return $file_data;" J$ N) T( |2 `& r& b
}
) A3 _  i2 R% u8 l; m/ b' e. `function w($file_name,$data,$method="w"){3 ~6 {" h( X5 Y9 f6 U9 A( `
  $filenum=@fopen($file_name,$method);
3 k6 @, ^0 N' w7 p  flock($filenum,LOCK_EX);1 U7 i( P0 C( E, g
  $file_data=fwrite($filenum,$data);/ {( h+ F3 ^9 f3 X
  fclose($filenum);2 o, v- ~! A* j0 J
  return $file_data;( |1 K0 ~2 f2 s
}  ; j7 T- x" I- r) r, u2 w
1 P# b) D% |5 c5 Z0 t- ?7 _
【12】isset()和empty()的區別
9 p+ v: d4 H2 p% b- L3 F( L1 L6 M9 |+ t
兩者都是測試變量用的,但是isset()是測試變量是否被賦值,而empty()是測試一個已經被賦值的變量是否為空。' F8 m) C) Q; ^
, E% u9 |* f# z  R0 ^! g
如果一個變量沒被賦值就引用在php裡是被允許的,但會有notice提示,如果一個變量被賦空值,$foo=""或者$foo=0或者 $foo=false,那麼empty($foo)返回真,isset($foo)也返回真,就是說賦空值不會註銷一個變量。
0 x, M: ?2 G& K  `9 I3 B6 g- X! s3 Z) n( H* ^, c( W
要註銷一個變量,可以用 unset($foo)或者$foo=NULL& R2 Z! N' J4 ^

$ {7 C( b9 k: P; j. c7 P【13】mysql查詢語句包含有關鍵字
# i+ b) D: X: L& ^  @3 ~6 A; @
" Q8 w! I3 Q- {( s- P7 J) k. sphp查詢mysql的時候,有時候mysql表名或者列名會有關鍵字,這時候查詢會有錯誤。例如表名是order,查詢時候會出錯,簡單的辦法是sql語句裡表名或者列名加上`[tab鍵上面]來加以區別,例如select * from `order`5 Z5 y% l' }7 d  i. m9 H
+ V' V1 }! `, N, U
【14】通過HTTP協議一次上傳多個文件的方法* k$ Y4 N& A/ f

$ E0 }8 ~  M# c( F& Y! Y7 ?# i5 D有兩個思路,是同一個方法的兩種實現。具體程序還需自己去設計。) a0 o6 X+ B% f$ z

% q* \$ L* K9 i6 M. b1、在form中設置多個文件輸入框,用數組命名他們的名字,如下:
4 A$ @- p% X" L+ \# p1 u" z% P/ e7 z6 x  d1 T* _' k
PHP 代碼:
& c$ f( G, \. P: I6 b' L1 K<form action="" method=post>/ U* k4 B) ]) I2 d1 n) n
<input type=file name=usefile[]>
$ L5 \. |' y; o6 c<input type=file name=usefile[]>9 R4 f6 ^/ d5 e' u
<input type=file name=usefile[]>: u. b3 {5 f1 X% M  O( O7 Z9 T+ J
</form>  
! B5 R$ f- D$ K4 f" _$ b" k; _6 f' u4 G% K8 e( Y
這樣,在服務器端做以下測試:# }+ Q: L* |4 H  J0 o

2 z, N4 |* F1 V8 MPHP 代碼:' J. {& S1 P: l6 V) H
echo "<pre>";
& R/ z5 K' E: h+ [  v7 e0 n2 Gprint_r($_FILES);
9 s2 k& n( {9 q( D: f7 i$ ^: ]echo "</pre>";  
8 x8 u( x$ @* M: M3 j+ H
" A0 u+ x1 W: I" `  q2、在form中設置多個文件輸入框,但名字不同,如下:( C1 X2 f( n8 q* E& {! L( ?! W
: C7 N2 U4 F* t/ t, C$ |
PHP 代碼:& W4 v- ^' o+ V* k0 p4 x
<form action="" method=post>$ x0 \+ R9 [, {- T+ ?- w& J
<input type=file name=usefile_a>
/ k& P! J0 {- d<input type=file name=usefile_b>% [( J2 _( q# U" ~# |5 E7 P+ A
<input type=file name=usefile_c>
  ]+ a* _/ `* t. r) f9 |</form>  / s) i. s+ Z9 O; r
0 j# A- r/ M0 n7 }( o0 A
在服務器端做同樣測試:* a8 H3 ~+ a) |. |& y8 r

7 o9 g/ Q% F5 s+ |1 f9 R+ BPHP 代碼:
$ D1 M& Q$ P" v, _! }0 Jecho "<pre>";
  [' X, }' U& Z" E. B6 b$ C# u& Vprint_r($_FILES);
* Z% V4 K% t" lecho "</pre>";

評分

參與人數 1 +10 收起 理由
回忆月光 + 10

查看全部評分

您需要登錄後才可以回帖 登錄 | 免费注册

本版積分規則

點基

GMT+8, 2026-5-22 00:24

By DZ X3.5

小黑屋

快速回復 返回頂部 返回列表