过期域名预定抢注

 找回密碼
 免费注册

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

[複製鏈接]
發表於 2009-1-20 11:42:17 | 顯示全部樓層 |閱讀模式
【1】頁面之間無法傳遞變量 get,post,session在最新的php版本中自動全局變量是關閉的,所以要從上一頁面取得提交過來得變量要使用$_GET['foo'],$ _POST['foo'],$_SESSION['foo']來得到。當然也可以修改自動全局變量為開(php.ini改為 register_globals = On);考慮到兼容性,還是強迫自己熟悉新的寫法比較好。1 L( T! _6 ?8 H7 A# j% M

" g% k# Q/ t( m4 B【2】Win32下apache2 用get方法傳遞中文參數會出錯:
- [2 }4 F/ ?, N' \" q+ j
9 {) I3 f2 [# [5 l) F/ A6 t' {5 ytest.php?a=你好&b=你也好
  g4 y; ?$ `* G- S/ G  H: k/ Z" a5 _% ^+ E# d
傳遞參數是會導致一個內部錯誤$ ^! E- r5 b* |. b/ x

, {0 \; L# O1 z. P解決辦法:"test.php?a=".urlencode(你好)."&b=".urlencode(你也好)6 q! B: _: ^; M, u( {3 u$ I
5 h  q# A* O2 n, o4 T/ [$ H4 ]
.............$ U7 V8 o3 S; H
9 r" r4 J3 L: C8 |
【3】win32下的session不能正常工作
" V& Z* _/ e! a& ~
- q. e% N" Q: F: Q/ Pphp.ini默認的session.save_path = /tmp
) V% O" v1 c" z$ X: u7 L  J2 \3 b" g" l  e8 f0 Y$ z
這顯然是linux下的配置,win32下php無法讀寫session文件導致session無法使用,把它改成一個絕對路徑就可以了,例如session.save_path = c:windows emp, E# i! d6 _/ Q2 i7 i' K

4 R8 v" {/ v; o1 Q【4】顯示錯誤信息' B5 R* y& Y3 x, T# R

2 H6 _( R) k/ {% p7 Z當php.ini的display_errors = On並且error_reporting = E_ALL時,將顯示所有的錯誤和提示,調試的時候最好打開以便糾錯,如果你用以前php寫法錯誤信息多半是關於未定義變量的。變量在賦值以前調用會有提示,解決辦法是探測或者屏蔽。2 _. U* N% u, R% S* Q+ [
2 Q' ~0 [' d9 a2 q2 r
例如顯示$foo,可以if(isset($foo)) echo $foo 或者echo @$foo
2 D0 o+ a  o8 o5 L& b7 i: f, t' I+ G& z
【5】Win32下mail()不能發送電子郵件' j1 ]! s# q  V" X

# k. s1 B2 ^4 a$ O! k+ q9 @( q在linux下配置好的sendmail可以發送,在win32下需要調用smtp服務器來發送電子郵件,修改php.ini的SMTP = ip //ip是不帶驗證功能的smtp服務器(網上很難找到)
! v5 j  F. |' h( F- S
  e' K( M* S4 T& c# vphp發送郵件的最好解決方法是用socket直接發送到對方email服務器而不用轉發服務器。2 f: j  M( J  e4 N( f  ]1 Z1 F

  K6 p2 s3 Y( [【6】初裝的mysql如果沒有設置密碼,應該使用update mysql.user set password="yourpassword" where user="root" 修改密碼8 E, J- R4 Q( u0 s

) \7 Q7 [- c" V# B- L6 G【7】header already sent$ }: `& ?. Q& s7 \! a1 L7 J

. N5 [" t* a3 }" g3 J; k6 }這個錯誤通常會在你使用HEADER的時候出現,他可能是幾種原因:1,你在使用HEADER前PRING或者ECHO了2.你當前文件前面有空行3.你可能INCLUDE了一個文件,該文件尾部有空行或者輸出也會出現這種錯誤。!
  V) l4 m' c' ^7 J* K
) R9 f  Y3 ~7 m1 e【8】更改php.ini後沒有變化
; H0 U* d$ L% _1 H. s5 ~, b4 M: a# }$ E1 }
重新啟動web server,比如IIS,Apache等等,然後才會應用最新的設置。1 S, x+ h1 D3 f1 v7 K9 @. u5 }; o/ B

: _# }% O1 F- Z  N& g/ ]【9】php在2003上面安裝(ISAPI的安裝方法懇請高手指教)
; N; p( X- v: d" T. Y2 j
' I' m- s" Z# j9 ]; f# FPHP4的php4isapi.dll好像和2003有些衝突,只能用CGI模式安裝# x7 y: T1 Z4 s. L

) P$ M& }, ?9 U# [步驟一,先www.php.net 下在一個安裝程序,我是裝的是:php-4.2.3-installer.exe,你也可以去找最新的版本,在安裝php-4.2.3- installer.exe之前保證你的IIS6.0啟動了,並能夠訪問。安裝好以後,在默認網站-->應用程序配置。
& z' W: D. y3 F+ t* s
0 M1 n. C& u! e: R# _步驟二:點擊 web服務擴展 -->新建web服務擴展。
2 b) n/ C  F. D/ Z$ G8 C: D
6 f* g8 r1 {% f5 C步驟三: 擴展名-->php,然後添加
' S4 `% N. I- N5 C2 f
8 ^+ F( N3 P7 j. h5 c步驟四:找到php.exe的路徑添加上去。
' b/ V; K) N- r, o0 ]1 Z4 G% m2 H5 u8 g' q3 ^4 p
步驟五: 確定就可以了!) V6 D* @, {! p

7 t% c% ~* B0 m+ z: n: k步驟六: 選擇php的服務擴展,然後點擊允許。- J* U( i- }2 G' Y: X3 \& w
8 @( P9 \* c% T$ F: B
【10】有時候sql語句不起作用,對數據庫操作失敗,最簡便的調試方法,echo那句sql,看看變量的值能得到不。
, ^& ]1 X, }8 \- l3 k+ ]8 M# S! W* K! r* x# V( P
【11】include和require的區別
1 w5 K+ u1 }0 _4 P! L& D3 g% q* O8 u1 l: a  B/ M  @, N6 c) L6 u3 L7 B4 N
兩者沒有太大的區別,如果要包含的文件不存在,include提示notice,然後繼續執行下面的語句,require提示致命錯誤並且退出。
! k" R$ P# G* @9 d1 e6 k/ }. x6 A9 h' |- A
據我測試,win32平台下它們都是先包含後執行,所以被包含文件裡最好不要再有include或require語句,這樣會造成目錄混亂。或許*nux下情況不同,暫時還沒測試。
! V+ L. |$ y7 ?
4 U8 G& K( Y0 W. K: q0 |' Y3 i4 w如果一個文件不想被包含多次可以使用include_once或require_once## 讀取,寫入文檔數據。2 F5 {$ P4 m# Z* e4 ~2 {4 R4 X

' M0 ^% O; A  u7 y* }# P8 O, mPHP 代碼:/ O6 V6 D! Q1 _( a1 c6 O
function r($file_name) {
3 R- ?! ~+ F! B& u7 _  $filenum=@fopen($file_name,"r");7 S* M) D0 K5 X6 s
  @flock($filenum,LOCK_SH);& K# d! ]' Z9 D$ `  q9 D
  $file_data=@fread($filenum,filesize($file_name));
9 P* o7 S7 q4 J" ^) U* |) C  @fclose($filenum);
8 Z. w6 A' V6 i, W% D1 x  return $file_data;
+ Z- I8 y0 S) X- I0 B4 ^}
, T' S" l# z# q6 t. p) m- w( bfunction w($file_name,$data,$method="w"){3 ?) n# c; [' G- J9 |
  $filenum=@fopen($file_name,$method);
; k" }8 S2 h; F  flock($filenum,LOCK_EX);
! d2 e, _* k% g# V' T  $file_data=fwrite($filenum,$data);. @3 n- X6 u8 J, w) I
  fclose($filenum);
; Y& l' y; A* l$ }7 \$ g$ B  return $file_data;
( o9 G$ }: ?& x9 O% ^9 k}  
& f3 C" ]0 L2 I7 B0 O1 u$ h
. \6 w( U8 z" C【12】isset()和empty()的區別
$ |$ K7 y1 A5 l) {- `" N* ?: t6 }: Y# \, ?2 D
兩者都是測試變量用的,但是isset()是測試變量是否被賦值,而empty()是測試一個已經被賦值的變量是否為空。
5 b/ H2 O) n. p& t, `7 d* c/ W4 X6 U: u3 ~) A  u' F; T
如果一個變量沒被賦值就引用在php裡是被允許的,但會有notice提示,如果一個變量被賦空值,$foo=""或者$foo=0或者 $foo=false,那麼empty($foo)返回真,isset($foo)也返回真,就是說賦空值不會註銷一個變量。# f6 E4 S/ }* {7 |: g

4 q9 z2 S% L! x要註銷一個變量,可以用 unset($foo)或者$foo=NULL
8 m/ Y: X1 L& f4 B  w/ O
1 @! p9 {% G+ X6 k7 J【13】mysql查詢語句包含有關鍵字& U7 ?* _% t4 k$ i6 _' d1 l8 o/ u

. K  Y, v+ B/ y& [4 ephp查詢mysql的時候,有時候mysql表名或者列名會有關鍵字,這時候查詢會有錯誤。例如表名是order,查詢時候會出錯,簡單的辦法是sql語句裡表名或者列名加上`[tab鍵上面]來加以區別,例如select * from `order`( Q2 M3 p; S/ b1 j: m: A
7 W5 J. P5 B  V
【14】通過HTTP協議一次上傳多個文件的方法
. v8 f4 D0 z" ^' l" d, ^$ K
. \& n* @( v9 y/ _# i有兩個思路,是同一個方法的兩種實現。具體程序還需自己去設計。
& b6 O1 @) t# t; P% ~/ V& }1 Z, N. w  N9 v/ h, _
1、在form中設置多個文件輸入框,用數組命名他們的名字,如下:
0 E2 u6 h9 v( I7 }( V4 M8 l  W4 n; j+ K% ~9 w4 [
PHP 代碼:
- r% c# z0 V* ~5 j2 K2 O# X3 I<form action="" method=post>" r5 r/ c, i/ B8 P# \
<input type=file name=usefile[]>! w9 Z# H4 ?$ D' G* F. X& K
<input type=file name=usefile[]>- e/ U5 E2 f, L6 D& D" H
<input type=file name=usefile[]>
% u; F3 C8 q3 Q) X$ u</form>    y3 \' i& y7 p( h3 E: o

- _4 g& X) F- k7 {這樣,在服務器端做以下測試:
4 ~, O. p. C2 W$ Q& h; ~
: p- ?  a7 G% `: [' |PHP 代碼:
2 ?3 x* z' ~! r0 ]- ?. |) ]echo "<pre>";
: @8 |4 ~# J3 }print_r($_FILES);  s* s6 C' m& R$ u/ C
echo "</pre>";  2 c, l% ?2 j2 g1 u! V; z

- G, e2 V1 k6 |6 O) t3 t2、在form中設置多個文件輸入框,但名字不同,如下:
; x9 \' A) h) j5 a& z$ ~" ~: B( X; Y- c) s
PHP 代碼:4 B! _$ X% m" K* g# Y, u
<form action="" method=post>& [( @' {" C+ V8 C: c
<input type=file name=usefile_a>
$ ]. n" C  U& k8 `<input type=file name=usefile_b>
/ ?7 n6 ]: K6 D6 _/ t<input type=file name=usefile_c>, Q. |7 ]  h' o" t9 I. y1 J1 `$ \' H
</form>  5 C% ]( s) I+ S1 V% ?9 c' x7 a: V; t7 y

8 O% S3 u" f8 C. F# t在服務器端做同樣測試:
& S! {' z4 S( D" ~1 R
! \7 u5 |4 {, `2 }PHP 代碼:
9 s( l& S- ~% }9 g) y3 techo "<pre>";
8 }% `$ w8 X7 T4 K' @% Y9 E2 Qprint_r($_FILES);0 ~1 f: X7 D+ z
echo "</pre>";

評分

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

查看全部評分

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

本版積分規則

點基

GMT+8, 2026-3-13 09:03

By DZ X3.5

小黑屋

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