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
这将从表中选择randomduration
但是,由于您实际上选择的是具有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的支持),但这有点主观选择
限制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
这将从表中选择randomduration
但是自从你