Prepared语句在'while'期间返回相同的结果

时间:2014-02-05 02:32:38

标签: php mysql

我试图弄清楚为什么这个while语句每次都返回相同的帐户ID。以下是我正在使用的功能:

    function Hourly(){
        $sql = "SELECT * FROM users WHERE users.id IN(SELECT uid FROM point WHERE zoneid=1)";
        $arr = array();
        $user = $this->database->DBQry($sql, $arr);
        $id = $user[0]['ID'];
        $sql = "SELECT * FROM point WHERE zoneid > -1";
        $arr = array();
        $row = $this->database->DBCtr($sql, $arr);
        $i=0;
        while($i < $row){
            $arr = array(":userid" => $id, ":zoneid" => 1, ":cash" => 500);
            $this->database->DBIns($arr, 'cashtable');
            echo"$id DONE!<br>";
            $i++;
        }
    }

以下是我正在准备的陈述。

// Query
    function DBQry($sql,$arr){
        $sth = $this->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
        $sth->execute($arr);
        $rs = $sth->fetchAll();
        return $rs;
    }

    // Count
    function DBCtr($sql,$arr){
        $sth = self::prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
        $sth->execute($arr);
        return $sth->rowCount();
    }

我认为我遇到的问题是其中一个陈述。

我想从功能中实现的是这样的结果:

64 DONE!
80 DONE!
124 DONE!
648 DONE!
984 DONE!
1341 DONE!
1468 DONE!
1887 DONE!
2017 DONE!
2193 DONE!
2267 DONE!

但这是函数的结果:

64 DONE!
64 DONE!
64 DONE!
64 DONE!
64 DONE!
64 DONE!
64 DONE!
64 DONE!
64 DONE!
64 DONE!
64 DONE!

我正在使用的代码

<?
$DBHost = "localhost";  
$DBUser = "user";
$DBPassword = "password";
$DBName = "db";
$Hcash=50;
$Link = MySQL_Connect($DBHost, $DBUser, $DBPassword) or die ("Can't connect to MySQL");
MySQL_Select_Db($DBName, $Link) or die ("Database ".$DBName." does not exist.");

$OnlineAccountQuery = Mysql_Query("SELECT * FROM point WHERE zoneid > -1");
$OnlineAccountNum = Mysql_Num_Rows($OnlineAccountQuery);

$i=0;
WHILE($i < $OnlineAccountNum){
$OnlineAccountArray = Mysql_Fetch_Array($OnlineAccountQuery);
$UID = $OnlineAccountArray['uid'];
MySQL_Query("INSERT INTO cashtable (userid, zoneid, cash) VALUES ($UID, 1, $Hcash)");
echo"$UID DONE!<br>";
$i++;
}
?>

对Shivan Raptor答案的回应

function Hourly(){
        $sql = "SELECT * FROM point WHERE zoneid > -1";
        $arr = array();
        $row = $this->database->DBCtr($sql, $arr);
        $i=0;
        while($i < $row){
            $sql = "SELECT * FROM users WHERE users.id IN(SELECT uid FROM point WHERE zoneid=1)";
            $arr = array();
            $user = $this->database->DBQry($sql, $arr);
            $id = $user[0]['ID'];
            $arr = array(":userid" => $id, ":zoneid" => 1, ":cash" => 500);
            $this->database->DBIns($arr, 'cashtable');
            echo"$id DONE!<br>";
            $i++;
        }
    }

表结构

 CREATE TABLE `point` (
`uid` int(11) NOT NULL DEFAULT '0',
`aid` int(11) NOT NULL DEFAULT '0',
`time` int(11) NOT NULL DEFAULT '0',
`zoneid` int(11) DEFAULT '0',
`zonelocalid` int(11) DEFAULT '0',
`accountstart` datetime DEFAULT NULL,
`lastlogin` datetime DEFAULT NULL,
`enddate` datetime DEFAULT NULL,
 PRIMARY KEY (`uid`,`aid`),
 KEY `IX_point_aidzoneid` (`aid`,`zoneid`) USING BTREE
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

 CREATE TABLE `cashtable` (
  `userid` int(11) NOT NULL,
  `zoneid` int(11) NOT NULL,
  `cash` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

1 个答案:

答案 0 :(得分:2)

您没有覆盖$id。它在while循环之前定义了一次。

请仔细检查你的逻辑。


问题修改后更新:

在您的回复Hourly()函数中,$row应包含第一个$sql的行数。但是,在while循环中,您再次查询第二个相同的$sql&amp;再次。因此,$id始终是相同的。

我认为你的第二个查询应该与第一个查询的结果有关,但你没有。如果可能,请考虑加入2个查询。