PHP脚本不会加载包含大量数据的表

时间:2014-07-25 20:33:35

标签: php mysqli

我首先要说的是,我不知道关于PHP的漏洞很多,所以我购买了一个用户管理脚本来帮助管理我的网站。

我将所有用户导入到5400+帐户的脚本中,在脚本的用户管理部分中,当我单击以查看用户脚本将超时时出现致命错误:用户超过30秒的最大执行时间。第45行的PHP。我尝试添加ini_set(“max_execution_time”,“0”);到脚本的开头,然后它将旋转3-5分钟,Apache将超时。这是在我的网络服务器和本地主机上。

以下是第42至48行

function get_user_meta($account_id, $term) { 
    global $db;
    $query = "SELECT * from user_meta WHERE account_id='".$account_id."'";
    $result = $db->query($query) or die($db->error);
    $row = $result->fetch_array();
    return $row[$term];
}//get user email ends here

列出用户的代码部分是。

function list_users($user_type) {
    global $db;
    global $language;
    if($user_type == 'admin') { 
        $query = 'SELECT * from users ORDER by account_id ASC';     
        $result = $db->query($query) or die($db->error);
        $content = '';
        $count = 0;
        while($row = $result->fetch_array()) { 
            extract($row);
            $count++;
            if($count%2 == 0) { 
                $class = 'even';
            } else { 
                $class = 'odd';
            }
            $content .= '<tr class="'.$class.'">';
            $content .= '<td>';
            $content .= $first_name.' '.$last_name;
            $content .= '</td><td>';
            if($city != '') { 
            $content .= $city.', ';
            }
            if($state != '') { 
            $content .= $state.', ';
            }
            $content .= $country;
            $content .= '</td><td>';
            $content .= $username;
            $content .= '</td><td>';
            $content .= $email;
            $content .= '</td><td>';
            $content .= ucfirst($status);
            $content .= '</td><td>';
            $content .= ucfirst($user_type);
            $content .= '</td><td>';
            $content .= $this->get_user_meta($account_id, 'last_login_time');
            $content .= '</td><td>';
            $content .= $this->get_user_meta($account_id, 'last_login_ip');
            $content .= '</td><td>';
            $content .= '<button class="btn btn-default btn-sm pull-left" style="margin-right:5px;" data-toggle="modal" data-target="#modal_'.$account_id.'">'.$language["message"].'</button>';
            $content .= '<!-- Modal -->
<script type="text/javascript">
$(function(){
$("#message_form_'.$account_id.'").on("submit", function(e){
e.preventDefault();
tinyMCE.triggerSave();
$.post("includes/messageprocess.php", 
 $("#message_form_'.$account_id.'").serialize(), 
 function(data, status, xhr){
   $("#success_message_'.$account_id.'").html("<div class=\'alert alert-success\'>"+data+"</div>");
 });
});
});
</script>               
<div class="modal fade" id="modal_'.$account_id.'" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<form id="message_form_'.$account_id.'" method="post" name="send_message">
<div class="modal-content">
  <div class="modal-header">
    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
    <h4 class="modal-title" id="myModalLabel">'.$language["send_message"].'</h4>
  </div>

  <div class="modal-body">
        <div id="success_message_'.$account_id.'"></div>
        <div class="form-group">
            <label class="control-label">'.$language["message_to"].'</label>
            <input type="text" class="form-control" name="message_to" value="Email:('.$email.') Username: ('.$username.')" readonly="readonly" />
        </div>

        <div class="form-group">
            <label class="control-label">'.$language["subject"].'</label>
            <input type="text" class="form-control" name="subject" value="" />
        </div>

        <div class="form-group">
            <label class="control-label">'.$language["message"].'</label>
            <textarea class="tinyst form-control" name="message"></textarea>
        </div>
  </div>
  <input type="hidden" name="from" value="'.$_SESSION['account_id'].'" />
  <input type="hidden" name="account_id" value="'.$account_id.'" />
  <input type="hidden" name="single_form" value="1" />
  <div class="modal-footer">
    <button type="button" class="btn btn-default" data-dismiss="modal">'.$language["close"].'</button>
    <input type="submit" value="Send Message" class="btn btn-primary" />
  </div>
</div><!-- /.modal-content -->
</form>
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->';            
            $content .= '<form method="post" name="edit" action="manage_users.php">';
            $content .= '<input type="hidden" name="edit_user" value="'.$account_id.'">';
            $content .= '<input type="submit" style="margin-right:5px;" class="btn btn-default btn-sm pull-left" value="'.$language["edit"].'">';
            $content .= '</form>';
            $content .= '<form method="post" name="delete" onsubmit="return confirm_delete();" action="">';
            $content .= '<input type="hidden" name="delete_user" value="'.$account_id.'">';
            $content .= '<input type="submit" class="btn btn-default btn-sm pull-left" value="'.$language["delete"].'">';
            $content .= '</form>';
            $content .= '</td>';
            $content .= '</tr>';
            unset($class);
        }//loop ends here.
    } else { 
        $content = $language["cannot_i_user"];
    }   
    echo $content;
}//list_levels ends here.

我联系了创作者并被告知。现在子系统使用Jquery数据表来排列数据应用过滤器,并应用页面,所以当使用jquery的数据表时,我们必须在你的情况下一次从表中获取所有行,你有这么多记录,这就是你遇到问题的原因。他想要我20美元来修理它。

1 个答案:

答案 0 :(得分:-1)

是的,尝试以较小的方式将结果用于某种方式。编写一个函数,使单个记录保持十个或更好,一次一个,从一开始,从那里开始。看看它如何扩展。这样,您的用户可以确保在检索和处理所有其余记录时看到某些内容。

另外,如果你不了解php,那么购买现成的脚本是一件非常糟糕的事情。从下到上构建。

保持你的20美元一些体面的咖啡/啤酒,而你在PHP上寻找一些基本的tutes。或者通过本书获得精彩而温和的语言介绍 - 数据库,分页结果集,登录,您可以命名:http://www.amazon.com/PHP-Solutions-Dynamic-Design-Made/dp/1430232498

就你的剧本而言,

   $query = 'SELECT * from users ORDER by account_id ASC LIMIT 10';     

是一个好的开始,然后从那里开始。

或者你可以将整个查询+处理放在for循环中,每次迭代循环执行十次强检索。

此外,由于我们是关于性能的主题,这是一个关于变量插值与连接的好方法(即处理如何构建字符串/ html)。  http://nikic.github.io/2012/01/09/Disproving-the-Single-Quotes-Performance-Myth.html

请记住,在这个例子中,当您掌握语言时,代码可读性是最重要的,因此我将使用插值变量。通过这种方式,您可以看到正在发生的事情,同时您无法从数据库中获取所有这些结果并将其用于您的页面。不要被吓倒,一旦你采取暴跌,PHP是一个很好的直接语言。

另一种方法是在用户首次加载页面/点击以获得结果时提供小的结果集,然后通过AJAX逐步提供其余部分,即无需重新加载页面,只需将后续元素插入你的师在他们准备好的时候。这是一个很好的AJAX教程,可以帮助您入门:

http://www.w3schools.com/php/php_ajax_database.asp