Php 限制数据库查询的数量

Php 限制数据库查询的数量,php,mysql,mysqli,Php,Mysql,Mysqli,在阅读我的问题之前,请记住以下是我在一个个人项目中学习/扩展我的php/mysql技能所做的工作,因此我仍然是一个新手,因为我确信在我接下来的代码中可以明显看出这一点。然而,任何提示/帮助都值得赞赏 我的应用程序做什么 我的网站允许用户猜测一场体育比赛的结果,比赛结束后,结果会被上传,获胜的成员会得到奖励积分 用于验证获奖者的Psuedo代码 上传事件/体育比赛的结果 将旧事件从activeEvents表移动到expiredEvents表 现在从activeEvents表中删除事件数据 检查谁在

在阅读我的问题之前,请记住以下是我在一个个人项目中学习/扩展我的php/mysql技能所做的工作,因此我仍然是一个新手,因为我确信在我接下来的代码中可以明显看出这一点。然而,任何提示/帮助都值得赞赏

我的应用程序做什么

我的网站允许用户猜测一场体育比赛的结果,比赛结束后,结果会被上传,获胜的成员会得到奖励积分

用于验证获奖者的Psuedo代码

上传事件/体育比赛的结果 将旧事件从activeEvents表移动到expiredEvents表 现在从activeEvents表中删除事件数据 检查谁在picks表中猜对了正确的匹配结果 在步骤1中上载数据 将猜对的获胜成员插入winners表 将旧拾取数据移动到expiredPicks表 从activePicks表中删除移动到expiredPicks表的数据 我的问题

对于上面描述的每一步,我都会对数据库进行一次新的查询,这不仅会导致响应时间变慢,而且似乎效率很低。我正在寻找一些关于如何保持相同功能并改进代码的建议

if(isset($_POST['resultBtn'])){
    //STEP 1:----GET GAME INFO
    foreach($_POST['winner'] as $id =>$winner){
        $winScore = $_POST['score'][$id];
        $teamsel[] = $winner ;
        $team1 = $_POST['team1'][$id];
        $team2 = $_POST['team2'][$id];
        $venue = $_POST['ven'][$id];
        $matchId = $_POST['gameId'][$id]; //match Id
        $score = $_POST['score'][$id]; //score
        $tour = $_POST['tournament'][$id];
        $round = $_POST['round'][$id];
        $event_date = $_POST['event_date'][$id];
        $gameNR = $_POST['gameNr'][$id];
        $sport=$_POST['sport'][$id];

        //STEP 2:----INSERT event info into expiredEvents
        $sql="INSERT INTO expiredEvents (event_id, sport_type, tournament, 
                        round, team1, team2, venue, event_date)
                        VALUES
                        ('$matchId', '$sport', '$tour', '$round', 
                        '$team1', '$team2','$venue','$event_date')";                                        
        mysql_query($sql) or trigger_error(mysql_error()." in ".$sql);      

        //STEP 3:----DELETE event/match from events table
        $sql ="DELETE FROM events WHERE event_id ='$matchId'";
        $result = mysql_query($sql) or trigger_error(mysql_error()." in ".$sql);

        //Step4: ----check for winner(s) in picks table with given data
        $sql="select * from picks where event_id = '$matchId' and
                 abs(score-$winScore) = (select min(abs(score-$winScore)) from picks 
                 where pick = '$winner');";      
    $result = mysql_query($sql) or trigger_error(mysql_error()." in ".$sql);

    while($row = mysql_fetch_array($result)){
        $winingMember = $row['member_nr'];
        $event = $row['event_id'];
        $pick = $row['pick'];
        $score = $row['score'];

        echo'<br />';
        echo $winingMember;
        echo'<br />';
        echo $event;
        echo'<br />';
        echo $pick;
        echo'<br />';
        echo $score;
        echo'<br />';
        echo $event_date;
        echo'<br />';

        //step5 insert winners into winners table
        $sql="INSERT INTO winners
        (member_nr,event_id, pickedTeam,pickedScore,event_date)
        VALUES
        ('$winingMember','$event','$pick','$score','$event_date')";
        mysql_query($sql) or trigger_error(mysql_error()." in ".$sql);

        }//while

        //Step 6 move old pick data to expired picks table  
        $sql="INSERT INTO expiredPicks (select * from picks WHERE event_id = '$matchId'";
        $result = mysql_query($sql) or trigger_error(mysql_error()." in ".$sql);

        //step7: --Delete expired picks
        $sql="DELETE FROM picks where event_id='$matchId'";
        $result = mysql_query($sql) or trigger_error(mysql_error()." in ".$sql);

    }//for each
}//isset

只是想一想,重新设计您的表并使用join来更有效地处理查询

Table1 Sports Id - Event - Result - Date From - Date To
Table2 Users Id - Name
Table3 Picks Id - Pick - Event (FK to Sports.Id) - Name (FK to Users.Id)
Table4 Winners Id - Winner (FK to Users.ID) - Credit(?)
现在对于表1,若要检查完成了哪个事件,只需检查结果不为null的位置,当事件完成时,就可以使用结果更新表


这只是初步的想法,即使从现在开始,我认为还需要做更多的工作,但这应该足以让您开始。

旁注,特别是因为您正在提高技能,停止使用mysql扩展确实是个好主意。由于它们不安全,因此不推荐使用它们,这是有充分理由的。查看mysqli_uuu准备的语句或PDO。对于大型查询,它们的运行速度也会快很多。操作查询似乎不是瓶颈,但表单会在多个记录中循环,从而对网页执行的多个步骤进行迭代。然而,步骤4查询可以使用优化,因为它在where子句中使用子查询。考虑使用“活动”VS“过期”值的状态栏,以减少插入和删除操作到一列更新中的事件和选择。