过期域名预定抢注

 找回密碼
 免费注册

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

[複製鏈接]
發表於 2009-1-20 11:42:17 | 顯示全部樓層 |閱讀模式
【1】頁面之間無法傳遞變量 get,post,session在最新的php版本中自動全局變量是關閉的,所以要從上一頁面取得提交過來得變量要使用$_GET['foo'],$ _POST['foo'],$_SESSION['foo']來得到。當然也可以修改自動全局變量為開(php.ini改為 register_globals = On);考慮到兼容性,還是強迫自己熟悉新的寫法比較好。
5 M) }$ L! p/ I# }5 @  C
# s3 z4 J) A/ ^【2】Win32下apache2 用get方法傳遞中文參數會出錯:9 i; H/ \  _7 ^, w, Z
8 A+ U5 U- z0 R
test.php?a=你好&b=你也好
* ^& s& Y/ p8 C0 {& `- X1 A( L' }( J+ v% _# F. x$ D# e- F) r
傳遞參數是會導致一個內部錯誤# B- Q5 ^7 J5 b; m
# v- o: `: e' Q% A4 B6 G  i4 R
解決辦法:"test.php?a=".urlencode(你好)."&b=".urlencode(你也好)7 ]. r' q" |  e3 o2 j5 T
) R, p: P) a3 T7 S7 {! u
.............
! K/ d/ [7 ?5 s# T0 B! @6 w
+ e; ^" [) E* b9 k. p+ ]) M) d; a【3】win32下的session不能正常工作9 S8 |/ O5 B* G

. ~) L- L, _) z6 L/ o: H/ Mphp.ini默認的session.save_path = /tmp8 Q/ i4 _1 J6 Q9 c* }4 F" {

; i0 L- c5 ?# u, c* B! ~, g這顯然是linux下的配置,win32下php無法讀寫session文件導致session無法使用,把它改成一個絕對路徑就可以了,例如session.save_path = c:windows emp5 e- s( X! V% d- r/ R, M$ d% K8 w

( R! F1 {, t; N" i, G【4】顯示錯誤信息
8 x/ C& k- S/ W1 T9 I
* A/ e) m+ B" c; W4 @3 n5 O8 T- P/ r當php.ini的display_errors = On並且error_reporting = E_ALL時,將顯示所有的錯誤和提示,調試的時候最好打開以便糾錯,如果你用以前php寫法錯誤信息多半是關於未定義變量的。變量在賦值以前調用會有提示,解決辦法是探測或者屏蔽。; J$ K; i  |1 j( A4 `* p
. ]! ~! f# O1 d/ b& s7 W% R7 j7 n7 n
例如顯示$foo,可以if(isset($foo)) echo $foo 或者echo @$foo
4 t& ]5 {* C: R) j+ B" n4 c8 G# p' J& H3 V8 m% r3 y. O$ D
【5】Win32下mail()不能發送電子郵件- Z, m& o6 q) \! b) Y" T+ v
/ ^- u8 F8 Y; r7 J5 j) D
在linux下配置好的sendmail可以發送,在win32下需要調用smtp服務器來發送電子郵件,修改php.ini的SMTP = ip //ip是不帶驗證功能的smtp服務器(網上很難找到)- @* |2 |1 X( o: @  A

( `. v0 L; d! S  i. D9 Fphp發送郵件的最好解決方法是用socket直接發送到對方email服務器而不用轉發服務器。) n: D; D! O! _6 Z: R

4 Z1 |! s! n7 F/ l  Y+ s【6】初裝的mysql如果沒有設置密碼,應該使用update mysql.user set password="yourpassword" where user="root" 修改密碼
9 \- k' C/ f. v2 n9 R7 F& O# B# \. V# S$ u2 A6 J" `7 \7 Y
【7】header already sent
0 C  ?# _9 z+ v$ H' ~0 |: W' V  d1 C0 a# g2 Y: ]
這個錯誤通常會在你使用HEADER的時候出現,他可能是幾種原因:1,你在使用HEADER前PRING或者ECHO了2.你當前文件前面有空行3.你可能INCLUDE了一個文件,該文件尾部有空行或者輸出也會出現這種錯誤。!
+ c  |/ q  L( C  ~- B' O2 K) `- `; |- M6 ~4 W% F: J( U) t
【8】更改php.ini後沒有變化
7 w$ K0 c; U4 k( ?  x' N: D2 \, B* H% ?: ^. J) C0 s# Z
重新啟動web server,比如IIS,Apache等等,然後才會應用最新的設置。4 e0 i4 w' j/ R' J" C  M+ ?! y' x

2 G( s1 S- p5 |【9】php在2003上面安裝(ISAPI的安裝方法懇請高手指教)
: q; f4 r" C6 @0 R& E' L9 K2 o; q! G* ?1 S8 a- k, }& C0 a
PHP4的php4isapi.dll好像和2003有些衝突,只能用CGI模式安裝
( m8 _% ^/ v0 o: C( U( t6 N
+ t: P2 O9 }& D  |8 v/ N/ m步驟一,先www.php.net 下在一個安裝程序,我是裝的是:php-4.2.3-installer.exe,你也可以去找最新的版本,在安裝php-4.2.3- installer.exe之前保證你的IIS6.0啟動了,並能夠訪問。安裝好以後,在默認網站-->應用程序配置。/ P1 D  C$ J& X$ v# n1 C

9 i) ^- Q+ I) n0 D6 E9 m- q% @步驟二:點擊 web服務擴展 -->新建web服務擴展。4 j  o: N  z  K7 v0 Q! t

+ w" ~2 o& d: Y! V0 Z" H0 z& M$ N步驟三: 擴展名-->php,然後添加
0 y/ ^& d. {* T3 U+ F- w3 `( D# Y4 U! P2 r- x4 r
步驟四:找到php.exe的路徑添加上去。
% m% z8 G: l+ s
" }2 [; A# Q' [: K步驟五: 確定就可以了!
9 h- j2 i) w* ?# _, v) `; E& n7 \0 U0 V1 b& B
步驟六: 選擇php的服務擴展,然後點擊允許。
0 `+ R( r9 m) K! k" ^7 _6 A5 [9 c; B' @9 _
【10】有時候sql語句不起作用,對數據庫操作失敗,最簡便的調試方法,echo那句sql,看看變量的值能得到不。
& b- @! t7 \( R) e2 O* Q
# ]1 c/ W7 h. c7 i$ y【11】include和require的區別+ T$ c! R0 Z( C
) V# T- O6 G/ z  m
兩者沒有太大的區別,如果要包含的文件不存在,include提示notice,然後繼續執行下面的語句,require提示致命錯誤並且退出。
7 k4 o, y7 w" r; I6 Z5 A* \" `6 K- D2 N5 |1 S
據我測試,win32平台下它們都是先包含後執行,所以被包含文件裡最好不要再有include或require語句,這樣會造成目錄混亂。或許*nux下情況不同,暫時還沒測試。( Q$ `" k5 h/ W! Y! x

' I1 @* M) A' x5 f. G如果一個文件不想被包含多次可以使用include_once或require_once## 讀取,寫入文檔數據。7 s  n  ^4 r3 f8 B- c" d

( K7 G2 t0 S  U) Y: t9 x% BPHP 代碼:9 Y2 J  A# W. d( {
function r($file_name) {0 M5 _6 c  W/ S3 v3 s
  $filenum=@fopen($file_name,"r");
, J  z( O+ ~1 z1 n  X( Q  @flock($filenum,LOCK_SH);7 l4 [+ L+ x: o% x2 E) R
  $file_data=@fread($filenum,filesize($file_name));  O5 k+ A3 c( J) B8 C$ E
  @fclose($filenum);% d: ^; s; s3 i$ f% V
  return $file_data;0 [/ _8 X5 O# ^; L: }. m
}8 d5 L* v% M3 Z# r4 p
function w($file_name,$data,$method="w"){
) ^4 O: I, H% W  $filenum=@fopen($file_name,$method);- j) @" I' b/ P6 e3 \
  flock($filenum,LOCK_EX);
4 m* R) r" s4 {4 @  $file_data=fwrite($filenum,$data);
; I$ K3 t/ y' x: u# m: }0 y  fclose($filenum);& a  u2 q$ j- ~: k" O( ]
  return $file_data;
( Y/ J; H. ^" U}  : q. f  L! w$ Z$ ~  v

5 F3 f1 M- `  `  F7 E: Z; r# x/ c【12】isset()和empty()的區別
' D( S$ L0 j$ ^1 j7 }# m* V7 F# y6 v% u, m
兩者都是測試變量用的,但是isset()是測試變量是否被賦值,而empty()是測試一個已經被賦值的變量是否為空。
8 ?) H) Q- ]! A9 o$ i
9 v3 D: L( q: |3 m0 h6 X. J) x如果一個變量沒被賦值就引用在php裡是被允許的,但會有notice提示,如果一個變量被賦空值,$foo=""或者$foo=0或者 $foo=false,那麼empty($foo)返回真,isset($foo)也返回真,就是說賦空值不會註銷一個變量。
" Y8 I) L8 t7 \& r. I0 u- L" s% c+ F, N- Y/ N! i1 t0 E+ O
要註銷一個變量,可以用 unset($foo)或者$foo=NULL
; _& R) ~$ W& {" O
) J% b/ a" E# q1 o3 ]3 s- D【13】mysql查詢語句包含有關鍵字
- m' u1 }6 G9 O! f: L
* t, G. }  l& Q0 Sphp查詢mysql的時候,有時候mysql表名或者列名會有關鍵字,這時候查詢會有錯誤。例如表名是order,查詢時候會出錯,簡單的辦法是sql語句裡表名或者列名加上`[tab鍵上面]來加以區別,例如select * from `order`' b" N" n/ \3 `6 n
/ P" G" C6 h, f3 y) B  _0 {* J0 z
【14】通過HTTP協議一次上傳多個文件的方法
/ U5 Y' j$ p' E1 {0 B5 P8 a5 p7 l3 s  u+ _' M4 Q
有兩個思路,是同一個方法的兩種實現。具體程序還需自己去設計。
6 W) A, t* w" M2 n  D! I
* M, x! G5 Y/ c. D  Y4 d1、在form中設置多個文件輸入框,用數組命名他們的名字,如下:6 R/ _3 z% T1 Q7 _3 M( b4 ~
, D+ |9 v7 p! A
PHP 代碼:
$ j$ E7 l$ w( f<form action="" method=post>+ k0 I/ _3 e% q" a# w
<input type=file name=usefile[]>
8 S0 ], Q% }6 V- ?: w) n2 k, P<input type=file name=usefile[]>. u. K. i- I, V+ W/ s( d8 {
<input type=file name=usefile[]>
/ f$ f! p/ j5 m6 T" a</form>  . {  F; l6 Z# a. ?; o9 X) {
  s2 J- d6 w" ?& E" }# P2 ^$ {
這樣,在服務器端做以下測試:) ]. |+ h& W& Z
. A8 T5 [/ }" u( n1 B# L
PHP 代碼:! ]2 y) n3 a8 j2 A6 e4 A
echo "<pre>";2 Z8 |! Z0 ^7 s6 `
print_r($_FILES);
1 Q, i4 K8 e( j/ C) `. pecho "</pre>";  9 C3 f: L- a0 H4 j4 l4 N

6 ^. h! W/ Q; X2、在form中設置多個文件輸入框,但名字不同,如下:" G2 M& @, o$ T3 c0 p( h

. Z0 b% g5 c9 h% n  o4 ]$ mPHP 代碼:
: z: g% [7 g0 ^# M1 W, a0 ^( D<form action="" method=post>
2 `/ e3 H! z$ B# D9 q<input type=file name=usefile_a>& x$ G' C1 u1 p, |
<input type=file name=usefile_b>3 S& I( m9 J1 N5 H
<input type=file name=usefile_c>
( C; `" D9 k- o; @- k& E& I  l</form>  
, }/ a  R( i: T4 i  H1 [& g" [! w
$ R: d( S0 k( N1 @在服務器端做同樣測試:
, }. I3 ^* y+ f
: K5 V% K: |4 Z( f6 O+ qPHP 代碼:% Q" q$ H* s; s+ e% c6 R$ Y
echo "<pre>";
4 O+ N0 I, x% U7 ~$ l! M( _print_r($_FILES);
2 a# b" W( N7 |5 t" v$ h& l) Decho "</pre>";

評分

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

查看全部評分

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

本版積分規則

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

GMT+8, 2025-4-7 04:03

By DZ X3.5

小黑屋

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