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();
?>