过期域名预定抢注

 找回密碼
 免费注册

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

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

6 A/ |* A  _5 S4 t4 [  \, U% z0 G【2】Win32下apache2 用get方法傳遞中文參數會出錯:8 l2 r) R4 C5 h' `

. y  `. V, O6 U% ^: {, v# Vtest.php?a=你好&b=你也好" A& H5 K2 W8 {% U0 T* n

( |/ ^5 n* x$ R! m傳遞參數是會導致一個內部錯誤
8 u& o% `! g. t- L9 h
' l/ b5 D( t/ J3 ]& k- a解決辦法:"test.php?a=".urlencode(你好)."&b=".urlencode(你也好)! U  \5 a5 v+ M) S; `
2 {& N# f( f3 s* o- q& v+ Q/ D1 }
.............; v3 d0 O/ @9 e. R5 x( e

/ W/ B8 X8 }$ D【3】win32下的session不能正常工作0 b, h  D' A/ n7 i# n9 j! y, x

! U* R5 Z4 c3 f9 \php.ini默認的session.save_path = /tmp
6 P$ V3 h2 f( V. J; O
1 h3 y$ V% w& @這顯然是linux下的配置,win32下php無法讀寫session文件導致session無法使用,把它改成一個絕對路徑就可以了,例如session.save_path = c:windows emp
5 [9 b+ P% k. s2 X8 H; E  z" Q" P- O6 {9 J, n0 B
【4】顯示錯誤信息
5 v5 d0 }8 |5 |0 S/ O
) R0 J6 l4 }' V0 l當php.ini的display_errors = On並且error_reporting = E_ALL時,將顯示所有的錯誤和提示,調試的時候最好打開以便糾錯,如果你用以前php寫法錯誤信息多半是關於未定義變量的。變量在賦值以前調用會有提示,解決辦法是探測或者屏蔽。! [& k( H7 ?: I2 x" |
& \, a2 Y5 @, j- K, |
例如顯示$foo,可以if(isset($foo)) echo $foo 或者echo @$foo" _& q  E5 x; N" m

- V. R8 p1 K8 @+ Q【5】Win32下mail()不能發送電子郵件! I. r- |+ j! T1 q" V
- J* i8 G$ R& ]1 r7 E$ C* |: m
在linux下配置好的sendmail可以發送,在win32下需要調用smtp服務器來發送電子郵件,修改php.ini的SMTP = ip //ip是不帶驗證功能的smtp服務器(網上很難找到)
( a9 P; s& a/ A  j* ~/ x+ S: y% \; @4 w. n
php發送郵件的最好解決方法是用socket直接發送到對方email服務器而不用轉發服務器。
2 L2 j) k/ G4 m1 C4 ~- T/ q3 x- [
1 q) _8 X1 a( L( }# W【6】初裝的mysql如果沒有設置密碼,應該使用update mysql.user set password="yourpassword" where user="root" 修改密碼4 ]$ }! r% S" c1 ^' @

! R3 b& }$ w+ P: k- |  Q6 f【7】header already sent
+ {1 m4 \, h4 j& g& B
+ ^" x/ A, J3 |3 j這個錯誤通常會在你使用HEADER的時候出現,他可能是幾種原因:1,你在使用HEADER前PRING或者ECHO了2.你當前文件前面有空行3.你可能INCLUDE了一個文件,該文件尾部有空行或者輸出也會出現這種錯誤。!
; W# V) w' V9 C. Y' _  Y) k
+ O* ?: L& g" h5 b) M  Y2 Y8 f1 m【8】更改php.ini後沒有變化
1 u0 n6 D: p, V
$ ]# j1 a) P) H7 H' g) O重新啟動web server,比如IIS,Apache等等,然後才會應用最新的設置。
+ G% f7 R! g/ ]4 C; p/ a" l* @, }) k
【9】php在2003上面安裝(ISAPI的安裝方法懇請高手指教)% r: R* }. K% S
& ^0 B- n; A: h: i, P. M: E
PHP4的php4isapi.dll好像和2003有些衝突,只能用CGI模式安裝
) O3 _9 |/ _% P* W9 _1 ~
; w% X" F# f+ i( O+ o/ J步驟一,先www.php.net 下在一個安裝程序,我是裝的是:php-4.2.3-installer.exe,你也可以去找最新的版本,在安裝php-4.2.3- installer.exe之前保證你的IIS6.0啟動了,並能夠訪問。安裝好以後,在默認網站-->應用程序配置。
8 e* g5 V$ N6 {7 f8 Z! g$ F/ [$ Q) p6 _% w; w
步驟二:點擊 web服務擴展 -->新建web服務擴展。
+ }/ z9 @, N! v, a) z, @5 {' Y, d9 x. F
步驟三: 擴展名-->php,然後添加
+ Y" B' I' G$ k; C( ?! u0 j
: C4 n* s2 W' [$ N步驟四:找到php.exe的路徑添加上去。
; r3 V& l0 e7 \9 Q% g/ C& B) r( d2 y1 O4 w* |0 A* [( {
步驟五: 確定就可以了!
% \6 |+ H: f. Y- Z& F/ h7 K
- z& ?4 U: F' E" N6 `1 X步驟六: 選擇php的服務擴展,然後點擊允許。0 j. I- M5 T7 {) y

( W! K  e0 e5 O$ P0 i  a% _【10】有時候sql語句不起作用,對數據庫操作失敗,最簡便的調試方法,echo那句sql,看看變量的值能得到不。
% s0 V4 Z( e/ O
$ D; C5 V& T7 c5 ^7 Y【11】include和require的區別; P, K2 h8 v% W7 H3 h# {5 W% k

' K9 S# b. T) ?5 {兩者沒有太大的區別,如果要包含的文件不存在,include提示notice,然後繼續執行下面的語句,require提示致命錯誤並且退出。
" N+ V* y& D: i5 t  [5 o9 P
$ {- E9 j7 q3 M  g" b1 Z( d3 K據我測試,win32平台下它們都是先包含後執行,所以被包含文件裡最好不要再有include或require語句,這樣會造成目錄混亂。或許*nux下情況不同,暫時還沒測試。
5 y3 t" }8 x6 a$ Q& g4 W6 {# P) A1 f1 G0 i& o
如果一個文件不想被包含多次可以使用include_once或require_once## 讀取,寫入文檔數據。
6 c8 C# f/ B% O9 W; }+ I# t
+ E6 [4 c* K4 YPHP 代碼:
. ~7 p: g/ m1 D- ?function r($file_name) {
. @4 e6 ]% ~0 l* ^) R$ S9 ^' ]  $filenum=@fopen($file_name,"r");- H; R! u, `2 V' Y; d3 X$ e- d
  @flock($filenum,LOCK_SH);* i1 O* v3 W! E4 z% Q! o
  $file_data=@fread($filenum,filesize($file_name));$ g" o( x/ j* g4 z- S$ ^  T- Y
  @fclose($filenum);7 |7 ], {+ v/ E' Z! _' j
  return $file_data;
# X3 [: V$ S/ V" T6 l' i}
* ?! g% K, |- T+ cfunction w($file_name,$data,$method="w"){% ~% w8 z( D1 G+ [" L
  $filenum=@fopen($file_name,$method);/ m. ^5 w5 {: U2 t' M$ J5 I
  flock($filenum,LOCK_EX);
- ^! R8 Y# m% K! p4 ]/ J  $file_data=fwrite($filenum,$data);- U3 m6 u+ q# q( v$ M; g
  fclose($filenum);5 Y1 D2 N/ k8 m& i/ S
  return $file_data;& G# J0 A2 g3 W0 o! y8 f
}  : ^" n. ?5 Z, y" y! D* k' {6 w
& k) {( k. X8 v2 I! A
【12】isset()和empty()的區別+ y6 o3 s% p. Y2 ]: s) g2 e) f

* q4 t- F2 i! B兩者都是測試變量用的,但是isset()是測試變量是否被賦值,而empty()是測試一個已經被賦值的變量是否為空。
  J. |; @+ ?$ Y# l' x* }! ]. h5 k  b2 p: H  |
如果一個變量沒被賦值就引用在php裡是被允許的,但會有notice提示,如果一個變量被賦空值,$foo=""或者$foo=0或者 $foo=false,那麼empty($foo)返回真,isset($foo)也返回真,就是說賦空值不會註銷一個變量。
) Y1 B  V% m+ f# d3 f" r
& w' h; }: M3 C, ?- j要註銷一個變量,可以用 unset($foo)或者$foo=NULL: {7 L% @1 k( O4 p) i5 A" Q" g( f

9 ~3 u5 g& R1 \3 i) S  O【13】mysql查詢語句包含有關鍵字
. T1 ~0 h; B& y  z- \# B* B
  i; P# W$ V. S( Bphp查詢mysql的時候,有時候mysql表名或者列名會有關鍵字,這時候查詢會有錯誤。例如表名是order,查詢時候會出錯,簡單的辦法是sql語句裡表名或者列名加上`[tab鍵上面]來加以區別,例如select * from `order`
7 E+ ]  h* H* Y! t9 y( J; s  r$ r; T6 V3 @; d
【14】通過HTTP協議一次上傳多個文件的方法
) i' U. X/ r* q& A
1 x6 o! `- e- ^" f有兩個思路,是同一個方法的兩種實現。具體程序還需自己去設計。
6 S7 H8 Y3 C  M# Y8 R; k$ C+ E# s( I0 F0 r) M! u0 J
1、在form中設置多個文件輸入框,用數組命名他們的名字,如下:
3 G8 s% c) [% ~1 T
- n+ q+ K; K: u5 LPHP 代碼:4 H4 _1 v- ^( X' t6 B# j+ }
<form action="" method=post>, J' [* j' b) v" ?
<input type=file name=usefile[]>. l0 k; v9 P% D4 P
<input type=file name=usefile[]>& |7 G+ x& ^' y- P: h
<input type=file name=usefile[]>
7 Y' L, q2 O/ X+ z0 V9 P9 y0 O</form>  
8 B/ F( W2 m2 i& g4 }
4 V) h2 X1 Y) s" f" I這樣,在服務器端做以下測試:' M. N# }) J, w, L) R, E* `

$ N1 {& l$ P3 k' Y' t4 {PHP 代碼:1 v' i6 D: m0 k* ~' W* R: k) ]
echo "<pre>";8 d+ P1 L7 ?, r' D& U) O3 ^, T
print_r($_FILES);7 A$ x0 Y) K) O
echo "</pre>";  * @0 ?" a* m2 e5 F% p

( |* ^( i7 S) O* D5 z1 C* y2、在form中設置多個文件輸入框,但名字不同,如下:
# {5 m! K9 b! K2 k
7 C: H: j: X5 u2 DPHP 代碼:
! v5 j- g: _* n9 Y+ ^<form action="" method=post>
2 e$ w5 H2 x: E2 H; A2 @3 `+ L3 M<input type=file name=usefile_a>5 P" ?! a; F$ z# ^* L
<input type=file name=usefile_b>; c" t2 ]1 H$ Q; R' S% t4 b
<input type=file name=usefile_c>3 |! K* P8 n. |2 X# L3 D
</form>  0 ]5 E8 v; _6 ?. h* n4 ?

: T1 ]1 r1 \0 K# Y; @9 d1 c! ]" R在服務器端做同樣測試:2 W% ~3 B" f" s; c0 @. F/ }

& R3 O( R6 b$ d5 X7 _* u) pPHP 代碼:
+ T) L" _. L) Uecho "<pre>";1 i8 k- w8 L+ C4 A: n
print_r($_FILES);
4 J% G- e- A+ j8 g9 f* N2 Recho "</pre>";

評分

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

查看全部評分

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

本版積分規則

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

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

GMT+8, 2025-4-9 06:45

By DZ X3.5

小黑屋

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