Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php while循环中的while(mysql\u fetch\u数组)_Php_Mysql - Fatal编程技术网

Php while循环中的while(mysql\u fetch\u数组)

Php while循环中的while(mysql\u fetch\u数组),php,mysql,Php,Mysql,我有以下代码: while ($sum<16 || $sum>18){ $totala = 0; $totalb = 0; $totalc = 0; $ranka = mysql_query("SELECT duration FROM table WHERE rank=1 ORDER BY rand() LIMIT 1"); $rankb = mysql_query("SELECT duration FROM table WHERE rank=2 ORDER BY rand() LI

我有以下代码:

while ($sum<16 || $sum>18){
$totala = 0;
$totalb = 0;
$totalc = 0;
$ranka = mysql_query("SELECT duration FROM table WHERE rank=1 ORDER BY rand() LIMIT 1");
$rankb = mysql_query("SELECT duration FROM table WHERE rank=2 ORDER BY rand() LIMIT 1");
$rankc = mysql_query("SELECT duration FROM table WHERE rank=3 ORDER BY rand() LIMIT 1");
while ($rowa = mysql_fetch_array($ranka)) {
    echo $rowa['duration'] . "<br/>";
    $totala = $totala + $rowa['duration'];
}
while ($rowb = mysql_fetch_array($rankb)) {
        $totalb = $totalb + $rowb['duration'];      
    }       
while ($rowc = mysql_fetch_array($rankc)) {
        $totalc = $totalc + $rowc['duration'];
    }

    $sum=$totala+$totalb+$totalc;
}
echo $sum;
while($sum18){
$totala=0;
$totalb=0;
$totalc=0;
$ranka=mysql_查询(“从表中选择持续时间,其中rank=1 ORDER BY rand()LIMIT 1”);
$rankb=mysql_查询(“从表中选择持续时间,其中rank=2,ORDER BY rand()LIMIT 1”);
$rankc=mysql_查询(“从表中选择持续时间,其中rank=3 ORDER BY rand()LIMIT 1”);
while($rowa=mysql\u fetch\u数组($ranka)){
echo$rowa['duration']。“
”; $totala=$totala+$rowa['duration']; } while($rowb=mysql\u fetch\u数组($rankb)){ $totalb=$totalb+$rowb['duration']; } while($rowc=mysql\u fetch\u数组($rankc)){ $totalc=$totalc+$rowc['duration']; } $sum=$totala+$totalb+$totalc; } echo$sum;
它工作得很好,但问题是直到“$sum=16”执行“echo$rowa['duration']”,问题是,在“while($rowa=mysql\u fetch\u array($ranka))”i这个while循环中,是否只“echo”最新执行的代码?
因为大多数情况下都会返回所有数字,直到“$sum=16”

您在第一个内部while循环中显式地回显$rowa['duration']。如果只想打印$ranka集合中的最后一个持续时间,只需将回显更改为
$rowa_duration=$rowa['duration']
,然后在循环外回显

while ($rowa = mysql_fetch_array($ranka)) {
    $rowa_duration = $rowa['duration'];
    $totala = $totala + $rowa['duration'];
}
echo $rowa_duration . '<br/>';
while($rowa=mysql\u fetch\u数组($ranka)){
$rowa_duration=$rowa['duration'];
$totala=$totala+$rowa['duration'];
}
echo$rowa_持续时间。”

您在第一个内部while循环中显式回显$rowa['duration']。如果只想打印$ranka集合中的最后一个持续时间,只需将回显更改为
$rowa_duration=$rowa['duration']
,然后在循环外回显

while ($rowa = mysql_fetch_array($ranka)) {
    $rowa_duration = $rowa['duration'];
    $totala = $totala + $rowa['duration'];
}
echo $rowa_duration . '<br/>';
while($rowa=mysql\u fetch\u数组($ranka)){
$rowa_duration=$rowa['duration'];
$totala=$totala+$rowa['duration'];
}
echo$rowa_持续时间。”

你在那里做的事情在多个层面上都不好。你的英语很糟糕。好。。熟能生巧。您可以尝试加入FreeNode服务器上的##php聊天室。这将提高你的英语和php技能。。这确实帮了我很多忙。无论如何

SQL 首先,使用
orderbyrand()
是极其无知的(充其量)。随着表开始变大,此操作将使查询变慢。它具有
n*log2(n)
复杂性,这意味着选择包含1000个条目的查询表将比查询包含10个条目的表花费约3000倍的时间

要了解更多信息,您应该阅读,但对于您当前的查询,解决方案如下所示:

SELECT duration 
FROM table 
    JOIN (SELECT CEIL(RAND()*(SELECT MAX(id) FROM table)) AS id) as choice
WHERE 
    table.id >= choice.id
    rank = 1 
LIMIT 1
这将从表中选择random
duration

但是,由于您实际上选择的是具有3个不同等级(1、2和3)的数据,因此创建三个查询的并集是有意义的:

SELECT duration 
FROM table 
    JOIN (SELECT CEIL(RAND()*(SELECT MAX(id) FROM table)) AS id) as choice
WHERE 
    table.id >= choice.id
    rank = 1 
LIMIT 1
UNION ALL
SELECT duration 
FROM table 
    JOIN (SELECT CEIL(RAND()*(SELECT MAX(id) FROM table)) AS id) as choice
WHERE 
    table.id >= choice.id
    rank = 2 
LIMIT 1
UNION ALL
SELECT duration 
FROM table 
    JOIN (SELECT CEIL(RAND()*(SELECT MAX(id) FROM table)) AS id) as choice
WHERE 
    table.id >= choice.id
    rank = 3 
LIMIT 1
看起来很吓人,但实际上它比您当前使用的要快,结果将是
duration
列中的三个条目

PHP与SQL
  • 您仍然在使用旧的
    mysql.*
    函数访问数据库。这种形式的API已有10多年的历史,在编写新代码时不应使用。旧的功能不再得到维护(固定和/或改进),甚至社区也开始了上述功能

    相反,您应该使用或。使用哪一种取决于您的个人喜好和实际可用的内容。我更喜欢PDO(因为命名参数和对其他RDBMS的支持),但这有点主观选择

  • php/mysql代码的另一个问题是,您似乎毫无意义地循环思想项目。您的查询有
    限制1
    ,这意味着只有一行。循环没有意义

  • 如果
    持续时间
    的最大值为
    1
    ,则可能出现无止境循环。在循环开始时,您将拥有符合第一个
    while
    条件的
    $sum===15
    。在循环的最后,你可以得到
    $sum==18
    ,它满足第二个循环条件。。。然后,它被关闭到无限远,您的SQL server被阻塞

  • 如果您使用分数表示
    持续时间
    ,则3个新结果的总值需要更小。刚刚超过
    2
    。从
    15.99
    开始,以
    18.01
    结束(这是每个
    0.7
    的附加
    2.02
    )。再一次。。无止境的循环

    暗示 我会这样做:

    $pdo = new PDO('mysql:dbname=my_db;host=localhost', 'username', 'password');
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $sum = 0;
    while ( $sum < 16 )
    {
        $query = 'that LARGE query above';
        $statement = $pdo->prepare( $query );
        if ( $statement->execute() )
        {
            $data = $statement->fetchAll( PDO::FETCH_ASSOC );
            $sum += $data[0]['duration']+$data[1]['duration']+$data[2]['duration'];
        }
    }
    echo $data[0]['duration'];
    
    $pdo=newpdo('mysql:dbname=my_db;host=localhost','username','password');
    $pdo->setAttribute(pdo::ATTR_EMULATE_PREPARES,false);
    $sum=0;
    而($sum<16)
    {
    $query='上面的那个大查询';
    $statement=$pdo->prepare($query);
    如果($statement->execute())
    {
    $data=$statement->fetchAll(PDO::FETCH_ASSOC);
    $sum+=$data[0]['duration']+$data[1]['duration']+$data[2]['duration'];
    }
    }
    echo$data[0]['duration'];
    

    这应该和你的代码一样。。或者至少,我认为是你的意图。

    你在那里做的事情在多个层面上都是不好的。你的英语很糟糕。好。。熟能生巧。您可以尝试加入FreeNode服务器上的##php聊天室。这将提高你的英语和php技能。。这确实帮了我很多忙。无论如何

    SQL 首先,使用
    orderbyrand()
    是极其无知的(充其量)。随着表开始变大,此操作将使查询变慢。它具有
    n*log2(n)
    复杂性,这意味着选择包含1000个条目的查询表将比查询包含10个条目的表花费约3000倍的时间

    要了解更多信息,您应该阅读,但对于您当前的查询,解决方案如下所示:

    SELECT duration 
    FROM table 
        JOIN (SELECT CEIL(RAND()*(SELECT MAX(id) FROM table)) AS id) as choice
    WHERE 
        table.id >= choice.id
        rank = 1 
    LIMIT 1
    
    这将从表中选择random
    duration

    但是自从你