亚洲成精品动漫久久精久,九九在线精品视频播放,黄色成人免费观看,三级成人影院,久碰久,四虎成人欧美精品在永久在线

掃一掃
關注微信公眾號

PHP 和 MYSQL 開發的 8 個技巧
2007-01-26   WWW.FREELAMP.COM

LAMP 架構的網站,我以前注重的多是安裝/配置方面的,講述開發的相對較少,因為自己從事開發也少。本文的原文當然也來自:

PUBLISHED ON THE O'REILLY NETWORK (HTTP://WWW.OREILLYNET.COM/)
HTTP://WWW.OREILLYNET.COM/PUB/A/ONLAMP/2002/04/04/WEBDB.HTML

看了以后,頗有啟發,以前開發中遇到的一些問題,迎刃而解。所以翻譯出來和大家共享。


1. PHP 中數組的使用
在操作數據庫時,使用關聯數組(ASSOCIATIVELY-INDEXED ARRAYS)十分有幫助,下面我們看一個基本的數字格式的數組遍歷:

<PHP
$TEMP[0] = "RICHMOND";
$TEMP[1] = "TIGERS";
$TEMP[2] = "PREMIERS";

FOR($X=0;$X<COUNT($TEMP);$X++)
{
ECHO $TEMP[$X];
ECHO " ";
}
>

然而另外一種更加節省代碼的方式是:

<PHP
$TEMP = ARRAY("RICHMOND", "TIGERS", "PREMIERS");
FOREACH ($TEMP AS $ELEMENT)
ECHO "$ELEMENT ";
>

FOREACH 還能輸出文字下標:

<PHP
$TEMP = ARRAY("CLUB" => "RICHMOND",
"NICKNAME" =>"TIGERS",
"AIM" => "PREMIERS");

FOREACH ($TEMP AS $KEY => $VALUE)
ECHO "$KEY : $VALUE ";
>
PHP 手冊中描述了大約 50 個用于處理數組的函數。

2. 在 PHP 字符串中加入變量

這個很簡單的:

<PHP
$TEMP = "HELLO"
ECHO "$TEMP WORLD";
>

但是需要說明的是,盡管下面的例子沒有錯誤:
<PHP
$TEMP = ARRAY("ONE" => 1, "TWO" => 2);
// 輸出:: THE FIRST ELEMENT IS 1
ECHO "THE FIRST ELEMENT IS $TEMP[ONE].";
>

但是如果后面那個 ECHO 語句沒有雙引號引起來的話,就要報錯,因此建議使用花括號:

<PHP
$TEMP = ARRAY("ONE" => 1, "TWO" => 2);
ECHO "THE FIRST ELEMENT IS {$TEMP["ONE"]}.";
>


3. 采用關聯數組存取查詢結果
看下面的例子:

<PHP
$CONNECTION = MYSQL_CONNECT("LOCALHOST", "ALBERT", "SHHH");
MYSQL_SELECT_DB("WINESTORE", $CONNECTION);

$RESULT = MYSQL_QUERY("SELECT CUST_ID, SURNAME,
FIRSTNAME FROM CUSTOMER", $CONNECTION);

WHILE ($ROW = MYSQL_FETCH_ARRAY($RESULT))
{
ECHO "ID: {$ROW["CUST_ID"]} ";
ECHO "SURNAME {$ROW["SURNAME"]} ";
ECHO "FIRST NAME: {$ROW["FIRSTNAME"]} ";
}
>

函數 MYSQL_FETCH_ARRAY() 把查詢結果的一行放入數組,可以同時用兩種方式引用,例如 CUST_ID 可以同時用下面兩種方式:$ROW["CUST_ID"] 或者$ROW[0] 。顯然,前者的可讀性要比后者好多了。

在多表連查中,如果兩個列名字一樣,最好用別名分開:

SELECT WINERY.NAME AS WNAME,
REGION.NAME AS RNAME,
FROM WINERY, REGION
WHERE WINERY.REGION_ID = REGION.REGION_ID;


列名的引用為:$ROW["WNAME"] 和 $ROW["RNAME"]。


在指定表名和列名的情況下,只引用列名:

SELECT WINERY.REGION_ID
FROM WINERY

列名的引用為: $ROW["REGION_ID"]。

聚集函數的引用就是引用名:

SELECT COUNT(*)
FROM CUSTOMER;

列名的引用為: $ROW["COUNT(*)"]。

4. 注意常見的 PHP BUG

常見的 PHP 糾錯問題是:

NO PAGE RENDERED BY THE WEB BROWSER WHEN MUCH MORE IS EXPECTED
A POP-UP DIALOG STATING THAT THE "DOCUMENT CONTAINS NO DATA"
A PARTIAL PAGE WHEN MORE IS EXPECTED

出現這些情況的大多數原因并不在于腳本的邏輯,而是 HTML 中存在的 BUG 或者腳本生成的 HTML 的 BUG 。例如缺少類似 </TABLE>, </FORM>, </FRAME> 之類的關閉 TAG,頁面就不能刷新。解決這個問題的辦法就是,查看 HTML 的源代碼。

對于復雜的,不能查到原因的頁面,可以通過 W3C 的頁面校驗程序 HTTP://VALIDATOR.W3.ORG/ 來分析。

如果沒有定義變量,或者變量定義錯誤也會讓程序變得古怪。例如下面的死循環:

<PHP
FOR($COUNTER=0; $COUNTER<10; $COUNTER++)
MYFUNCTION();
>

變量 $COUNTER 在增加,而 $COUNTER 永遠小于 10。這類錯誤一般都能通過設置較高的錯誤報告級別來找到:

<PHP
ERROR_REPORTING(E_ALL);

FOR($COUNTER=0; $COUNTER<10; $COUNTER++)
MYFUNCTION();
>

5. 采用 HEADER() 函數處理單部件查詢

在很多 WEB 數據庫應用中,一些功能往往讓用戶點擊一個連接后,繼續停留在當前頁面,這樣的工作我叫它“單部件查詢”。

下面是一個叫做 CALLING.PHP 的腳本:

<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.0 TRANSITIONAL//EN"
"HTTP://WWW.W3.ORG/TR/HTML4/LOOSE.DTD" >
<HTML>
<HEAD>
<TITLE>CALLING PAGE EXAMPLE</TITLE>
</HEAD>
<BODY>
<A HREF="ACTION.PHP">CLICK HERE!</A>
</BODY>
</HTML>

當用戶點擊上面的連接時,就去調用 ACTION.PHP。下面是 ACTION.PHP 的源碼:

<PHP
// 數據庫功能

// 重定向
HEADER("LOCATION: $HTTP_REFERER");
EXIT;
>

這里有兩個常見的錯誤需要提醒一下:
調用 HEADER() 函數后要包含一個 EXIT 語句讓腳本停止,否則后續的腳本可能會在頭發送前輸出。


HEADER() 函數常見的一個錯誤是:

WARNING: CANNOT ADD HEADER INFORMATION - HEADERS ALREADY SENT...

HEADER() 函數只能在 HTML 輸出之前被調用,因此你需要檢查 PHP 前面可能存在的空行,空格等等。

6. RELOAD 的問題及其解決
我以前在寫 PHP 程序時,經常碰到頁面刷新時,數據庫多處理一次的情況。
我們來看 ADDCUST.PHP:

<PHP
$QUERY = "INSERT INTO CUSTOMER
SET SURNAME = $SURNAME,
FIRSTNAME = $FIRSTNAME";
$CONNECTION = MYSQL_CONNECT("LOCALHOST", "FRED", "SHHH");
MYSQL_SELECT_DB("WINESTORE", $CONNECTION);
$RESULT = MYSQL_QUERY($QUERY, $CONNECTION);
>
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.0 TRANSITIONAL//EN"
"HTTP://WWW.W3.ORG/TR/HTML4/LOOSE.DTD" >
<HTML>
<HEAD>
<TITLE>CUSTOMER INSERT</TITLE>
</HEAD>
<BODY>
I'VE INSERTED THE CUSTOMER FOR YOU.
</BODY>
</HTML>
>
假設我們用下面的連接使用這個程序:

HTTP://WWW.FREELAMP.COM/ADDCUST.PHPSURNAME=SMITH&FIRSTNAME=FRED

如果這個請求只提交一次,OK ,不會有問題,但是如果多次刷新,你就會有多條記錄插入。
這個問題可以通過 HEADER() 函數解決:下面是新版本的 ADDCUST.PHP:

<PHP
$QUERY = "INSERT INTO CUSTOMER
SET SURNAME = $SURNAME,
FIRSTNAME = $FIRSTNAME";
$CONNECTION = MYSQL_CONNECT("LOCALHOST", "FRED", "SHHH");
MYSQL_SELECT_DB("WINESTORE", $CONNECTION);
$RESULT = MYSQL_QUERY($QUERY, $CONNECTION);
HEADER("LOCATION: CUST_RECEIPT.PHP");
>
這個腳本把瀏覽器重定向到一個新的頁面:CUST_RECEIPT.PHP:

<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.0 TRANSITIONAL//EN"
"HTTP://WWW.W3.ORG/TR/HTML4/LOOSE.DTD" >
<HTML>
<HEAD>
<TITLE>CUSTOMER INSERT</TITLE>
</HEAD>
<BODY>
I'VE INSERTED THE CUSTOMER FOR YOU.
</BODY>
</HTML>
這樣,原來的頁面繼續刷新也沒有副作用了。

7. 巧用鎖機制來提高應用性能
如果我們要緊急運行一個報表,那么,我們可以對表加寫鎖,防治別人讀寫,來提高對這個表的處理速度。

8. 用 MYSQL_UNBUFFERED_QUERY() 開發快速的腳本
這個函數能用來替換 MYSQL_QUERY() 函數,主要的區別就是 MYSQL_UNBUFFERED_QUERY() 執行完查詢后馬上返回,不需要等待或者對數據庫加鎖。

但是返回的行數不能用MYSQL_NUM_ROWS() 函數來檢查,因為輸出的結果集大小未知。

熱詞搜索:

上一篇:ASP網站黑客防范編程技巧
下一篇:網絡硬盤存儲成風 備份資料很重要

分享到: 收藏