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.' '.$sql.'<br />';
}
}
}
//设置脚本运行时间为不限制
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 />';
}
}
}
#3
不知道你想要什么?
如果 exec 总是返回 0,那么你那一堆代码不就什么也没做吗?
如果 exec 总是返回 0,那么你那一堆代码不就什么也没做吗?
#4
if($result) {
echo $result.' '.$sql.'<br />';
}
这句话就是说当有“影响行数”的时候,才输出下面这条语句,但现在的问题是,$result这个变量总是1,就是说当上面那个update语句没有影响行数的时候,这个$result的值也是1,按说这个时候应该返回的是0啊。
#5
用if ($result)来做判断是错误的.
得使用 mysqli_stmt::affected_rows -- mysqli_stmt_affected_rows 来做判断.当然我不清楚pdo.这里是mysqli
得使用 mysqli_stmt::affected_rows -- mysqli_stmt_affected_rows 来做判断.当然我不清楚pdo.这里是mysqli
#6
mysqli是那样的,pdo::exec()方法返回的结果就是受影响行数。
#7
把SQL打印出来,放数据库里面去试试吧。
#8
试了,放到数据库里试就是“0条受影响行数”。。。
#9
你直接 $result 也等于 1 吗?
if($result===false) {
echo $result.' '.$sql.'<br />'; //这样还会被执行吗?
}
#10
是的!直接输出$result也是1,用var_dump($result)显示int(1)
#11
#12
你这个人好奇怪!
只要是条件 mobile='{$mobile}' 成立,就会有至少一条记录被修改,也就是 $pgLink->exec($sql) 大于等于 1
返回 0 就说明相应的记录不存在
何况你的代码中并没有处理返回 0 时的情况
只要是条件 mobile='{$mobile}' 成立,就会有至少一条记录被修改,也就是 $pgLink->exec($sql) 大于等于 1
返回 0 就说明相应的记录不存在
何况你的代码中并没有处理返回 0 时的情况
#13
同上。。
#14
哥们你没理解我的意思!它现在只有返回1的时候才输出$sql语句,在这些语句里有好多是mobile='{$mobile}'没匹配成功的,我不知道我说明白了吗???
#15
也就是说有好多mobile='{$mobile}'没匹配成功的,但是却输出了,我就是这不明白。。。
#16
你并没有说明你的需求
我只能根据你的代码来推测你想干什么
既然是想找到 有好多是mobile='{$mobile}'没匹配成功的
就应该写作
if(! $result) {
echo $result.' '.$sql.'<br />';
}
我只能根据你的代码来推测你想干什么
既然是想找到 有好多是mobile='{$mobile}'没匹配成功的
就应该写作
if(! $result) {
echo $result.' '.$sql.'<br />';
}
#17
不好意思~我实在是不知道该怎么描述这个问题。
这样说吧,我现在想要实现的功能已经都实现了,这个问题就是无意间发现的很好奇。
这个程序大概这样:
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.' '.$sql.'<br />';
}
}
}
//设置脚本运行时间为不限制
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 />';
}
}
}
#3
不知道你想要什么?
如果 exec 总是返回 0,那么你那一堆代码不就什么也没做吗?
如果 exec 总是返回 0,那么你那一堆代码不就什么也没做吗?
#4
if($result) {
echo $result.' '.$sql.'<br />';
}
这句话就是说当有“影响行数”的时候,才输出下面这条语句,但现在的问题是,$result这个变量总是1,就是说当上面那个update语句没有影响行数的时候,这个$result的值也是1,按说这个时候应该返回的是0啊。
#5
用if ($result)来做判断是错误的.
得使用 mysqli_stmt::affected_rows -- mysqli_stmt_affected_rows 来做判断.当然我不清楚pdo.这里是mysqli
得使用 mysqli_stmt::affected_rows -- mysqli_stmt_affected_rows 来做判断.当然我不清楚pdo.这里是mysqli
#6
mysqli是那样的,pdo::exec()方法返回的结果就是受影响行数。
#7
把SQL打印出来,放数据库里面去试试吧。
#8
试了,放到数据库里试就是“0条受影响行数”。。。
#9
你直接 $result 也等于 1 吗?
if($result===false) {
echo $result.' '.$sql.'<br />'; //这样还会被执行吗?
}
#10
是的!直接输出$result也是1,用var_dump($result)显示int(1)
#11
#12
你这个人好奇怪!
只要是条件 mobile='{$mobile}' 成立,就会有至少一条记录被修改,也就是 $pgLink->exec($sql) 大于等于 1
返回 0 就说明相应的记录不存在
何况你的代码中并没有处理返回 0 时的情况
只要是条件 mobile='{$mobile}' 成立,就会有至少一条记录被修改,也就是 $pgLink->exec($sql) 大于等于 1
返回 0 就说明相应的记录不存在
何况你的代码中并没有处理返回 0 时的情况
#13
同上。。
#14
哥们你没理解我的意思!它现在只有返回1的时候才输出$sql语句,在这些语句里有好多是mobile='{$mobile}'没匹配成功的,我不知道我说明白了吗???
#15
也就是说有好多mobile='{$mobile}'没匹配成功的,但是却输出了,我就是这不明白。。。
#16
你并没有说明你的需求
我只能根据你的代码来推测你想干什么
既然是想找到 有好多是mobile='{$mobile}'没匹配成功的
就应该写作
if(! $result) {
echo $result.' '.$sql.'<br />';
}
我只能根据你的代码来推测你想干什么
既然是想找到 有好多是mobile='{$mobile}'没匹配成功的
就应该写作
if(! $result) {
echo $result.' '.$sql.'<br />';
}
#17
不好意思~我实在是不知道该怎么描述这个问题。
这样说吧,我现在想要实现的功能已经都实现了,这个问题就是无意间发现的很好奇。
这个程序大概这样:
Mysql中的表有100多W条数据,pgSQL中的表有50多W条,pgSQL中有的行在Mysql中都有,但因为pgSQL中有很多列的值是空的,所以需要从Mysql表中提取出相对应的值,然后更新到pgSQL的表中。这两个表的联结列是mobile,所以我在更新的时候用的是mobile={$mobile}。我那个if($result)就是想看下有哪些数据被更新了,但是没想到,有好多mobile={$mobile}没有匹配成功的也被输出了,所以很纳闷,上来问的这个问题。