【问题标题】:PHP page taking a long time to loadPHP页面需要很长时间才能加载
【发布时间】:2014-08-15 07:00:02
【问题描述】:

我正在构建我的网站,在其中一个页面中,我使用 MySQL 和 PHP 来加载一些信息。虽然与所有其他不使用数据库的页面相比,该页面需要很长时间才能加载。

在我的代码中,我多次使用:

$selectMember = mysql_query("SELECT name, nametag FROM members");
$countMembers = mysql_num_rows($selectMember);
[...]
    for($ID = 1; $ID <= $countMembers ; $ID++){
         $member = mysql_query("SELECT name, nametag FROM members WHERE ID = $ID");
         while($row = mysql_fetch_array($member)) {

我认为问题出在这部分代码中。不想放整个,因为它有 200 行。有什么方法可以使数据库研究更简单和/或使页面加载更快?

【问题讨论】:

  • 循环内的查询几乎总是错误的。只需在一个查询中获取所有成员并循环结果
  • mysql_* 函数已折旧。您应该考虑使用 MySQLiPDO

标签: php html mysql database web


【解决方案1】:

你只需要:

$member = mysql_query("SELECT name, nametag FROM members");
   while($row = mysql_fetch_array($member)) {

//show results
echo $row['name'];

无意义的循环和每个 id 一个查询导致延迟。

【讨论】:

    【解决方案2】:

    在这种情况下,您正在不必要地运行查询,并且“内部”查询是错误的。它们只是偶然起作用 - 因为您的成员按顺序编号而没有“漏洞”,所以按顺序生成的 ID确实在数据库中找到记录。

    如果你这样做:

    $selectMember = mysql_query("SELECT ID, name, nametag FROM members");
    

    上面已经获取您在下面检索到的所有数据,并附上 ID:

    $countMembers = mysql_num_rows($selectMember);
    
    while($row = mysql_fetch_array($selectMember) {
        ....
    

    也就是说,mysql_ 函数已弃用;您应该使用mysqli_ 或(恕我直言,更好;但您的里程可能会有所不同)PDO 功能。您绝对不想学习下一个 PHP 版本中可能不再存在的数据库策略!

    Here 您将找到一些示例,说明如何通过更新的 MySQL 释放 PDO 的全部功能。

    【讨论】:

    • 非常感谢,伙计:D
    【解决方案3】:

    你想要做的是这样的.....

    $ids = "(";
    for($ID = 1; $ID <= $countMembers ; $ID++){
        $ids.=$ID.",";
     }
    $ids = rtrim(",",$ids);
    $ids.=")";
    
         $member = mysql_query("SELECT name, nametag FROM members WHERE ID IN $ids");
         while($row = mysql_fetch_array($member)) { etc etc
    

    但以上所有内容都是多余且毫无意义的,因为您已经在 $selectMember 变量中获取数据。因此,只需一个查询,您就已经掌握了一切......

     $selectMember = mysql_query("SELECT name, nametag FROM members");
     while($row = mysql_fetch_array($selectMember)) {
          echo $row[0];
          echo $row[1];
          // etc etc
     }
    

    【讨论】:

      【解决方案4】:

      不知道你为什么要这样做,但一个查询会做到这一点:

      SELECT name, nametag FROM members
          WHERE ID BETWEEN 1 AND (SELECT COUNT(*) FROM members)
      

      【讨论】:

      • 虽然这是对问题的字面解释,但他似乎不太可能真的想将其限制为 id 的计数,我只是认为他很困惑
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-10
      • 2012-06-24
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多