如何减少我的PHP代码来循环html表代码?

时间:2018-09-25 12:40:21

标签: php mysql

我希望有人可以帮助我进行php编码。这是我正在尝试做的事情:

我在高中时经营着一个视频游戏俱乐部,今年我们有121名成员(这是一个有900名学生的学校中最大的俱乐部)。 Retrogaming在其中很多人中都很受欢迎,这引发了关于拥有排行榜的讨论。因此,我很早就意识到不断更新HTML文件是多余的,因此决定建立一个mysql数据库,在该数据库中,可以将高分的尝试输入表单(仅由我自己)并填充到网页中。所述网页具有用于每个游戏标题的表格,以及数据库中的前3个得分。到目前为止,这部分效果很好。我的数据库架构如下所示:

表1(“游戏系统”):

  • gamesystems_id(主键,AI)
  • 游戏系统(varchar(30))(例如Atari 2600,NES,Colecovision等)

表2 :(“游戏”)

  • games_id(主键,AI)
  • gamesystems_id(外键)
  • 游戏(varchar(30))(例如Frogger,Crazy Taxi等)

表3 :(“ solo_leaderboard”)

  • id(主键,AI)
  • 游戏系统(varchar(30))
  • 游戏(varchar(30))
  • 名称(varchar(30))
  • 得分(int(10))
  • 日期(日期)
  • 年级(varchar(5))(如果不是学生,则varchar要适应N / A)
  • whois(枚举(“学生”,“老师”,“管理员”,“其他”))

好的。也许不是完美的,但是这种模式目前仍然有效。我可以添加数据和提取数据,并将其发布到我的网站上的php页面。以下是我现在发布的仅2个游戏的代码。这个问题应该很明显。对于要发布高分的每个新游戏,我必须添加30多行代码。这太可笑了。我没有强大的mysql或php背景,但是几年前我花了很多时间编码C ++和Python。我认为应该有一种方法可以使NESTED循环一个接一个地拉动每个游戏系统(表1),并为该系统为每个游戏创建一个表(表2),并用前3个得分填充网页来自排行榜(表3)。不幸的是,我不知道该如何实现。这就是为什么我在这里。有什么想法吗?

<?php
$servername="localhost";
$username="strickho_leader";
$password="***********";
$database="strickho_leaderboards";

echo "
<body style='background-color:powderblue'; 'text-align:center';>
<h1 style='color:black'; 'font-size:300%'; 'text-align:center';>Benton Central M.A.G.I. Gaming Leaderboard</h1>
</body>";

//Create Connection
$conn = new mysqli($servername, $username, $password, $database);

//FREEWAY
//*****************************************
$result = mysqli_query($conn,"SELECT * FROM solo_leaderboard WHERE game LIKE '%Freeway%' ORDER BY score DESC LIMIT 3");

echo "<table style='text-align:center'; border='1';>
<tr>
<th colspan='5'>Freeway</th>
</tr>
<tr>
<th colspan='5'><img src='https://www.mobygames.com/images/covers/l/20735-freeway-atari-2600-front-cover.jpg' height='200' width='145'></th>
</tr>
<tr>
<th>Name</th>
<th>Score</th>
<th>Date</th>
<th>Grade</th>
<th>Role</th>
</tr>";

while($row = mysqli_fetch_array($result))
{
echo "<tr>";
echo "<td>" . $row['name'] . "</td>";
echo "<td><b>" . $row['score'] . "</b></td>";
echo "<td>" . $row['date'] . "</td>";
echo "<td>" . $row['gradelevel'] . "</td>";
echo "<td>" . $row['whois'] . "</td>";
echo "</tr>";
}
echo "</table><br><br>";
//*******************************************
//END FREEWAY


//CRAZY TAXI
//*****************************************
$result = mysqli_query($conn,"SELECT * FROM solo_leaderboard WHERE game LIKE '%Crazy Taxi%' ORDER BY score DESC LIMIT 3");

echo "<table style='text-align:center'; border='1';>
<tr>
<th colspan='5'>Crazy Taxi</th>
</tr>
<tr>
<th colspan='5'><img src='https://www.mobygames.com/images/covers/l/5801-crazy-taxi-dreamcast-front-cover.jpg' height='200' width='200'></th>
</tr>
<tr>
<th>Name</th>
<th>Score</th>

2 个答案:

答案 0 :(得分:0)

您可以进行一个常规查询来检索所有游戏的数据,然后遍历整个查询,而不是对每个游戏进行一次查询。实际上是两个查询,但是那两个查询应该处理所有工作。我的提案要求对您的表格进行一些更改,我将逐步指导您进行操作。

第一查询:

    <servlet-class>com.sun.jersey.server.impl.container.servlet.ServletAdaptor</servlet-class>
    <!-- <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> -->

SELECT * from games 表。没有其他的。 然后取得该结果(每行一场),并使用foreach遍历它:

games

(我使用了foreach ($games as $game) ,但实际上使用变量获取查询结果) 现在您正在遍历游戏,再次进行查询(在循环内)以获取该特定游戏的排行榜。

第二查询:

$games

我的建议是不要使用SELECT * FROM solo_leaderboard WHERE game LIKE '%game_name_from_previous_query%' ORDER BY score DESC LIMIT 3 进行搜索,因为它虽然效率较低,但效率较低。我的建议是更改LIKE表以包含游戏ID,以便您可以使用solo_leaderboard

进行搜索

最后,无需退出最外层的foreach循环,就可以循环浏览第二个查询的结果并像现在一样绘制表。

这是一般想法。这将循环遍历所有游戏,获取每个游戏的排行榜并将其输出到桌子,然后继续进行下一个游戏,依此类推

答案 1 :(得分:0)

使用PHP已有很长时间了,但是我会尽力提供帮助,可能我拼错了一些PHP术语或函数。

第一条建议,最好直接编写html静态内容,而不是直接进行echo,您编写的每段php代码都将由服务器处理,echo的影响很小,但效果为1k html echo的长度比零还差。因此,代替:

<?php
    $servername="localhost";
    $username="strickho_leader";
    $password="***********";
    $database="strickho_leaderboards";

    echo "<body style='background-color:powderblue'; 'text-align:center';>
<h1 style='color:black'; 'font-size:300%'; 'text-align:center';>Benton Central M.A.G.I. Gaming Leaderboard</h1>
</body>";

    //Create Connection
    $conn = new mysqli($servername, $username, $password, $database);

您应该这样做:

<?php
    $servername="localhost";
    $username="strickho_leader";
    $password="***********";
    $database="strickho_leaderboards";
?>

<body style='background-color:powderblue'; 'text-align:center';>
<h1 style='color:black'; 'font-size:300%'; 'text-align:center';>Benton Central M.A.G.I. Gaming Leaderboard</h1>
</body>

<?php
    //Create Connection
    $conn = new mysqli($servername, $username, $password, $database);

如果您使用的是不错的Web开发编辑器,则将以这种方式获得html语法highligth。当您必须在php代码中打印html值时,可以打开一个php代码标签,并制作一个变量echo

从您的答案开始,您当然可以进行嵌套循环。首先,我认为您应该更改数据模型,如果每种游戏的排行榜都不同,则排行榜表中应该有games_id而不是游戏名称。

因此您的代码应如下所示:

<?php
    $LEADER_TOP = 3;
    $servername="localhost";
    $username="strickho_leader";
    $password="***********";
    $database="strickho_leaderboards";
?>

<body style='background-color:powderblue'; 'text-align:center';>
<h1 style='color:black'; 'font-size:300%'; 'text-align:center';>Benton Central M.A.G.I. Gaming Leaderboard</h1>

<?php
    //Create Connection
    $mysqli = new mysqli($servername, $username, $password, $database);

    /* Check connection (from docs) */
    if (mysqli_connect_errno()) {
        printf("Connection error: %s\n", $mysqli->connect_error);
        exit();
    }

    //All games
    $query = "SELECT * FROM games ORDER BY game ASC";

    if ($games = $mysqli->query($query)) {

        // Get single game
        while ($game = $games->fetch_assoc()) {         
            // Print game table
?>

<table style='text-align:center'; border='1';>
    <tr>
        <th colspan='5'><?php echo $game['game']; ?></th>
    </tr>
    <tr>
        <th colspan='5'><img src="<?php echo $game['image']; ?>" height='200' width='145'></th>
    </tr>
    <tr>
        <th>Name</th>
        <th>Score</th>
        <th>Date</th>
        <th>Grade</th>
        <th>Role</th>
    </tr>

<?php
            // Get leaders
            $query = "SELECT * FROM solo_leaderboard WHERE game_id = '"+ $game['games_id'] +"' ORDER BY score DESC LIMIT "+$LEADER_TOP;
            if ($leaders = $mysqli->query($query)) {
                while ($leader = $leaders->fetch_assoc()) {
?>
    <tr>
        <td><?php echo $leader['name']; ?></td>
        <td><b><?php echo $leader['score']; ?></b></td>
        <td><?php echo $leader['date']; ?></td>
        <td><?php echo $leader['gradelevel']; ?></td>
        <td><?php echo $leader['whois']; ?></td>
    </tr>
<?php
                } // END While Leaders

                // Free leaders
                $leaders->free();
            }
?>
</table><br><br>
<?php
        } // END While Games

        // Free games
        $games->free();
    }
?>

如您所见,您需要在游戏模型中添加图片网址,并在排行榜中将游戏名称更改为games_id

另一个个人建议,请在html属性src="xxx"中始终使用doubleqoute。

祝你好运!