使用PDO方式修改数据库的问题。

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

17 个解决方案

#1


代码代码

#2


<?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 />';
}
}
}

#3


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

#4


引用 3 楼 xuzuning 的回复:
不知道你想要什么?
如果 exec 总是返回 0,那么你那一堆代码不就什么也没做吗?

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

#5


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

#6


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

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

#7


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

#8


引用 7 楼 joking520 的回复:
把SQL打印出来,放数据库里面去试试吧。

试了,放到数据库里试就是“0条受影响行数”。。。

#9


你直接 $result 也等于  1 吗?


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


#10


引用 9 楼 joking520 的回复:
你直接 $result 也等于 1 吗?


PHP code


if($result===false) {
echo $result.'&amp;nbsp;&amp;nbsp;&amp;nbsp;'.$sql.'<br />'; //这样还会被执行吗?
}

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

#11


该回复于2011-09-15 13:18:54被版主删除

#12


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

何况你的代码中并没有处理返回 0 时的情况

#13


同上。。

#14


引用 12 楼 xuzuning 的回复:
你这个人好奇怪!
只要是条件 mobile='{$mobile}' 成立,就会有至少一条记录被修改,也就是 $pgLink->exec($sql) 大于等于 1
返回 0 就说明相应的记录不存在

何况你的代码中并没有处理返回 0 时的情况

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

#15


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

#16


你并没有说明你的需求
我只能根据你的代码来推测你想干什么

既然是想找到  有好多是mobile='{$mobile}'没匹配成功的
就应该写作

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

#17


引用 16 楼 xuzuning 的回复:
你并没有说明你的需求
我只能根据你的代码来推测你想干什么

既然是想找到 有好多是mobile='{$mobile}'没匹配成功的
就应该写作

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

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

#1


代码代码

#2


<?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 />';
}
}
}

#3


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

#4


引用 3 楼 xuzuning 的回复:
不知道你想要什么?
如果 exec 总是返回 0,那么你那一堆代码不就什么也没做吗?

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

#5


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

#6


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

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

#7


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

#8


引用 7 楼 joking520 的回复:
把SQL打印出来,放数据库里面去试试吧。

试了,放到数据库里试就是“0条受影响行数”。。。

#9


你直接 $result 也等于  1 吗?


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


#10


引用 9 楼 joking520 的回复:
你直接 $result 也等于 1 吗?


PHP code


if($result===false) {
echo $result.'&amp;nbsp;&amp;nbsp;&amp;nbsp;'.$sql.'<br />'; //这样还会被执行吗?
}

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

#11


该回复于2011-09-15 13:18:54被版主删除

#12


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

何况你的代码中并没有处理返回 0 时的情况

#13


同上。。

#14


引用 12 楼 xuzuning 的回复:
你这个人好奇怪!
只要是条件 mobile='{$mobile}' 成立,就会有至少一条记录被修改,也就是 $pgLink->exec($sql) 大于等于 1
返回 0 就说明相应的记录不存在

何况你的代码中并没有处理返回 0 时的情况

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

#15


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

#16


你并没有说明你的需求
我只能根据你的代码来推测你想干什么

既然是想找到  有好多是mobile='{$mobile}'没匹配成功的
就应该写作

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

#17


引用 16 楼 xuzuning 的回复:
你并没有说明你的需求
我只能根据你的代码来推测你想干什么

既然是想找到 有好多是mobile='{$mobile}'没匹配成功的
就应该写作

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

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