过期域名预定抢注

用戶名  找回密碼
 免费注册

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

[複製鏈接]
發表於 2009-1-20 11:42:17 | 顯示全部樓層 |閱讀模式
【1】頁面之間無法傳遞變量 get,post,session在最新的php版本中自動全局變量是關閉的,所以要從上一頁面取得提交過來得變量要使用$_GET['foo'],$ _POST['foo'],$_SESSION['foo']來得到。當然也可以修改自動全局變量為開(php.ini改為 register_globals = On);考慮到兼容性,還是強迫自己熟悉新的寫法比較好。
5 R+ H& g- F/ M5 {
* ]0 v, U/ V" i5 |* I, t【2】Win32下apache2 用get方法傳遞中文參數會出錯:# z* j( W! f1 H* i! f
1 G* ]# h) [4 R/ \0 P/ q; e, y9 R
test.php?a=你好&b=你也好2 ^1 t6 w- T/ q! f) N* a: T) e

! X( m; P3 J* V6 S/ H傳遞參數是會導致一個內部錯誤: b  y. t- Z3 p* V7 z
% N7 H) c2 C7 `  V' K/ }) G
解決辦法:"test.php?a=".urlencode(你好)."&b=".urlencode(你也好)6 u2 q" c$ V0 C7 j$ B

4 D4 v* t2 z7 P& b. Q+ o9 S1 z, T.............
+ ~# H: N) V: ^4 }/ l
, ?/ U) a% E  y. o【3】win32下的session不能正常工作
  k3 p3 D  q* F( B
7 L; e' Q% l% i* h) Ophp.ini默認的session.save_path = /tmp
1 f- W: _) t* B6 p/ K
7 R8 S  l* x/ e7 H/ W+ |  Z8 Y這顯然是linux下的配置,win32下php無法讀寫session文件導致session無法使用,把它改成一個絕對路徑就可以了,例如session.save_path = c:windows emp- f9 _  B. m0 B) K. j! Y
  L+ B  M# X! I* f0 p; p. K! [
【4】顯示錯誤信息
2 o! d# \8 r2 |& W% B" E4 P0 P! `, Q, E9 W  e( v3 Z
當php.ini的display_errors = On並且error_reporting = E_ALL時,將顯示所有的錯誤和提示,調試的時候最好打開以便糾錯,如果你用以前php寫法錯誤信息多半是關於未定義變量的。變量在賦值以前調用會有提示,解決辦法是探測或者屏蔽。
: K1 S7 l4 p- U* F; i
9 R) S+ [: Y9 N) c例如顯示$foo,可以if(isset($foo)) echo $foo 或者echo @$foo
- l( }" |8 a& M8 R: b
0 r" ?; g/ I1 _- |4 @, G  N+ A【5】Win32下mail()不能發送電子郵件1 F% F( B2 O( h, Q
$ H% Y* G/ ^/ l4 \8 S( ^
在linux下配置好的sendmail可以發送,在win32下需要調用smtp服務器來發送電子郵件,修改php.ini的SMTP = ip //ip是不帶驗證功能的smtp服務器(網上很難找到)
- X: X! k4 l2 ?$ F4 C. u9 h5 \. B* P
- B0 y8 H6 D% J$ b. @php發送郵件的最好解決方法是用socket直接發送到對方email服務器而不用轉發服務器。
8 D) ?  c. K9 X
% M7 B  U! j; j【6】初裝的mysql如果沒有設置密碼,應該使用update mysql.user set password="yourpassword" where user="root" 修改密碼
; c9 c6 u& v5 N0 \  ~. C1 \+ m/ C# ]2 [* l5 d
【7】header already sent" l, U' D  N1 B) V( b  s# f

: K* e6 `# a3 ?% q( i1 k5 ^, t這個錯誤通常會在你使用HEADER的時候出現,他可能是幾種原因:1,你在使用HEADER前PRING或者ECHO了2.你當前文件前面有空行3.你可能INCLUDE了一個文件,該文件尾部有空行或者輸出也會出現這種錯誤。!
, y4 W* S& z* w: S& m
% S, [9 N$ y9 e5 w  K【8】更改php.ini後沒有變化7 O% W' }4 `' x) }5 z5 g8 u6 a2 ?& u; y
& m) h  v) a- U$ X: @2 S/ x1 q
重新啟動web server,比如IIS,Apache等等,然後才會應用最新的設置。0 Y* r' Y6 U( h; N
* m- c( ~* Z5 [+ F
【9】php在2003上面安裝(ISAPI的安裝方法懇請高手指教)
' a, j: k! `3 }$ B# J! Q- e$ _1 O. Q7 m0 H6 O! S7 D4 t8 J: V+ M
PHP4的php4isapi.dll好像和2003有些衝突,只能用CGI模式安裝
: r% E; x+ c0 `1 ^
( Y1 J) ^% T5 n, Y8 W, n9 Q步驟一,先www.php.net 下在一個安裝程序,我是裝的是:php-4.2.3-installer.exe,你也可以去找最新的版本,在安裝php-4.2.3- installer.exe之前保證你的IIS6.0啟動了,並能夠訪問。安裝好以後,在默認網站-->應用程序配置。9 B) f7 C3 O" ~, P' i! I" q0 {

$ r4 X* e9 V2 n" j4 Z, I6 J  [步驟二:點擊 web服務擴展 -->新建web服務擴展。5 }: y! K' K5 s% a! Y

1 B0 B7 p, n4 x4 U) a% v4 i9 ?$ a+ a步驟三: 擴展名-->php,然後添加
# T  G: z6 u/ h4 M0 C6 F- l
' b6 W# P; u2 \( W7 s& L" f1 u  ^3 K8 l% h步驟四:找到php.exe的路徑添加上去。
) K6 U5 q' Z  p0 c2 ~3 p. s/ W- e" N) H8 v7 W0 [7 Q
步驟五: 確定就可以了!
7 t6 `9 J+ {$ z! ^* c+ X7 V
5 O, `* L" N0 x8 c& j2 ~1 A步驟六: 選擇php的服務擴展,然後點擊允許。6 c2 l) O1 E+ ~$ D

" F& A, E+ {0 A( ]2 W9 e【10】有時候sql語句不起作用,對數據庫操作失敗,最簡便的調試方法,echo那句sql,看看變量的值能得到不。
1 J# M5 T" L% A' q$ v# G1 a/ Q4 d* ~" A. h. n
【11】include和require的區別2 I; j/ z9 @1 c. ]

/ D- S5 `6 R8 a3 w; S" e5 @8 T兩者沒有太大的區別,如果要包含的文件不存在,include提示notice,然後繼續執行下面的語句,require提示致命錯誤並且退出。
' g) O! w9 M; c9 c+ h1 R  Q" x. q' u. F
. G( r  m' P" D據我測試,win32平台下它們都是先包含後執行,所以被包含文件裡最好不要再有include或require語句,這樣會造成目錄混亂。或許*nux下情況不同,暫時還沒測試。& O; F* g( V$ _0 E

- r: V; C* l/ C' F如果一個文件不想被包含多次可以使用include_once或require_once## 讀取,寫入文檔數據。6 D! b" g! q( b, d7 p4 ?
8 I! h; P4 [# E- T6 U" K* h9 e
PHP 代碼:
- G) c$ z0 H4 h2 d% Ifunction r($file_name) {# p+ U0 f, X% v# ?: M  d4 p
  $filenum=@fopen($file_name,"r");% X+ b) Q: x  c9 t2 {) M
  @flock($filenum,LOCK_SH);
* o/ |% Q; N$ m8 {0 s  $file_data=@fread($filenum,filesize($file_name));
' p! M+ D2 u9 p! H9 N7 ?- k  L  @fclose($filenum);
9 Y/ q; M( ^. d5 O) O! R* ^  return $file_data;% V& J1 D7 B+ \3 l6 b2 u
}2 H5 H( B' ^9 M8 v" i1 L+ B( Y* g
function w($file_name,$data,$method="w"){- q' g& S' e( {2 n2 s+ N
  $filenum=@fopen($file_name,$method);2 l9 t0 L) c& g. A' c
  flock($filenum,LOCK_EX);
& f1 g" X  F: `7 _8 [  $file_data=fwrite($filenum,$data);9 X6 Q- G/ q! o9 X! \
  fclose($filenum);2 K. P1 N9 i% k' P9 [# {+ u
  return $file_data;8 x) ~6 S3 W+ k' g, g: @4 ~- \
}  7 n; `% r1 g3 u+ I
1 d5 Q; Z) c3 M6 ^3 U  A6 ~
【12】isset()和empty()的區別
% \7 T# k4 A) f" X( e4 a! i( e: P; _  E# I
兩者都是測試變量用的,但是isset()是測試變量是否被賦值,而empty()是測試一個已經被賦值的變量是否為空。
& [* d$ V! ~1 [2 F0 J' |
# C& h8 d7 s$ b" }如果一個變量沒被賦值就引用在php裡是被允許的,但會有notice提示,如果一個變量被賦空值,$foo=""或者$foo=0或者 $foo=false,那麼empty($foo)返回真,isset($foo)也返回真,就是說賦空值不會註銷一個變量。7 q( h3 M) T1 r% a- Z
/ l+ Q( ]- N" h8 Y& o
要註銷一個變量,可以用 unset($foo)或者$foo=NULL" R: L% Q$ y! c- V

8 {& G# o0 T* x4 X$ c【13】mysql查詢語句包含有關鍵字
* j+ T* T& L* s5 }3 M/ s* ~
, q/ J" G1 N1 K) R$ p  ^: Q: bphp查詢mysql的時候,有時候mysql表名或者列名會有關鍵字,這時候查詢會有錯誤。例如表名是order,查詢時候會出錯,簡單的辦法是sql語句裡表名或者列名加上`[tab鍵上面]來加以區別,例如select * from `order`
; b7 C+ s# e9 q" V* N6 ?/ ]/ A* _- @; ^
【14】通過HTTP協議一次上傳多個文件的方法. ~- z1 S9 q5 t$ u* p

) y1 b9 f2 C# f' K有兩個思路,是同一個方法的兩種實現。具體程序還需自己去設計。# B" i% L( S$ B6 z4 c
' A# E: v: k/ \( {5 |
1、在form中設置多個文件輸入框,用數組命名他們的名字,如下:3 A' l2 V) I  j( Y+ c8 }! r
  d; g. S8 R( P$ `3 }+ t
PHP 代碼:  M3 C9 K; i1 I$ }, n+ N
<form action="" method=post>( J0 a% H  H4 T  Q
<input type=file name=usefile[]>
/ o& M3 q( K: p6 F+ c/ f3 s) p<input type=file name=usefile[]>2 _, ~  m. c! w" U) V( n
<input type=file name=usefile[]>$ i$ _+ C% U% z; ?0 n
</form>  
1 V9 \9 W7 \( F9 t/ r& \/ w% t# m; g
9 Z/ u# \: j$ i/ [; j$ @7 V這樣,在服務器端做以下測試:5 v0 d4 d* O+ }" w/ R3 u) P: Z

6 n3 n% N6 @: [) iPHP 代碼:
5 e2 m4 j; p; }( j6 W: Wecho "<pre>";5 E  T; u9 L( M5 T; t( s) {- D
print_r($_FILES);
# I- ^  y) z* @3 F8 ~# {" techo "</pre>";  
" z% L7 O3 u. w0 @$ W9 p/ C
" w* D# B; N' @: _% F* B2、在form中設置多個文件輸入框,但名字不同,如下:* E1 G0 I/ I- K! a
2 v5 Y6 u1 t( @& A0 ~4 }* w
PHP 代碼:
( ^' Z9 ~5 U& `5 Y4 r) X' ]2 [<form action="" method=post>
& j) _: F$ l. K8 x  E<input type=file name=usefile_a>* U2 j' {8 S( [! U8 ]$ G" m" C
<input type=file name=usefile_b>
# h2 o0 x5 S  p0 h" g( x' j, w<input type=file name=usefile_c>6 G8 c! |& L0 |+ c% s' N0 D
</form>  
; D0 v7 K4 l2 W7 Q& e- o; H
% _, I: J  y! m& I1 S" J2 D在服務器端做同樣測試:/ E/ d( \: i9 r( H
1 J- o" T* K5 F  m" V
PHP 代碼:: b% ]$ }. `* W9 O" T9 x% V; x5 D
echo "<pre>";% P. L6 N, Q9 \2 m
print_r($_FILES);
* ]; q7 p0 R% N& h1 m0 b4 |0 mecho "</pre>";

評分

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

查看全部評分

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

本版積分規則

點基跨境 數位編輯創業論壇

GMT+8, 2025-6-9 04:00

By DZ X3.5

小黑屋

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