现在有一个pgsql,用pdo连接的,用exec()方法执行update命令(如UPDATE XXX SET  WHERE mobile='110';),但这条语句明明影响行数是0(在本地数据库客户端已测试),但是返回值却是1!这是怎么回事?

解决方案 »

  1.   

    <?php
    //设置脚本运行时间为不限制
    set_time_limit(0); //用PDO创建mysql连接
    try {
    $msLink = new PDO('mysql:host=192.168.3.237; dbname=ecardv1-5', 'root', 'mysql526418');
    }catch(Exception $e) {
    echo $e->getMessage();
    }

    //用PDO创建pgsql连接
    try {
    $pgLink = new PDO('pgsql:host=192.168.1.23 port=6543 dbname=crm user=crm password=yazuo');
    }catch(Exception $e) {
    echo $e->getMessage();
    } $msLink->query('set names utf8;');

    //提取cusomber表中的数据,每次取500条,分2428次取完
    for($i=0; $i<2428; $i++) {
    $offset = $i * 500;
    $sql = "SELECT * FROM customer LIMIT {$offset}, 500";
    //echo $sql;
    $stmt = $msLink->query($sql);

    //将提取到的数据遍历,每遍历一次就更新一次trade.membership表中的数据
    while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    $mobile = $row['mobile'];
    if($row['sex'] == '男') {
    $gender = 1;
    }else {
    $gender = 2;
    }
    $birth_type = $row['birthdayType'];
    $name = $row['name'];
    $birthday = $row['birthday'];
    $email = $row['email'];
    $join_date = $row['activeDate'];
    $status = $row['state'];
    $address = $row['postalAddress'];
    $id_number = $row['identityCode'];
    $postcode = $row['postalcode'];
    $phone = $row['phone'];
    $type_id = $row['identityType'];

    $sql = "UPDATE trade.membership SET gender={$gender}, birth_type={$birth_type}, name='{$name}', 
    birthday='{$birthday}', email='{$email}', join_date='{$join_date}', status={$status}, address='{$address}',
    id_number='{$id_number}', postcode='{$postcode}', phone='{$phone}', type_id={$type_id} WHERE mobile='{$mobile}'";

    $result = $pgLink->exec($sql);

    if($result) {
    echo $result.'&nbsp;&nbsp;&nbsp;'.$sql.'<br />';
    }
    }
    }
      

  2.   

    不知道你想要什么?
    如果 exec 总是返回 0,那么你那一堆代码不就什么也没做吗?
      

  3.   

    if($result) {
       echo $result.'&nbsp;&nbsp;&nbsp;'.$sql.'<br />';
    }
    这句话就是说当有“影响行数”的时候,才输出下面这条语句,但现在的问题是,$result这个变量总是1,就是说当上面那个update语句没有影响行数的时候,这个$result的值也是1,按说这个时候应该返回的是0啊。
      

  4.   

    用if ($result)来做判断是错误的.
    得使用 mysqli_stmt::affected_rows -- mysqli_stmt_affected_rows 来做判断.当然我不清楚pdo.这里是mysqli
      

  5.   

    mysqli是那样的,pdo::exec()方法返回的结果就是受影响行数。
      

  6.   

    把SQL打印出来,放数据库里面去试试吧。
      

  7.   

    你直接 $result 也等于  1 吗?
    if($result===false) {
    echo $result.'&nbsp;&nbsp;&nbsp;'.$sql.'<br />'; //这样还会被执行吗?
    }
      

  8.   

    是的!直接输出$result也是1,用var_dump($result)显示int(1)
      

  9.   

    你这个人好奇怪!
    只要是条件 mobile='{$mobile}' 成立,就会有至少一条记录被修改,也就是 $pgLink->exec($sql) 大于等于 1
    返回 0 就说明相应的记录不存在何况你的代码中并没有处理返回 0 时的情况
      

  10.   

    哥们你没理解我的意思!它现在只有返回1的时候才输出$sql语句,在这些语句里有好多是mobile='{$mobile}'没匹配成功的,我不知道我说明白了吗???
      

  11.   

    也就是说有好多mobile='{$mobile}'没匹配成功的,但是却输出了,我就是这不明白
      

  12.   

    你并没有说明你的需求
    我只能根据你的代码来推测你想干什么既然是想找到 有好多是mobile='{$mobile}'没匹配成功的
    就应该写作if(! $result) {
      echo $result.'&nbsp;&nbsp;&nbsp;'.$sql.'<br />';
    }
      

  13.   

    不好意思~我实在是不知道该怎么描述这个问题。
    这样说吧,我现在想要实现的功能已经都实现了,这个问题就是无意间发现的很好奇。
    这个程序大概这样:
    Mysql中的表有100多W条数据,pgSQL中的表有50多W条,pgSQL中有的行在Mysql中都有,但因为pgSQL中有很多列的值是空的,所以需要从Mysql表中提取出相对应的值,然后更新到pgSQL的表中。这两个表的联结列是mobile,所以我在更新的时候用的是mobile={$mobile}。我那个if($result)就是想看下有哪些数据被更新了,但是没想到,有好多mobile={$mobile}没有匹配成功的也被输出了,所以很纳闷,上来问的这个问题。