五個常見 PHP 資料庫問題(轉)

ba發表於2007-08-16
五個常見 PHP 資料庫問題(轉)[@more@]揭露 PHP 應用程式中出現的五個常見資料庫問題 —— 包括資料庫模式設計、資料庫訪問和使用資料庫的業務邏輯程式碼 —— 以及它們的解決方案。
如果只有一種 方式使用資料庫是正確的……

您可以用很多的方式建立資料庫設計、資料庫訪問和基於資料庫的 PHP 業務邏輯程式碼,但最終一般以錯誤告終。本文說明了資料庫設計和訪問資料庫的 PHP 程式碼中出現的五個常見問題,以及在遇到這些問題時如何修復它們。

問題 1:直接使用 MySQL

一個常見問題是較老的 PHP 程式碼直接使用 mysql_ 函式來訪問資料庫。清單 1 展示瞭如何直接訪問資料庫。

清單 1. Access/get.php
function get_user_id( $name )
{
$db = mysql_connect( 'localhost', 'root', 'password' );
mysql_select_db( 'users' );

$res = mysql_query( "SELECT id FROM users WHERE login='".$name."'" );
while( $row = mysql_fetch_array( $res ) ) { $id = $row[0]; }

return $id;
}

var_dump( get_user_id( 'jack' ) );
?>

注意使用了 mysql_connect 函式來訪問資料庫。還要注意查詢,其中使用字串連線來向查詢新增 $name 引數。

該技術有兩個很好的替代方案:PEAR DB 模組和 PHP Data Objects (PDO) 類。兩者都從特定資料庫選擇提供抽象。因此,您的程式碼無需太多調整就可以在 IBM® DB2®、MySQL、PostgreSQL 或者您想要連線到的任何其他資料庫上執行。

使用 PEAR DB 模組和 PDO 抽象層的另一個價值在於您可以在 SQL 語句中使用 ? 運算子。這樣做可使 SQL 更加易於維護,且可使您的應用程式免受 SQL 注入攻擊。

使用 PEAR DB 的替代程式碼如下所示。

清單 2. Access/get_good.php
require_once("DB.php");

function get_user_id( $name )
{
$dsn = 'mysql://root:password@localhost/users';
$db =& DB::Connect( $dsn, array() );
if (PEAR::isError($db)) { die($db->getMessage()); }

$res = $db->query( 'SELECT id FROM users WHERE login=?',
array( $name ) );
$id = null;
while( $res->fetchInto( $row ) ) { $id = $row[0]; }

return $id;
}

var_dump( get_user_id( 'jack' ) );
?>

注意,所有直接用到 MySQL 的地方都消除了,只有 $dsn 中的資料庫連線字串除外。此外,我們透過 ? 運算子在 SQL 中使用 $name 變數。然後,查詢的資料透過 query() 方法末尾的 array 被髮送進來。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-960524/,如需轉載,請註明出處,否則將追究法律責任。

相關文章