过期域名预定抢注

 找回密碼
 免费注册

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

[複製鏈接]
發表於 2009-1-20 11:42:17 | 顯示全部樓層 |閱讀模式
【1】頁面之間無法傳遞變量 get,post,session在最新的php版本中自動全局變量是關閉的,所以要從上一頁面取得提交過來得變量要使用$_GET['foo'],$ _POST['foo'],$_SESSION['foo']來得到。當然也可以修改自動全局變量為開(php.ini改為 register_globals = On);考慮到兼容性,還是強迫自己熟悉新的寫法比較好。
! B+ }+ b* E. `( ~' [0 V# ]1 d4 e8 H3 r' k' {
【2】Win32下apache2 用get方法傳遞中文參數會出錯:
7 ^& q& e; x5 \& f9 ~
& n2 A: l. g1 \9 K0 `( j% w4 Ytest.php?a=你好&b=你也好
# x! ]. ~" [) X9 L4 }# C$ C$ H. G6 \1 u
傳遞參數是會導致一個內部錯誤) q9 N; G& d. r
( P5 y% r6 z6 k2 c0 I
解決辦法:"test.php?a=".urlencode(你好)."&b=".urlencode(你也好)/ y. d0 F- z5 N# i- z* E

( [, f% i% t7 M+ r$ m.............
4 j3 u' K" ?! E. p) n
9 T$ u7 I% ~6 t0 d: }3 P, p: U【3】win32下的session不能正常工作5 w. k0 f: f5 B

+ q! u5 f/ a8 k! j0 ]' Jphp.ini默認的session.save_path = /tmp, C6 k9 _5 a3 B% F0 Y/ Q# T7 }) c7 F
6 d( o6 V5 u6 r1 l  m
這顯然是linux下的配置,win32下php無法讀寫session文件導致session無法使用,把它改成一個絕對路徑就可以了,例如session.save_path = c:windows emp: J. c1 ]9 G5 U- Z

: n& ]' Y. N/ B* R2 S$ a! F【4】顯示錯誤信息
; `) G  C( c0 M! e" s
+ C" t& F: @+ l. ]" w% H當php.ini的display_errors = On並且error_reporting = E_ALL時,將顯示所有的錯誤和提示,調試的時候最好打開以便糾錯,如果你用以前php寫法錯誤信息多半是關於未定義變量的。變量在賦值以前調用會有提示,解決辦法是探測或者屏蔽。8 z; F7 Q, F9 A1 E

4 w8 D0 h3 `3 E$ E" ^" C例如顯示$foo,可以if(isset($foo)) echo $foo 或者echo @$foo
; t1 x; t' |9 L# Q8 g) p. W3 A/ P: \$ B
【5】Win32下mail()不能發送電子郵件
+ M- w) [: }$ e1 h! S2 R: \$ `. d$ p7 l6 _) A4 i" ^
在linux下配置好的sendmail可以發送,在win32下需要調用smtp服務器來發送電子郵件,修改php.ini的SMTP = ip //ip是不帶驗證功能的smtp服務器(網上很難找到)
( \. ~! n, Q3 x; ]) D: c. p# H' z+ ]  I' t0 J  a& F4 `
php發送郵件的最好解決方法是用socket直接發送到對方email服務器而不用轉發服務器。
, V7 F7 V+ w8 c6 A1 {) R8 Q" X4 X) f. P: _4 B3 t; H4 U
【6】初裝的mysql如果沒有設置密碼,應該使用update mysql.user set password="yourpassword" where user="root" 修改密碼
: ~8 y% a1 H0 n
' E9 v- @, {" `【7】header already sent6 g0 e3 ]# J6 I3 q

1 n& a0 l' {$ O這個錯誤通常會在你使用HEADER的時候出現,他可能是幾種原因:1,你在使用HEADER前PRING或者ECHO了2.你當前文件前面有空行3.你可能INCLUDE了一個文件,該文件尾部有空行或者輸出也會出現這種錯誤。!
) k0 [  e! m6 f& T
% H1 w3 c3 h& c1 x# b- e【8】更改php.ini後沒有變化
, s* R$ I, Q2 M7 I% W- V
4 Z% e# Q7 X; L( y! q重新啟動web server,比如IIS,Apache等等,然後才會應用最新的設置。
1 l! d6 y! `4 c3 p8 `/ s% \* _$ l+ n
【9】php在2003上面安裝(ISAPI的安裝方法懇請高手指教)2 j  S" M9 E: N6 n! R7 P/ d
" L0 y; u3 ?& [$ j4 a2 r
PHP4的php4isapi.dll好像和2003有些衝突,只能用CGI模式安裝3 J' a1 J' _; Y/ H

9 Q( r( X7 A9 H: l步驟一,先www.php.net 下在一個安裝程序,我是裝的是:php-4.2.3-installer.exe,你也可以去找最新的版本,在安裝php-4.2.3- installer.exe之前保證你的IIS6.0啟動了,並能夠訪問。安裝好以後,在默認網站-->應用程序配置。, J4 Y  o7 ?: m, h* A) v
( Z* N" ]& t7 J5 R
步驟二:點擊 web服務擴展 -->新建web服務擴展。6 a7 T* t, R, C+ Z6 B) x. G; y
- A0 F2 t. ~4 \6 h( B' X& q
步驟三: 擴展名-->php,然後添加
0 g" A$ V6 P8 e1 x. O3 b0 F; Y0 @
: Q0 _4 g$ D: S2 M9 K步驟四:找到php.exe的路徑添加上去。: Q' F$ O' K8 V8 H& K5 b
" Q. t5 g  R+ P; C# s+ e
步驟五: 確定就可以了!
7 X7 q6 ]) ]; a% _4 E  q
% P. O) G* m$ M& V1 K5 {; W步驟六: 選擇php的服務擴展,然後點擊允許。/ y! a  l: K. E, d4 U
& h5 q: A+ C9 @- C9 _. a
【10】有時候sql語句不起作用,對數據庫操作失敗,最簡便的調試方法,echo那句sql,看看變量的值能得到不。
6 q7 L. W/ `& U/ y0 M+ G" ^$ R8 P' ?. s, l8 u# Y- g' f! s
【11】include和require的區別
; `9 R2 j$ X" [# [; H$ E9 q, z4 m* y
兩者沒有太大的區別,如果要包含的文件不存在,include提示notice,然後繼續執行下面的語句,require提示致命錯誤並且退出。. K5 A- c! i  p* B1 M
8 ^+ G8 |0 \2 Y/ h' \
據我測試,win32平台下它們都是先包含後執行,所以被包含文件裡最好不要再有include或require語句,這樣會造成目錄混亂。或許*nux下情況不同,暫時還沒測試。
5 ^0 Y$ y' X0 L$ }2 i1 F! Q8 i  O% T. ~) p$ H3 E  [4 Q7 C3 }/ p: _& z; v9 J
如果一個文件不想被包含多次可以使用include_once或require_once## 讀取,寫入文檔數據。
0 W* a, J( u8 O0 J3 T$ X9 v$ f- K+ F- F' e3 a) o
PHP 代碼:( c. A4 T8 T6 j0 L
function r($file_name) {
- J& d  ?1 p) W1 Y  $filenum=@fopen($file_name,"r");
; w/ l  |2 l$ N8 F* F) U  @flock($filenum,LOCK_SH);$ ~7 u/ V7 p0 T8 W+ K
  $file_data=@fread($filenum,filesize($file_name));
4 n; U) P6 z2 Q6 H8 W% x& w+ f1 q' W  @fclose($filenum);- T# O. S$ a" z* o% e" u
  return $file_data;
" R& a% G/ J2 C& v3 f* e; p}
$ t( J3 a; P. N% t- Tfunction w($file_name,$data,$method="w"){
$ [+ `* D" u) Y# }  $filenum=@fopen($file_name,$method);% y% x2 P( U- j
  flock($filenum,LOCK_EX);
, r: l5 Y1 y! p* ?4 V  $file_data=fwrite($filenum,$data);- U& v0 k# W* U+ L* F. k+ f- `5 p
  fclose($filenum);
; j) E& u% S) b! M/ N, \) a  return $file_data;
# m3 F6 |3 J3 ^  f}  
0 K/ p. R) }, G( Y/ K% n9 f
/ y% E" P2 t8 h【12】isset()和empty()的區別) R: H" d/ n- [% e# S! b
) _! t9 \& f3 L3 k* G/ y0 N: @# t
兩者都是測試變量用的,但是isset()是測試變量是否被賦值,而empty()是測試一個已經被賦值的變量是否為空。6 H: ]( g1 b+ l: p$ E0 ~! [7 ?
2 I) X7 @* a' E% H: \) F+ m( a
如果一個變量沒被賦值就引用在php裡是被允許的,但會有notice提示,如果一個變量被賦空值,$foo=""或者$foo=0或者 $foo=false,那麼empty($foo)返回真,isset($foo)也返回真,就是說賦空值不會註銷一個變量。
; H; g9 ]$ W7 w. K. P
9 T2 U  \* e! C$ s* d9 \要註銷一個變量,可以用 unset($foo)或者$foo=NULL
2 O" L! Z4 a0 g! f  s& T9 n7 v# @6 |1 B: t" @% ^! k3 J; Y, W
【13】mysql查詢語句包含有關鍵字
$ l: B8 r. m- y; f/ l, p$ b8 B& c3 }% x0 H- z* N
php查詢mysql的時候,有時候mysql表名或者列名會有關鍵字,這時候查詢會有錯誤。例如表名是order,查詢時候會出錯,簡單的辦法是sql語句裡表名或者列名加上`[tab鍵上面]來加以區別,例如select * from `order`# V# L) y0 C5 b7 D8 P/ z
5 K- L7 {. H, k
【14】通過HTTP協議一次上傳多個文件的方法- }, a& }: S' |9 A' s& L" W

% {" K/ u/ n0 E/ Z4 @有兩個思路,是同一個方法的兩種實現。具體程序還需自己去設計。1 t0 ~% `2 F8 a
) O, b1 n* R  N9 R, c0 M
1、在form中設置多個文件輸入框,用數組命名他們的名字,如下:
+ i% h3 ~. o, u9 @) U3 x8 o% \
; \" E. a$ p0 \  @1 W4 qPHP 代碼:
. K9 O# E- z: Z  O$ g, q; i4 p/ r<form action="" method=post>/ ?, g: e; W# x9 d' Z0 A4 Y
<input type=file name=usefile[]>
" |/ y) Y0 _: z, g2 S7 E" ^<input type=file name=usefile[]>
# l; S+ N' _( E, w- D  M<input type=file name=usefile[]>+ g9 W$ Y. p- x2 K' \; ]3 V
</form>  
5 j8 I2 o- M% k8 L! F
$ ~3 |6 l! O/ V; k# O這樣,在服務器端做以下測試:2 k4 a/ S. O* l
) ]' Q# L, Z: _! o; ?0 R
PHP 代碼:0 b: g, H( H4 t$ X4 o, J2 q
echo "<pre>";5 H5 c9 r: {& k6 w
print_r($_FILES);
8 w; d0 B" U: w) Eecho "</pre>";  
) b$ R3 v' r+ y; ~# D! \, @% g& O2 f: \  T& A0 I. Z2 P
2、在form中設置多個文件輸入框,但名字不同,如下:+ K# M6 N9 Y$ \4 V; B

9 p" O) }1 p$ y0 ~7 D* Q- lPHP 代碼:, l% \6 p0 M, p
<form action="" method=post>, z/ p# \% `7 u2 M4 h
<input type=file name=usefile_a>9 ~" L. T& ^3 s; h* _4 A- l1 E
<input type=file name=usefile_b>7 u" @9 V4 g6 m# t" i
<input type=file name=usefile_c>
$ W3 J, u# \/ U5 e% u* L</form>  
1 Q/ d9 p1 W# y1 Q) \8 f
, y% a$ x- _+ l% A2 F& g在服務器端做同樣測試:1 N8 x  k+ y) ~9 q. F( f
- s/ f# a+ L+ {/ A+ S
PHP 代碼:
3 @0 Z( X: S) m: r5 d& ~echo "<pre>";
& d$ M$ M7 T$ j* g4 T" f( ^# ]print_r($_FILES);9 A$ t7 ^. P5 o
echo "</pre>";

評分

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

查看全部評分

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

本版積分規則

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

點基

GMT+8, 2026-5-22 00:23

By DZ X3.5

小黑屋

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