这是原始代码
<?php
$db = mysql_connect( 'localhost', 'root', '' ) or die ('Connection to MYSQL server failed!');
mysql_select_db( 'pw', $db ) or die ('DB not found!');
$cubi = 500;
$result = mysql_query("SELECT * FROM users WHERE users.id IN(SELECT uid FROM point WHERE zoneid=1)");
while($row = mysql_fetch_assoc($result)){
mysql_query("call usecash('".$row["ID"]."', '1', '0', '1', '0', '$cubi', '1', @error)");
};
mysql_close($db);
?>
我正在尝试使用准备好的语句
来完成这项工作。我能够想出这段代码。
<?php
class Jaden extends MainController{
function __construct(){
parent::__construct();
$this->view->url = $this->config->url;
$this->view->ID = get_class($this);
$this->view->Title = "Paradise JD > Ranking";
$time = date('Y-m-d H:i:s',$_SERVER['REQUEST_TIME']);
$sql = "SELECT * FROM cashtable";
$arr = array();
$cash = $this->database->DBQry($sql, $arr);
$userid = $cash[0]['userid'];
$zoneid = $cash[0]['zoneid'];
$jaden = $cash[0]['cash'];
$cubi = 500;
$sql = "SELECT * FROM users WHERE users.id IN(SELECT uid FROM point WHERE zoneid=1)";
$arr = array();
while($row = $this->database->DBCtr($sql, $arr)){
echo 'YES!!';
}
}
}
?>
此后,页面仅加载 30 秒,然后显示以下错误。
Fatal error: Maximum execution time of 30 seconds exceeded
我不知道我是否以正确的方式使用 while
语句。
准备好的声明
// 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();
}
最佳答案
当你这样做时:
while($row = $this->database->DBCtr($sql, $arr)){
每次循环运行时,您都会调用DBCtr
。 DBCtr
返回一个 int,除非它是 0
,否则循环将运行。然后,您使用相同的查询再次调用DBCtr
,它仍然不是0
,因此循环运行。因此无限循环。
即使将 DBCtr
更改为 DBQry
在这里也不起作用,因为您只会一遍又一遍地运行相同的查询。
您需要在此处使用 foreach
而不是 while
。您只能将 while
循环与 fetch()
一起使用(不能与 fetchAll
一起使用),因为当您调用它时一遍又一遍,它返回下一行(或者当没有更多行时返回 NULL)。
foreach($this->database->DBQry($sql, $arr) as $row){
关于PHP 准备语句 while,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21562184/