循环

时间:2015-08-21 12:56:01

标签: php mysql for-loop

所以我有2个名为accountstblDataNumbers的表。 accounts表格有sponsorID字段,而tblDataNumbers表格有xsponsorID字段。首先,这是代码:

for ($x = 501; $x <= 1061; $x++) {

    $data = $conn->query("SELECT * FROM tblDataNumbers WHERE tableID = $x");

    foreach ($data as $d) {
        $xsponsorID = $d['xsponsorID'];
    }

    $checkSponsor = $conn->query("SELECT * FROM accounts WHERE sponsorID = '".$xsponsorID."' ");

    if(count($checkSponsor) > 0) {
        $xsid = $xsponsorID;
    } else {
        $xsid = "";
    }

    $stmt = $conn->prepare('UPDATE tblDataNumbers SET xsponsorID=:xsponsorID WHERE tableID=:x');
    $stmt->execute(array(
        ':xsponsorID'   => $xsid,
        ':x'      => $x
    ));  
}

上面的代码将检查帐户表的$xsponsorID字段中是否存在sponsorID。如果是,则将$ xsid设置为$xsponsorID的相同值,如果不是,则将其设置为空白或""。当我运行代码时,没有任何反应。 xsponsorID表的tblDataNumbersthat字段中有很多数字在sponsorID表的accounts字段中不存在,因此基本上应将某些内容设置为空白但甚至没有一个。

我想要发生这种情况的方法是重复表501的行1061tblDataNumbers内部的代码,但没有任何反应。我的代码有问题吗?谢谢。

2 个答案:

答案 0 :(得分:1)

我不知道这是不是你正在尝试但是这可能会在一段时间内杀死服务器,因为会有560条记录(来自第一次查询)=很多!

我认为必须有一个更简洁的解决方案,在一个查询中完成工作 - 我将详细查看查询,看看是否有解决方案。

for( $x = 501; $x <= 1061; $x++ ) {

    $data = $conn->query("SELECT * FROM tblDataNumbers WHERE tableID = $x");


    /* This loop will only ever get one result..
    foreach( $data as $d ){ 
        $xsponsorID = $d['xsponsorID'];
    }
    */

    foreach( $data as $d ){ 

        $xsponsorID = $d['xsponsorID'];

        $checkSponsor = $conn->query("SELECT * FROM accounts WHERE sponsorID = '".$xsponsorID."' ");
        $xsid=( count( $checkSponsor ) > 0 ) ? $xsponsorID : '';

        $stmt = $conn->prepare('UPDATE `tblDataNumbers` SET `xsponsorID`=:xsponsorID WHERE `tableID`=:x;');
        $stmt->execute(array(
            ':xsponsorID'   => $xsid,
            ':x'            => $x
        ));
    }

}

再看一遍并阅读你的评论后,我想知道下面的内容是否可以解决问题。我用相同的两个命名表创建了一个新数据库并填充了一些测试数据(虽然我不知道它是否类似于你自己的数据)并在heidi(mysql gui app)中使用以下作为测试

set @tblid=1;
update `tblDataNumbers` t set t.`xsponsorID`=(
    case
        when ( t.`xsponsorID` not in ( select `sponsorID` from `accounts` ) ) then
            null
        else
            t.`xsponsorID`
    end
)
where t.`tableID`=@tblid;

显然,这会更新tableID仅等于@tblid var的记录。但是,要更新符合条件的所有记录,请删除where子句,它会将NULL值应用于tblDataNumbers表中没有相应sponsorID的任何记录。帐户表。在运行之前,我强烈建议您备份数据!!!!

如果没有mysql变量,查询将变为以下内容,这意味着您不需要循环。

update `tblDataNumbers` t set t.`xsponsorID`=(
    case
        when ( t.`xsponsorID` not in ( select `sponsorID` from `accounts` ) ) then
            null
        else
            t.`xsponsorID`
    end
)

如果仅在501和1061之间更新记录很重要,那么您可以添加where子句,例如: -

where t.`tableID` between 501 and 1061

答案 1 :(得分:0)

感谢@RamRaider,设法通过添加一行并删除co​​unt()函数来修复它。

for( $x = 501; $x <= 1061; $x++ ) {

    $data = $conn->query("SELECT * FROM tblDataNumbers WHERE tableID = $x");


    foreach( $data as $d ){ 

        $xsponsorID = $d['xsponsorID'];

        $checkSponsor = $conn->query("SELECT * FROM accounts WHERE sponsorID = '".$xsponsorID."' ");
        $row = $checkSponsor->fetch(PDO::FETCH_ASSOC); //I forgot this line
        $xsid=( $row > 0 ) ? $xsponsorID : '';

        $stmt = $conn->prepare('UPDATE `tblDataNumbers` SET `xsponsorID`=:xsponsorID WHERE `tableID`=:x;');
        $stmt->execute(array(
            ':xsponsorID'   => $xsid,
            ':x'            => $x
        ));
    }

}