过期域名预定抢注

 找回密碼
 免费注册

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

[複製鏈接]
發表於 2009-1-20 11:42:17 | 顯示全部樓層 |閱讀模式
【1】頁面之間無法傳遞變量 get,post,session在最新的php版本中自動全局變量是關閉的,所以要從上一頁面取得提交過來得變量要使用$_GET['foo'],$ _POST['foo'],$_SESSION['foo']來得到。當然也可以修改自動全局變量為開(php.ini改為 register_globals = On);考慮到兼容性,還是強迫自己熟悉新的寫法比較好。
( I2 w. x8 Z: q/ K
0 x+ ?; S" ?3 a+ I4 d- z' _【2】Win32下apache2 用get方法傳遞中文參數會出錯:0 p; G3 q3 B- Y$ x$ v& r( l

- ^6 w% `$ I8 Z2 [test.php?a=你好&b=你也好
2 N5 K9 n& X! V2 `! ^0 [# C
# U: L; {. @7 x  Y/ l. |2 Y8 u傳遞參數是會導致一個內部錯誤5 Z* V* ~& s* f; M; E% C8 R
8 [! D2 K1 T+ W& V0 z
解決辦法:"test.php?a=".urlencode(你好)."&b=".urlencode(你也好)8 I/ k4 B5 O. X4 p5 H

% M( j9 u2 Y$ ?" `5 p6 p.............4 C: o4 Y9 h8 j+ z1 U! N. N+ ?, x5 o

6 U. m/ p# g( k( G$ j6 y【3】win32下的session不能正常工作$ ?$ ~- t/ u/ e- x
7 F1 Y! c/ B) L/ C" O/ r$ K
php.ini默認的session.save_path = /tmp
. e4 Z- y  G5 R6 P2 q" C0 O- H
& }9 u$ k/ }0 _* I! B這顯然是linux下的配置,win32下php無法讀寫session文件導致session無法使用,把它改成一個絕對路徑就可以了,例如session.save_path = c:windows emp. S- \1 D) {6 \3 Z, z

% o) h( q4 C9 w& O, l【4】顯示錯誤信息
9 W  [: `! C6 B4 w4 R' T8 T9 d  ?2 N4 ^  |, j; |9 W) t$ P% m2 s+ {' h9 o
當php.ini的display_errors = On並且error_reporting = E_ALL時,將顯示所有的錯誤和提示,調試的時候最好打開以便糾錯,如果你用以前php寫法錯誤信息多半是關於未定義變量的。變量在賦值以前調用會有提示,解決辦法是探測或者屏蔽。" t% r0 n& U* b* u
( y$ T, k$ M, x5 }
例如顯示$foo,可以if(isset($foo)) echo $foo 或者echo @$foo- Y7 }  G7 g: E: t# j
3 z: {  z# A5 ^3 p! [
【5】Win32下mail()不能發送電子郵件
1 J1 ?8 [- F- g8 m, i; l
9 q  K3 x7 ]9 K, \, h8 p5 Y在linux下配置好的sendmail可以發送,在win32下需要調用smtp服務器來發送電子郵件,修改php.ini的SMTP = ip //ip是不帶驗證功能的smtp服務器(網上很難找到)
* r: @) x: Z( b7 C& f4 j" y9 C- l6 z
php發送郵件的最好解決方法是用socket直接發送到對方email服務器而不用轉發服務器。" p: L  ]* ?; ^! w0 X
) y& z2 J: B) q$ |% G- i3 u1 x; t
【6】初裝的mysql如果沒有設置密碼,應該使用update mysql.user set password="yourpassword" where user="root" 修改密碼' s# Z0 z) j# N, h
% D, @9 M& Y7 t% t9 I( f
【7】header already sent% T6 D- J6 s/ H& H

1 w1 ?$ j1 n* V這個錯誤通常會在你使用HEADER的時候出現,他可能是幾種原因:1,你在使用HEADER前PRING或者ECHO了2.你當前文件前面有空行3.你可能INCLUDE了一個文件,該文件尾部有空行或者輸出也會出現這種錯誤。!
: l4 P' L9 }2 }% I
0 g8 K0 n; e# D# e【8】更改php.ini後沒有變化9 d' D0 r0 I, v2 y9 b1 Z& X
5 ?* l8 ~8 z( E: O& Y: @& F  Z
重新啟動web server,比如IIS,Apache等等,然後才會應用最新的設置。7 @% Z; }% J4 H$ i5 @

- G0 `3 F5 E4 _/ Y1 b【9】php在2003上面安裝(ISAPI的安裝方法懇請高手指教)
9 h( d7 L8 G6 J+ J- U* i2 f4 g# I5 u! y" Y+ k; `" K4 M
PHP4的php4isapi.dll好像和2003有些衝突,只能用CGI模式安裝
1 n/ b8 b! O* _! x
6 \/ }" {/ W5 i: X步驟一,先www.php.net 下在一個安裝程序,我是裝的是:php-4.2.3-installer.exe,你也可以去找最新的版本,在安裝php-4.2.3- installer.exe之前保證你的IIS6.0啟動了,並能夠訪問。安裝好以後,在默認網站-->應用程序配置。
' ]6 k3 D" p$ L5 h5 I. x4 T1 ~: R! M2 t; |$ y! B" {' \
步驟二:點擊 web服務擴展 -->新建web服務擴展。9 m! _6 P8 ]3 t, W

' |8 E5 b+ I8 G' R1 d2 N: M步驟三: 擴展名-->php,然後添加* {  b# z3 B  C8 }- C' I3 N1 p% V

7 v+ l8 }  I4 {8 e: `1 B0 z1 C步驟四:找到php.exe的路徑添加上去。/ s3 s  ?- _1 E% a1 [8 N, r# T1 g
7 M! N( w$ D+ K) V% I
步驟五: 確定就可以了!
; P8 N# t" R$ \* C' w8 M3 p( G
+ {7 d3 V- D! T: Q$ B2 j3 F步驟六: 選擇php的服務擴展,然後點擊允許。" c7 {, y8 Z2 q+ c0 K
/ X# J- y3 i8 n4 |* m/ J/ q: g2 O2 \
【10】有時候sql語句不起作用,對數據庫操作失敗,最簡便的調試方法,echo那句sql,看看變量的值能得到不。$ ~( i/ x$ a7 D8 }; i

" Z. r- ?* O* g/ c5 F【11】include和require的區別
% [% M3 J: j' q# @6 M  a9 S
, f, s5 W- o& k兩者沒有太大的區別,如果要包含的文件不存在,include提示notice,然後繼續執行下面的語句,require提示致命錯誤並且退出。
4 F- A2 j: E: d
% X$ K2 }" \5 G6 l7 M8 f8 B& h據我測試,win32平台下它們都是先包含後執行,所以被包含文件裡最好不要再有include或require語句,這樣會造成目錄混亂。或許*nux下情況不同,暫時還沒測試。
2 }2 w. U8 O, d3 `( T' o5 k
2 N6 l; i! x( R. W如果一個文件不想被包含多次可以使用include_once或require_once## 讀取,寫入文檔數據。
! M  \2 N" z# ?. f
+ _+ q' Q  M6 T7 Q% Y1 w6 tPHP 代碼:
7 q" W8 S( ]( Cfunction r($file_name) {
4 s+ e' O- q/ ^  Y7 f* I( B  $filenum=@fopen($file_name,"r");
! K% y/ `. e) E+ T  \) o  @flock($filenum,LOCK_SH);
/ S& |( [& T: b" Z& I  $file_data=@fread($filenum,filesize($file_name));
* I% O/ b* {( ~2 B- q5 s- B  @fclose($filenum);
' s" @5 z6 u5 k0 W' Q2 [! p  return $file_data;- s0 c5 ~2 q2 p2 r
}% L$ m" S6 {6 |6 t1 H
function w($file_name,$data,$method="w"){
) j4 E9 Z+ ?% O6 @: t. `  $filenum=@fopen($file_name,$method);1 ~. e/ U% x/ w
  flock($filenum,LOCK_EX);) z* o* Z/ g! {1 N
  $file_data=fwrite($filenum,$data);. _) b, `4 z! m' B) b! ]6 B
  fclose($filenum);+ E9 {; Y: d& o3 T0 l/ f9 t9 ?
  return $file_data;; V* m+ A# z" s2 F+ ?
}  ) D2 x2 K2 U$ y8 T7 o7 h- G

" e" G( ?( ]* R, j1 v【12】isset()和empty()的區別# M5 l2 U5 o" C
4 L# y# @3 {4 @7 @! C* ~3 V1 P: m
兩者都是測試變量用的,但是isset()是測試變量是否被賦值,而empty()是測試一個已經被賦值的變量是否為空。+ D" P% b/ c* W! m4 }/ |
5 r/ a$ z1 L  ~9 ]8 S/ G. N$ g' b
如果一個變量沒被賦值就引用在php裡是被允許的,但會有notice提示,如果一個變量被賦空值,$foo=""或者$foo=0或者 $foo=false,那麼empty($foo)返回真,isset($foo)也返回真,就是說賦空值不會註銷一個變量。
& j5 ~; s' T5 P: ~8 p) v! y; M& i* X4 N% `
要註銷一個變量,可以用 unset($foo)或者$foo=NULL
( b! q, v& B1 ?' Z* @/ G  W) R8 p4 A2 d/ z8 M4 L3 r' j; [
【13】mysql查詢語句包含有關鍵字0 V0 z1 @3 [3 g3 D" m$ R! l
5 p; }& W* Q9 j/ @8 X
php查詢mysql的時候,有時候mysql表名或者列名會有關鍵字,這時候查詢會有錯誤。例如表名是order,查詢時候會出錯,簡單的辦法是sql語句裡表名或者列名加上`[tab鍵上面]來加以區別,例如select * from `order`" M2 L1 f6 K" [  F' |0 r

; ?6 g# V; B4 q) P& G( I" g( r【14】通過HTTP協議一次上傳多個文件的方法
  a, P9 J7 y, }! c
' P0 r3 u: }, i- y1 d2 H5 r有兩個思路,是同一個方法的兩種實現。具體程序還需自己去設計。. A  P7 m5 B) l, i
" ~1 J8 i. H6 Y7 O! E4 w3 U6 p
1、在form中設置多個文件輸入框,用數組命名他們的名字,如下:9 C, l$ d5 Q) ~1 \

4 m6 Z7 [7 I# A, y$ r5 xPHP 代碼:
; O+ X% t( a3 x9 Q9 ?. p<form action="" method=post>
: s" @3 i2 v5 }9 e% Y<input type=file name=usefile[]>
, M) \6 w) @. d7 k' J7 O<input type=file name=usefile[]>% l8 H1 K& U3 N4 d, N) u1 I' J
<input type=file name=usefile[]>* p' b# z. p5 v  e+ `* N: L0 ^3 {
</form>  
( n3 c- F2 |  }% \# ?2 H) v1 y& G
這樣,在服務器端做以下測試:
+ ^9 W( O  n6 ~+ d* R. Z2 h9 W& [& U. N
PHP 代碼:
7 A7 `- {; V3 L/ ~echo "<pre>";
+ Q6 [4 o& f- g1 e3 V6 u* j+ R, ~print_r($_FILES);
6 N+ l0 p+ B: ~' Oecho "</pre>";  8 ?; N* N! K& o

9 ^" u, k% o4 z# n/ \" ?9 b2、在form中設置多個文件輸入框,但名字不同,如下:$ ]# ]! a# b& X3 X! m5 k, k& ]

" P/ c0 X- }' D, M" z2 jPHP 代碼:  K3 p5 X" }# Y. m
<form action="" method=post>6 B. P* D4 L" u5 Q, U$ x: _
<input type=file name=usefile_a>
/ y4 a, p$ j8 W4 ~- R; ^4 O2 M$ ~<input type=file name=usefile_b>
/ H' f# t% M# e1 m% I5 [! Y<input type=file name=usefile_c>
& L3 N3 r" q# |' k3 J</form>  
/ n4 Q8 L. t: C( d0 N5 l- |
% Q, ~. n2 f% K1 X在服務器端做同樣測試:) \" M, N$ ?# Q7 |- M: e
. j- C6 T7 H9 L- a2 T
PHP 代碼:
- s$ G$ m; x6 }/ |echo "<pre>";
3 P  k$ C, e9 mprint_r($_FILES);
8 B+ ~- A3 p/ W% N! S0 Aecho "</pre>";

評分

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

查看全部評分

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

本版積分規則

过期高净值品牌域名预定抢注

點基

GMT+8, 2026-8-9 13:18

By DZ X3.5

小黑屋

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