我正在重新开始 PHP 和 MySQL 编码,我有一个搜索页面,它使用 2 个 while 循环返回表中的某些行。
第一个 while 循环搜索数据库,第二个循环搜索第二个数据库以查找注册的匹配项,以确定设备的类型。脚本正在运行,但是,当第一个 while 循环返回超过 2 个结果时,第二个 while 循环仅在设备上显示前 2 个返回,欢迎任何帮助。
$connect = mysql_connect("$dbhost", "$dbuname", "$dbpass") or die("Couldn't connect.");
$db = mysql_select_db($db_name, $connect) or die("Couldn't select database.");
$query = "SELECT * FROM `db1` WHERE `dest_id` =$ap ORDER BY video_date DESC, operator_name, operator_tail ASC";
$result = mysql_query($query,$connect) or mysql_error();
while ($r = mysql_fetch_array($result)) {
$row_color = ($row_count % 2) ? $color1 : $color2;
$time_update = $r[video_date];
$str_time = date('M. d, Y', $time_update);
echo ("<tr><td bgcolor='$row_color'> <a href='$server?al=$r[operator_id]'>$r[operator_name]</a>
</td><td bgcolor='$row_color' align='center'> <a href='$r[operator_ICAO]$r[flight_num]' target='_blank'>$r[flight_num]</a>
</td><td bgcolor='$row_color'> <a href='$r[operator_tail]' target='_blank'>$r[operator_tail]</a>
</td><td bgcolor='$row_color' align='center'> <a href='$r[video_url]' target='_blank'>$r[video_url]</a>
</td><td bgcolor='$row_color' align='center'>");
$connect2 = mysql_connect("$dbhost", "$dbuname", "$dbpass") or die("Couldn't connect.");
$query2 = "SELECT * FROM `plane` WHERE `plane_id` =$r[plane_id]";
$result2 = mysql_query($query2,$connect2) or mysql_error();
while ($q = mysql_fetch_array($result2)) {
echo (" $q[plane_type]");
}
mysql_close($connect2);
echo (" </td><td bgcolor='$row_color' align='center'> $str_time
</td><td bgcolor='$row_color' align='center'> <a href='$server?ap=$r[dest_id]'>$r[dest_name]
</td><td bgcolor='$row_color' align='center'> $r[vtype_name]
</td> </tr>");
$row_count++;
}
mysql_close($connect);
最佳答案
好的,我在这里看到了一些问题。对于一个 mysql_fetch_array 将返回一个非关联数组,除非您的系统设置为返回类型 MYSQL_BOTH。我建议将脚本重写为 mysqli,如下所示:
<?php
$connect = new mysqli("$dbhost", "$dbuname", "$dbpass","$db_name");
$connect->connect_errno ? die("Couldn't connect.") : null ;
$query = "SELECT * FROM `db1` WHERE `dest_id` =$ap ORDER BY video_date DESC, operator_name, operator_tail ASC";
$result = $connect->query($query);
if(!$results->errno):
while ($r = mysql_fetch_array($result)) {
$row_color = ($row_count % 2) ? $color1 : $color2;
$time_update = $r[video_date];
$str_time = date('M. d, Y', $time_update);
echo ("<tr><td bgcolor='$row_color'> <a href='$server?al=$r[operator_id]'>$r[operator_name]</a>
</td><td bgcolor='$row_color' align='center'> <a href='$r[operator_ICAO]$r[flight_num]' target='_blank'>$r[flight_num]</a>
</td><td bgcolor='$row_color'> <a href='$r[operator_tail]' target='_blank'>$r[operator_tail]</a>
</td><td bgcolor='$row_color' align='center'> <a href='$r[video_url]' target='_blank'>$r[video_url]</a>
</td><td bgcolor='$row_color' align='center'>");
$query = "SELECT * FROM `plane` WHERE `plane_id` =$r[plane_id]";
if($result2 = $connect->query($query)):
while ($q = $result2->fetch_assoc($result2)) {
echo (" $q[plane_type]");
}
echo (" </td><td bgcolor='$row_color' align='center'> $str_time
</td><td bgcolor='$row_color' align='center'> <a href='$server?ap=$r[dest_id]'>$r[dest_name]
</td><td bgcolor='$row_color' align='center'> $r[vtype_name]
</td> </tr>");
$row_count++;
endif;
}
endif;
$connect->close();
此外,如果您可以避免嵌套循环复杂度 (N * M)
又名 O(N2) 。我会重写 SQL 语句以使用 INNER JOIN
一次性获取所有结果。
希望能帮助您找到解决方案并帮助您的脚本运行得更快。
更新
这是适用于您的问题的代码。我没有完全更新所有内容来优化它,但这将为您建立一个基线:
关于PHP while 循环内的 while 循环仅返回有限的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22054483/