有事没事来多放点。多放点就越来越专业。

13.4 执行插入和更新操作

上一篇 / 下一篇  2008-03-12 17:31:21

    

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:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

数据统计

  • 访问量: 44432
  • 日志数: 283
  • 图片数: 1
  • 建立时间: 2007-09-07
  • 更新时间: 2008-04-16

RSS订阅

Open Toolbar