微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 使用大型数据库时,Ajax请求需要很长时间才能完成

我正在使用Yii框架(版本1.1.14)编写的网站,该网站允许上传显示新闻.网站的管理员可以选择三个新闻来推广到主页并指定它们的显示顺序.我正在使用MysqL数据库.新闻表有两个字段:isChecked(0或1)和homepagePos(整数)以及其他字段. isChecked字段确定是否选择了新闻以在主页中显示,并且homepagePos字段确定新闻的显示顺序.我使用了 jquery的可排序插件来对新闻进行排序.当用户选择要显示的新闻并单击“保存”按钮时,新闻ID将通过ajax发送到PHP.

将值发送到新闻控制器的javascript部分如下:

$(document).on('click','#savetoHomepage',function() 
{
    var url = ajaxRequestSendUrl;   //ajaxRequestSendUrl contains url to news controller's promote to homepage method.
    $.ajax({
        method: "GET",url: url,data: {
            contentIds: contentIds,//contentIds contains an array of news Ids in certain order
            },success: function() {
        // Show success message
        },error: function() {
            alert('Some error occured. Please reload the page and try again.');
        }
    });
});

这是新闻控制器中的主页推广方法

public function actionHomepage()
{
    $allNews = News::model()->findAll();
    $value = $_GET['contentIds'];
    foreach ($allNews as $news) {
        if($news->id == $value[0] ||$news->id == $value[1] ||$news->id == $value[2])
        {
            $news->isChecked = 1;
            $news->homepagePos = array_search($news->id,$value); //Assign index of the array as the position
            $news->save();
        }
        else
        {
            $news->isChecked = 0;
            $news->homepagePos = -1;
            $news->save();
        }
    }
}

我的问题是我的新闻表有超过2k的数据.所以ajax调用需要很长时间(超过一分钟)才能完成.有什么方法可以优化代码,还是有其他方法可以解决这个问题,以减少完成此操作所需的时间?
提前致谢

解决方法

三个查询:首先将整个表设置为未检查状态,其余为仅在每个选中的行中设置检查状态

public function actionHomepage()
{
    $values = $_GET['contentIds'];
    $sql = "UPDATE news SET idChecked=0,homepagePos = -1";
    Yii::app()->db
        ->createCommand($sql)
        ->execute();
    for($ii = 0; $ii < 3; $ii++) {
        $sql = "UPDATE news SET idChecked = 1,homepagePos = ':homepagePos' WHERE id=:id";
        Yii::app()->db
            ->createCommand($sql)
            ->bindValues(array(':homepagePos' => array_search($ii,$values),':id' => $values[$ii]))
            ->execute();
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐