使用PDO方式修改数据库的问题。 现在有一个pgsql,用pdo连接的,用exec()方法执行update命令(如UPDATE XXX SET WHERE mobile='110';),但这条语句明明影响行数是0(在本地数据库客户端已测试),但是返回值却是1!这是怎么回事? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 <?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.' '.$sql.'<br />'; } } } 不知道你想要什么?如果 exec 总是返回 0,那么你那一堆代码不就什么也没做吗? if($result) { echo $result.' '.$sql.'<br />';}这句话就是说当有“影响行数”的时候,才输出下面这条语句,但现在的问题是,$result这个变量总是1,就是说当上面那个update语句没有影响行数的时候,这个$result的值也是1,按说这个时候应该返回的是0啊。 用if ($result)来做判断是错误的.得使用 mysqli_stmt::affected_rows -- mysqli_stmt_affected_rows 来做判断.当然我不清楚pdo.这里是mysqli mysqli是那样的,pdo::exec()方法返回的结果就是受影响行数。 把SQL打印出来,放数据库里面去试试吧。 你直接 $result 也等于 1 吗?if($result===false) {echo $result.' '.$sql.'<br />'; //这样还会被执行吗?} 是的!直接输出$result也是1,用var_dump($result)显示int(1) 你这个人好奇怪!只要是条件 mobile='{$mobile}' 成立,就会有至少一条记录被修改,也就是 $pgLink->exec($sql) 大于等于 1返回 0 就说明相应的记录不存在何况你的代码中并没有处理返回 0 时的情况 哥们你没理解我的意思!它现在只有返回1的时候才输出$sql语句,在这些语句里有好多是mobile='{$mobile}'没匹配成功的,我不知道我说明白了吗??? 也就是说有好多mobile='{$mobile}'没匹配成功的,但是却输出了,我就是这不明白 你并没有说明你的需求我只能根据你的代码来推测你想干什么既然是想找到 有好多是mobile='{$mobile}'没匹配成功的就应该写作if(! $result) { echo $result.' '.$sql.'<br />';} 不好意思~我实在是不知道该怎么描述这个问题。这样说吧,我现在想要实现的功能已经都实现了,这个问题就是无意间发现的很好奇。这个程序大概这样:Mysql中的表有100多W条数据,pgSQL中的表有50多W条,pgSQL中有的行在Mysql中都有,但因为pgSQL中有很多列的值是空的,所以需要从Mysql表中提取出相对应的值,然后更新到pgSQL的表中。这两个表的联结列是mobile,所以我在更新的时候用的是mobile={$mobile}。我那个if($result)就是想看下有哪些数据被更新了,但是没想到,有好多mobile={$mobile}没有匹配成功的也被输出了,所以很纳闷,上来问的这个问题。 如何动态改变HTML中input的属性值,如value 实现GOOGLE模式的分页条[XSLT]【开放源代码】 这个联动菜单应该怎么用 仿淘宝PHP+MYSQL版多用户商城系统 $_SERVER["REQUEST_URI"]取得当前页url,为什么在我机器上行,在另一台机器上不行! 好奇怪的图片上传问题????? 那位分析过华酷论坛的源代码? charset=gb2312错在哪儿? 我的数据库不能写入,为什么??? phpmyadmin 访问被拒绝 ORA-12170: TNS:Connect timeout occurred 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.' '.$sql.'<br />';
}
}
}
如果 exec 总是返回 0,那么你那一堆代码不就什么也没做吗?
echo $result.' '.$sql.'<br />';
}
这句话就是说当有“影响行数”的时候,才输出下面这条语句,但现在的问题是,$result这个变量总是1,就是说当上面那个update语句没有影响行数的时候,这个$result的值也是1,按说这个时候应该返回的是0啊。
得使用 mysqli_stmt::affected_rows -- mysqli_stmt_affected_rows 来做判断.当然我不清楚pdo.这里是mysqli
if($result===false) {
echo $result.' '.$sql.'<br />'; //这样还会被执行吗?
}
只要是条件 mobile='{$mobile}' 成立,就会有至少一条记录被修改,也就是 $pgLink->exec($sql) 大于等于 1
返回 0 就说明相应的记录不存在何况你的代码中并没有处理返回 0 时的情况
我只能根据你的代码来推测你想干什么既然是想找到 有好多是mobile='{$mobile}'没匹配成功的
就应该写作if(! $result) {
echo $result.' '.$sql.'<br />';
}
这样说吧,我现在想要实现的功能已经都实现了,这个问题就是无意间发现的很好奇。
这个程序大概这样:
Mysql中的表有100多W条数据,pgSQL中的表有50多W条,pgSQL中有的行在Mysql中都有,但因为pgSQL中有很多列的值是空的,所以需要从Mysql表中提取出相对应的值,然后更新到pgSQL的表中。这两个表的联结列是mobile,所以我在更新的时候用的是mobile={$mobile}。我那个if($result)就是想看下有哪些数据被更新了,但是没想到,有好多mobile={$mobile}没有匹配成功的也被输出了,所以很纳闷,上来问的这个问题。