//设置脚本运行时间为不限制
set_time_limit(0);

//用PDO创建pgsql连接
try {
$pgLink = new PDO('pgsql:host=localhost port=5432 dbname=db2 user=root password=111111');
}catch(Exception $e) {
echo $e->getMessage();
}//定义SQL修改语句
$sql = "UPDATE trade.membership SET gender=1, birth_type=0, name='wsy', birthday='2011-01-01', email='', join_date='2011-01-02', status=1, address='aaaa',id_number='25454', postcode='100031', phone='666', type_id=1 WHERE mobile='110';"; //执行SQL语句
$result = $pgLink->exec($sql);//输出SQL结果
echo $result.'  '.$sql;输出结果:
1   UPDATE trade.membership SET gender=1, birth_type=0, name='wsy', birthday='2011-01-01', email='', join_date='2011-01-02', status=1, address='aaaa', id_number='25454', postcode='100031', phone='666', type_id=1 WHERE mobile='110';问题是这样:
这个表里压根就没有mobile='110'这一行,将$sql语句拿到本地SQL服务器上运行也是“0条影响行数”。
但在程序里的结果为什么是“1”?PDO::exec()的输出结果不应该是增删改的受影响行数吗?

解决方案 »

  1.   

    PDO::exec()
    PDO->exec() — Execute an SQL statement and return the number of affected rows,返回的结果应该是sql语句影响的行数。
      

  2.   

    是啊我帖子里不是写了“PDO::exec()的输出结果不应该是增删改的受影响行数吗”了吗~~~~
    我的问题是,这条SQL语句应该没有影响到行,为什么还会返回1呢?
      

  3.   

    这个应该是PDO的一个BUG,用预处理做然后用PDO::rowCount()可以正确处理。
      

  4.   

    //实例化对象
    $pdo = new PDO($db,DB_USER,DB_PWD);
    //设置报错方式
    $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

    //数据表
    /*create table account(
    id int auto_increment primary key not null, -- 帐户id
    money double not null --金额
    );
    insert into account (id,money) values (1,1000);
    insert into account (id,money) values (2,500);
    */

    //开启事务
    $pdo->beginTransaction();

    //从帐户中,转钱到一个不存在的帐户
    $count=0;
    $count+=$pdo->exec("update account set money=money-300 where id=1");
    $count+=$pdo->exec("update account set money=money+300 where id=3"); //根据受影行数,判断是否成功
    if($count==2){
    //提交事务
    $pdo->commit();
    echo "转帐成功<br>";
    }else{
    //回滚事务
    echo "转帐失败<br>";
    $pdo->rollBAck();
    }===================================
    以上代码输出   转帐失败
    转帐失败,事务被回滚。
    exec()方法返回受影响行数。没有问题。