PHP 准备语句 while

标签 php mysql

这是原始代码

 <?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)){

每次循环运行时,您都会调用DBCtrDBCtr 返回一个 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/

相关文章:

php - mysqli_fetch_assoc()需要参数/调用成员函数bind_param()错误。如何获取并修复实际的mysql错误?

PHP-MySQL连接错误

python - Django: django.db.utils.InternalError: (1046, u'未选择数据库')

php - 在 codeception acceptance helper 中动态执行 DB dump

php - 如何使用 https 以及事情有何不同

php - 您可以在 PHP 中的类之外编写类函数吗?

mysql - 从两个表之一中选择相同的数据

c# - 从数据库中检索多行

php - 使用 PHP 比较 2 个表并在另一个表上创建列表

mysql - Rails 应用程序在临时服务器上速度很快,在生产环境中慢 20 倍