13.4 执行插入和更新操作
13.4 执行插入和更新操作
在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 数据处理
<?php
//包含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()方法
<?php
//包含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操作
<?php
//包含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操作
<?php
//包含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();
?>
上面的程序可以分为几个部分:首先执行一个测试用的查询操作,可以不必返回任何纪录,主要用于获取表中的全部字段名;然后使用一个GetInsertSQL()生成一个INSERT语句,执行后,用Insert_ID()方法可以获得新增的id值;最后针对该记录使用GetUpdateSQL()生成一个UPDATE语句,并执行。
| 在使用AutoExecute()或GetUpdateSQL()方法实现数据表更新操作时,不要忘记给出必要的查询条件。另外,GetInsertSQL()和GetUpdateSQL()方法需要手动地进行一次数据库查询,以获得数据表的字段信息;而对于AutoExecute()方法,这一步骤是自动完成的。所以,AutoExecute()方法是简单快捷的。 |
TAG:
