【1】頁面之間無法傳遞變量 get,post,session在最新的php版本中自動全局變量是關閉的,所以要從上一頁面取得提交過來得變量要使用$_GET['foo'],$ _POST['foo'],$_SESSION['foo']來得到。當然也可以修改自動全局變量為開(php.ini改為 register_globals = On);考慮到兼容性,還是強迫自己熟悉新的寫法比較好。
' P2 ~/ S {+ q$ {; n' ^; e' r5 O( h
+ ]% N; @! n y t" E【2】Win32下apache2 用get方法傳遞中文參數會出錯:/ h0 z2 f w/ i- H; t
0 q b; l9 M( e qtest.php?a=你好&b=你也好
\; V3 R) E a C8 H( }% Q( }5 S/ ~$ P$ W9 C% I! P5 I
傳遞參數是會導致一個內部錯誤' `6 G1 [, {# d% O: k$ ^" d
3 y' F2 W6 b: w8 y- H+ L解決辦法:"test.php?a=".urlencode(你好)."&b=".urlencode(你也好)- Q; l, L) h2 D- ]
4 j, h( S7 o! a
.............) m* Q$ k3 V; A8 w# N3 x
: p5 _* @ j& l, j3 ?$ N4 h5 Y【3】win32下的session不能正常工作3 N# q. L5 z7 f" K+ o
9 {! g1 Q+ L/ n. F; U9 G( Q. Lphp.ini默認的session.save_path = /tmp
( Y% F: H9 e1 @2 }4 u9 `4 R- o# \
' }1 I1 A0 U& x; G% w! V* l9 h& e這顯然是linux下的配置,win32下php無法讀寫session文件導致session無法使用,把它改成一個絕對路徑就可以了,例如session.save_path = c:windows emp; P: Q8 \; l4 U3 W0 H5 G
" E. R) B( E% R' S
【4】顯示錯誤信息
9 J6 O; N) F" K) a# J# n) ~& Q& P+ Q" n. E
當php.ini的display_errors = On並且error_reporting = E_ALL時,將顯示所有的錯誤和提示,調試的時候最好打開以便糾錯,如果你用以前php寫法錯誤信息多半是關於未定義變量的。變量在賦值以前調用會有提示,解決辦法是探測或者屏蔽。* @! s+ R* w8 `
- r Z1 W8 f& |例如顯示$foo,可以if(isset($foo)) echo $foo 或者echo @$foo
, e& l. ?5 a: x( e) s- [ n. p6 [8 `5 _) c* ?
【5】Win32下mail()不能發送電子郵件
( t- \ ~2 ?& J8 E6 X, X1 ~- W4 f, b v3 n) ?* q/ P& f2 B) m4 u% }
在linux下配置好的sendmail可以發送,在win32下需要調用smtp服務器來發送電子郵件,修改php.ini的SMTP = ip //ip是不帶驗證功能的smtp服務器(網上很難找到)
$ n% d( L! ]4 O7 t
) a% D7 p+ U; F. hphp發送郵件的最好解決方法是用socket直接發送到對方email服務器而不用轉發服務器。
E) W( w) |% o4 J# f' C3 B# N9 p1 p* h! \* }5 X
【6】初裝的mysql如果沒有設置密碼,應該使用update mysql.user set password="yourpassword" where user="root" 修改密碼6 P* n3 {6 m. u
% ^* _7 r9 f' n9 n
【7】header already sent
0 ^3 x( \- _) m! X% h8 L1 e' F* R. v1 _2 B
這個錯誤通常會在你使用HEADER的時候出現,他可能是幾種原因:1,你在使用HEADER前PRING或者ECHO了2.你當前文件前面有空行3.你可能INCLUDE了一個文件,該文件尾部有空行或者輸出也會出現這種錯誤。!) i9 Y, r& F- K: H+ n, u
6 F# W2 [# ^9 N
【8】更改php.ini後沒有變化
* r- M" E3 F) M: M i
3 I9 D$ _- a" l重新啟動web server,比如IIS,Apache等等,然後才會應用最新的設置。1 j# l1 m7 c8 x& n) I7 y
: d, D7 z. b7 J: v3 {* N【9】php在2003上面安裝(ISAPI的安裝方法懇請高手指教)
" N% k4 Z6 E: F1 T, D. y" L% z0 ]1 U s. x5 u
PHP4的php4isapi.dll好像和2003有些衝突,只能用CGI模式安裝' X0 \/ m" M7 M* B p8 j6 `
* V+ a/ u5 N3 W0 g
步驟一,先www.php.net 下在一個安裝程序,我是裝的是:php-4.2.3-installer.exe,你也可以去找最新的版本,在安裝php-4.2.3- installer.exe之前保證你的IIS6.0啟動了,並能夠訪問。安裝好以後,在默認網站-->應用程序配置。
" `0 m s9 G, z, {
: P, i3 |+ o9 `6 I8 `+ {9 H. L步驟二:點擊 web服務擴展 -->新建web服務擴展。
* V7 J3 p3 q$ R% E7 s
/ V/ {$ B9 Z* w5 u" s# `0 R步驟三: 擴展名-->php,然後添加
$ E+ J7 |: {8 y* I. O* S
+ K" O; M9 I! d+ G* f! t( \( x$ {步驟四:找到php.exe的路徑添加上去。; `: H' i" U: ]/ I4 c# E
" g6 ?) {8 J5 m' W }' ^7 B T
步驟五: 確定就可以了!
0 r; P! H% ]0 |3 V ~; _# _. s! U0 c* J* i* j
步驟六: 選擇php的服務擴展,然後點擊允許。
) X, P# j* Q- l0 n: n% y7 ]1 N3 I' s. B! S: @1 ]
【10】有時候sql語句不起作用,對數據庫操作失敗,最簡便的調試方法,echo那句sql,看看變量的值能得到不。: G! P9 m& X- L% G, w% U& j8 O
& C" F, b; Z5 T4 ]【11】include和require的區別
7 R. b" e7 J# _: m4 \& A% k6 j% D6 h5 S2 i! X
兩者沒有太大的區別,如果要包含的文件不存在,include提示notice,然後繼續執行下面的語句,require提示致命錯誤並且退出。
' n! Q/ u" n6 T5 J( E0 I& p2 b1 D3 @! s( }" ]) Q
據我測試,win32平台下它們都是先包含後執行,所以被包含文件裡最好不要再有include或require語句,這樣會造成目錄混亂。或許*nux下情況不同,暫時還沒測試。% O( ], R1 r0 R+ o
* v3 ~8 ~' x7 t- v
如果一個文件不想被包含多次可以使用include_once或require_once## 讀取,寫入文檔數據。$ C1 z% |# I7 v* L, J+ @* u
5 y, `6 n3 M+ ?3 C* [8 x
PHP 代碼:( K9 r N, b! M, ?/ o
function r($file_name) {
0 Y' U7 i) Q1 Q7 Q, }+ a4 s3 U $filenum=@fopen($file_name,"r");
* q' k) M9 c" F @flock($filenum,LOCK_SH);1 N( H+ _2 t" N
$file_data=@fread($filenum,filesize($file_name));
7 a3 S/ g" _. o7 @3 G @fclose($filenum);
; r9 b% |$ u7 }& g2 H; Q9 L return $file_data;' i0 a+ u% w& X! O3 O4 a
}7 L4 y' x0 f4 ^# ]# X ~6 t7 {
function w($file_name,$data,$method="w"){
$ H) o8 {5 s n4 _4 h& u9 t1 ` $filenum=@fopen($file_name,$method);/ K9 M8 B! m; \
flock($filenum,LOCK_EX);! U/ a U, q0 Q7 K, |
$file_data=fwrite($filenum,$data);
" Q/ \- v9 m5 F2 l; m$ d fclose($filenum);
7 y9 T2 K/ C* R: W# d( Y return $file_data;
" \9 B/ c' O3 W* s! k2 Y} 2 N$ e/ U/ r: }/ O7 m
9 ?& X2 C( e5 J1 Y; E6 G& ^* {1 W
【12】isset()和empty()的區別/ Z5 |. g9 N$ ~' i6 i+ \2 P
8 U3 A9 {+ n. D1 h( h兩者都是測試變量用的,但是isset()是測試變量是否被賦值,而empty()是測試一個已經被賦值的變量是否為空。
4 Q+ d+ F5 E& r; v9 t+ X' r$ E# ?2 A. T8 q+ c: R. y+ m
如果一個變量沒被賦值就引用在php裡是被允許的,但會有notice提示,如果一個變量被賦空值,$foo=""或者$foo=0或者 $foo=false,那麼empty($foo)返回真,isset($foo)也返回真,就是說賦空值不會註銷一個變量。& m; |# f0 P+ Z
) w& B9 [7 ?. g6 p0 F7 P1 f9 O
要註銷一個變量,可以用 unset($foo)或者$foo=NULL% q% o3 P/ n, l. @/ R
; R4 A" |0 B, s b【13】mysql查詢語句包含有關鍵字
# O! b6 n$ B& k2 n1 J1 z% v0 [' }! H2 q& S4 _* c; U
php查詢mysql的時候,有時候mysql表名或者列名會有關鍵字,這時候查詢會有錯誤。例如表名是order,查詢時候會出錯,簡單的辦法是sql語句裡表名或者列名加上`[tab鍵上面]來加以區別,例如select * from `order`
# ?2 y) m3 ~( x* {' R4 e6 H! s) F9 I6 ?8 g$ E$ z ?0 @) d/ Q
【14】通過HTTP協議一次上傳多個文件的方法& _3 N ?& g$ F
3 t# E9 q, a0 E3 x W5 U有兩個思路,是同一個方法的兩種實現。具體程序還需自己去設計。
5 P+ w0 v. i- z8 c8 D" a2 O+ w1 D8 s: @
1、在form中設置多個文件輸入框,用數組命名他們的名字,如下:
" y& o7 x: J+ ^
" Z2 _- e1 J" ]5 ~7 L/ s! Y$ I7 j! `PHP 代碼:
. [; b! }6 u% L8 t. {0 c<form action="" method=post>6 N2 |; R/ x; `4 [. M
<input type=file name=usefile[]>2 |0 [4 Y# F S, x
<input type=file name=usefile[]>
! C/ a: t3 x& L# P8 J3 V<input type=file name=usefile[]>
0 s) I( [2 S9 z1 P3 M" a5 G</form>
- n: G! A! E4 T; [) E- `* n* }. R [0 O, X4 r6 y4 j+ c" N
這樣,在服務器端做以下測試:
2 m3 O. `. H+ G# K% w0 X0 G: Q/ o/ z. H
PHP 代碼:9 b) _( u* p' v0 L
echo "<pre>";
& e9 n( y$ b0 Eprint_r($_FILES);; @( a; F* N+ V) ?% ?5 p
echo "</pre>";
2 l) [* z% n( X0 K5 b+ r( ^2 U
( c" y' Z3 }( M! K1 \6 B: u% U$ [2、在form中設置多個文件輸入框,但名字不同,如下:
) ~9 V) U. w$ x4 l5 `
$ G1 j$ [. y! l& y. K7 c, {, V+ F4 UPHP 代碼:* |0 ?4 ~6 y! J7 ~2 G, Y8 g
<form action="" method=post>
; Q) _, t. X. m0 b<input type=file name=usefile_a># P$ u$ K( R5 s+ d. e3 X
<input type=file name=usefile_b>; M3 b! `9 {) v/ D, j: S, Z
<input type=file name=usefile_c>/ b; L; Q: M3 I8 k- ?
</form>
) G6 }' c$ U5 C: p) q& |6 \" l4 b' e8 f2 |6 W4 y
在服務器端做同樣測試:( Z. ^& C: p+ n
9 u* q. C! ~5 \- I5 L7 o
PHP 代碼:
# I- A/ M6 d& P4 Recho "<pre>";" R Q# m- W$ F- C
print_r($_FILES);# s% a( I* H1 O" Z; h; A
echo "</pre>"; |
評分
-
查看全部評分
|