我希望有人可以帮助我进行php编码。这是我正在尝试做的事情:
我在高中时经营着一个视频游戏俱乐部,今年我们有121名成员(这是一个有900名学生的学校中最大的俱乐部)。 Retrogaming在其中很多人中都很受欢迎,这引发了关于拥有排行榜的讨论。因此,我很早就意识到不断更新HTML文件是多余的,因此决定建立一个mysql数据库,在该数据库中,可以将高分的尝试输入表单(仅由我自己)并填充到网页中。所述网页具有用于每个游戏标题的表格,以及数据库中的前3个得分。到目前为止,这部分效果很好。我的数据库架构如下所示:
表1(“游戏系统”):
表2 :(“游戏”)
表3 :(“ solo_leaderboard”)
好的。也许不是完美的,但是这种模式目前仍然有效。我可以添加数据和提取数据,并将其发布到我的网站上的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>
答案 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。
祝你好运!