2009年1月12日

ADODB 執行插入和更新操作

在ADODB中,向數據庫插入或者更新數據,可以使用Execute()方法。在插入數據前,應該對輸入數據做必要的處理,以便被數據庫接受。

13.4.1 數據的處理

每一個數據庫有各自不同的內定日期格式。例如,MySQL使用「YYYY-MM-DD」格式,而其他數據庫則有不同的內定格式。ADODB提供DBDate()、SQLDate()等方法,轉換不同數據庫之間的日期內定格式。

關於單引號的表示法,在MySQL中可以直接使用單引號(如「Tom's home」),但在其他數據庫如Sybase、Access、Microsoft SQL Server,則用兩個單引號表示(如「Tom'』s home」)。qStr()方法可以解決此問題。

例如,在一個包含日期和字符串字段的表orders中,可以使用代碼13.10的程序插入數據。

代碼13.10 數據處理

//包含ADODB類庫

include('adodb.inc.php');

//建立Access數據庫連接

$conn = &NewADOConnection("access");

//連接到northwind主機的數據庫

$conn->PConnect("northwind");

//處理字符串中的引號

$shipto = $conn->qStr("John's Old Shoppe");

//處理當前時間

$current = $conn->DBDate(time());

$sql = "INSERT INTO orders (customerID, EmployeeID, OrderDate, ShipName)

VALUES ('ANATR', 2, $current, $shipto)";

if ($conn->Execute($sql) === false)

{

echo "數據插入錯誤:" . $conn->ErrorMsg() ;

} else {

echo "數據插入成功!" ;

}

?>

上述代碼使用連接對象中的qStr()方法處理字符串中的引號,該方法封裝了對應數據庫系統中,引號的處理方式。方法DBDate()將當前的時間,轉換為合法的日期值。

方法SQLDate()可以做的更多,如可以返回一個特定日期格式的數據。日期格式在第一個參數給出,可以包含以下字符。

* Y,4位年

* Q,季節(1~4)

* M,英文月份(Jan~Dec)

* m,月份(01~12)

* d,日期(01~31)

* H,24小時制(00~23)

* h,12小時制(1~12)

* i,分鐘(00~59)

* s,秒(00~60)

* w,星期(根據數據庫的不同,範圍為0~6或者1~7)

* l,星期(英文字符串)

* W,第幾週(對於MySQL是0~53,而對PostgreSQL或Oracle則是1~53)

* A,AM或PM指示

要查詢INSERT或UPDATE語句所影響的記錄行數,可以使用Affected_Rows()方法。如果數據庫不支持,將返回False。對於支持自增列的數據庫,在使用INSERT語句後,可以使用Insert_ID()方法返回一個增加後的序列ID。

代碼13.11是Affected_Rows()和Insert_ID()方法的使用範例。

代碼13.11 使用Affected_Rows()和Insert_ID()方法

//包含ADODB類庫

include('adodb.inc.php');

//連接數據庫

$conn = &NewADOConnection("mysql");

$conn->PConnect("test");

//處理當前時間

$current = $conn->DBDate(time());

//更新記錄

$sql = "UPDATE table SET postdate = '$current'

WHERE userId <=10";

$conn->Execute($sql);

//顯示更新記錄行數

echo "數據庫已經更新" . $conn->Affected_Rows() . "條記錄";

//新增記錄

$sql = "INSERT INTO table (username, password, postdate)

VALUES('Tom', 'Pass', '$current')";

$conn->Execute($sql);

//顯示新增記錄ID

echo "新增記錄userId為:" . $conn->Insert_ID();

?>

在上面的程序中,Affected_Rows()和Insert_ID()方法與PHP中的對應的mysql_affected_rows()和mysql_insert_id()函數的功能相似。

13.4.2 自動執行INSERT和UPDATE操作

在ADODB中還支持AutoExecute()方法,可以簡化事情的處理,自動生成相應的INSERT或者UPDATE語句並執行。其常用的語法原型如下。

mix AutoExecute($table, $arrFields, $mode, $where)

AutoExecute()方法可以指定多個參數。其中$table指定數據表名,$arrFields指定數據數組,$mode指定INSERT或UPDATE模式,$where指定了WHERE條件。其中$mod可以使用下面兩組值。

* 字符串「INSERT」或常量DB_AUTOQUERY_INSERT(值為1)

* 字符串「UPDATE」或常量DB_AUTOQUERY_UPDATE(值為2)

例如,代碼13.12是自動執行INSERT和UPDATE操作的示例。

代碼13.12 自動執行INSERT和UPDATE操作

//包含ADODB類庫

include('adodb.inc.php');

//連接數據庫

$conn = &NewADOConnection("mysql");

$conn->PConnect("test");

//數據數組

$record = array(

"product" => "吸塵器",

"code" => "SM002501",

);

$conn->AutoExecute($table, $record, "INSERT");

//執行「INSERT INTO $table (product, code) values ('吸塵器', 'SM002501')」

$record = array(

"product" => "吸塵器",

"code" => "XP002501",

"another" => "Some thing here …", //這是一條多餘字段數據,

//將會被忽略。

);

$conn->AutoExecute($table, $record, "UPDATE", "code like 'SM%'");

//執行「UPDATE $table SET product ='吸塵器', code=' XP002501'

// WHERE lastname like 'SM%'」

?>

這 段程序中,$record數組的元素和數據表的字段一致。但這不是必要的,因為AutoExecute()方法的一個強大的功能,就是能夠自動識別字段 名。AutoExecute()將首先自動取得對應表中的字段信息,從而會忽略不存在的字段數據。儘管這在執行效率上並不佔優勢,但顯然比直接給出SQL 語句方便得多。

13.4.3 生成INSERT和UPDATE查詢語句

使用AutoExecute()可以自動執行插入或更新操作。如果要生成一條INSERT或UPDATE查詢語句,可以使用下面兩個方法。

* string GetInsertSQL($table, $arrFields)

* string GetUpdateSQL($table, $arrFields, $where)

使用時,首先應生成一個「SELECT * FROM table WHERE...」查詢,製作一個字段名的拷貝,然後給定字段數據,最後自動生成更新或插入數據表的SQL語句。如果最後再執行該SQL語句,整個過程就與AutoExecute()的作用相同了。

例如,代碼13.13實現了自動插入和更新數據的操作。

代碼13.13 另一種自動執行INSERT和UPDATE操作

//包含ADODB類庫

include('adodb.inc.php');

//包含表格生成函數庫

include('tohtml.inc.php');

$conn = &ADONewConnection("mysql"); //連接數據庫

$conn->debug=1; //開啟調試

$conn->PConnect("localhost", "admin", "", "test");

//執行一個測試的查詢,返回一個空的記錄集

$sql = "SELECT * FROM adotable WHERE id = -1";

$rs = $conn->Execute($sql);

//準備一個數組,用戶插入數據

$record = array(

"product" => "熱水器 25L",

"code" => "MX2500",

"created" => time(),

);

//生成一個插入數據的SQL語句

$insertSQL = $conn->GetInsertSQL($rs, $record);

$conn->Execute($insertSQL); //執行數據插入操作

//返回剛剛插入的記錄ID

$insert_id = $conn->Insert_ID();

//給定需要修正的數據

$record["product"] = "熱水器 25L";

$record["code"] = "XP2500";

//生成一個更新數據的SQL語句

$updateSQL = $conn->GetUpdateSQL($rs, $record, "id=".$insert_id);

$conn->Execute($updateSQL); //執行更新操作

$conn->Close();

?>