如何在逻辑上使用 PHP 显示数据库表的所有可能值?
Posted
技术标签:
【中文标题】如何在逻辑上使用 PHP 显示数据库表的所有可能值?【英文标题】:How to logically use PHP to display all possible values of a database table? 【发布时间】:2016-08-01 16:28:43 【问题描述】:所以我创建了一个接受下拉框输入的界面..
然后在 html 表中显示三个不同数据库表中的数据,其中包含所有符合条件的条目。
表格显示在上图的底部。
我的问题是我如何使用 php(使用循环或其他方式)来重新编写我的代码并创建一个巨大的 HTML 页面来处理每个事件? AKA 我需要生成 126 个表:
但我不确定如何处理这个问题。我最初的想法是使用一个循环,然后将生成一个表的代码放入其中,但我不知道要设置什么条件让它停止,也不知道如何循环浏览下拉列表中的不同选项。我不是要求任何人为我创建代码,而是向我指出要使用什么逻辑的方向.. 之后,我可能可以自己弄清楚。谢谢大家。 :)
以下是我的代码,用于生成每个表格,并带有注释形式的注释:
<?php
error_reporting(E_ALL);
$dbhost = "localhost"; //logs into my localhost server
$dbname = "sportsDay";
$dbuser = "root";
$dbpass = "...";
$year=$_POST['Year']; //gets variables from the drop-downs in the form displayed above
$gender=$_POST['Gender'];
$event=$_POST['Event'];
$result[]=0;
try
$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->exec("SET CHARACTER SET utf8mb4");
$sql = "SELECT Students.lName, Students.fName, Students.house
FROM Entries INNER JOIN Events ON Entries.ev1ID = Events.ID
JOIN Students ON Students.stID = Entries.stID
WHERE (Entries.ev1ID = :event or Entries.ev2ID = :event2) and (Students.year = :year)
AND (Students.gender = :gender)
ORDER BY Students.house ASC";
//my SQL code that matches up the values from the drop-downs to the values in the database tables
$stmt = $conn->prepare($sql);
$stmt->bindValue(':event', $event);
$stmt->bindValue(':event2', $event);
$stmt->bindValue(':year', $year);
$stmt->bindValue(':gender', $gender);
$stmt->execute();
$result = $stmt->fetchAll();
$count = $stmt->rowCount();
catch(PDOException $e)
echo $e->getMessage();
?>
<html>
<body>
<?php if ($count > 0): ?> //checks to see if there are results. if there are results, it displays them:
<table border="1" >
<tr>
<th>Name</th>
<th>House</th>
<th>Score</th>
</tr>
<?php foreach ($result as $row)
?>
<tr>
<td><?php echo $row['fName']. ' '.$row['lName'] ?></td>
<td><?php echo $row['house'] ?></td> <td></td>
</tr>
<?php ?>
</table>
<?php else: echo "No results." ?> //if not, it displays that there are no results.
<?php endif ?>
</body>
</html>
【问题讨论】:
所以这篇文章有很多内容可以吸收,但是您是否想一次生成很多表格?这就是我阅读底部的收获? @Jek 是的,基本上我想一次生成很多表。很抱歉,不清楚,为了清楚起见,我将编辑帖子。 @Jek 现在有意义吗? 与我看到的很多 SO 帖子相比,你在这里做的很多事情都是正确的:你有错误报告,你有正确的字符集,你有 PDO 你正在使用对象数据库界面。你正在使用 try/catch 块......到目前为止做得很好:) @Martin 您不知道这对我来说意味着什么,先生。非常感谢。 【参考方案1】:由于您已经有了生成一个表的代码,因此可以使用它来生成所有个表是正确的。
您需要做的就是循环浏览表单提供的所有可能性。
您必须有一个可能的选项列表才能构建 HTML 表单,只需在嵌套的 foreach 循环中使用这些选项列表即可。
foreach ($event as $e)
foreach ($gender as $g)
foreach ($year as $y)
// Use $e, $g and $y for your query and table construction.
$sql = ...; // Query stays the same.
$stmt->bindValue(':event', $e);
$stmt->bindValue(':event2', $e);
$stmt->bindValue(':year', $y);
$stmt->bindValue(':gender', $g);
这是根据您提供的代码的完整示例:
<?php
error_reporting(E_ALL);
$dbhost = "localhost"; //logs into my localhost server
$dbname = "sportsDay";
$dbuser = "root";
$dbpass = "...";
$conn = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->exec("SET CHARACTER SET utf8mb4");
?>
<html>
<body>
<?php
// Lists of possible DB values
$event = array("100m", "100m relay", "High Jump", ...); // a list of all events
$gender = array("F", "M"); // a list of all genders
$year = array(7, 8, 9, 10, 11, 12); // a list of all classes
foreach ($event as $e)
foreach ($gender as $g)
foreach ($year as $y)
$result[] = 0;
try
$sql = "SELECT Students.lName, Students.fName, Students.house
FROM Entries INNER JOIN Events ON Entries.ev1ID = Events.ID
JOIN Students ON Students.stID = Entries.stID
WHERE (Entries.ev1ID = :event or Entries.ev2ID = :event2) and (Students.year = :year)
AND (Students.gender = :gender)
ORDER BY Students.house ASC";
$stmt = $conn->prepare($sql);
$stmt->bindValue(':event', $e);
$stmt->bindValue(':event2', $e);
$stmt->bindValue(':year', $y);
$stmt->bindValue(':gender', $g);
$stmt->execute();
$result = $stmt->fetchAll();
$count = $stmt->rowCount();
catch (PDOException $e)
echo $e->getMessage();
if ($count > 0)
?>
<table border="1" >
<tr>
<th>Name</th>
<th>House</th>
<th>Score</th>
</tr>
<?php foreach ($result as $row)
?>
<tr>
<td><?php echo $row['fName']. ' '.$row['lName'] ?></td>
<td><?php echo $row['house'] ?></td> <td></td>
</tr>
<?php ?>
</table>
<?php
else
echo "No results for $e ($g, $y).";
?>
</body>
</html>
【讨论】:
嗨,保罗,我理解这个 foreach() 方法背后的原因。但是,我对如何在表单的操作中实现这一点感到非常困惑: "$year=$_POST['Year']; $gender=$_POST['Gender']; $event=$_POST['Event'] ; "我必须改变这部分,对吧? 您不再需要该表格,因为将打印所有可能性(表格)。您可以在数据库查询中使用变量$e $g and $y
。查看更新的答案。
嗯.. pastebin.com/jWyMjJku 喜欢这样吗?我很困惑,很抱歉——看来我可能遗漏了一些重要的东西……
基本上是的。你试过了吗?结果的表声明也应该在循环内。乍一看我觉得不错。
是的,我确实尝试过,但不,它不起作用:\这就是我问的原因。我收到以下错误; “注意:未定义的变量:第 18 行 dir 中的事件”和“警告:第 18 行 dir 中的 foreach() 提供的参数无效”。第 18 行如下:“foreach ($event as $e) ”但我不应该为每个 foreach() 方法收到错误吗?【参考方案2】:
我重新创建了您的数据库结构。使用左连接,我能够检索您需要按事件 ID 排序的所有数据。
我的数据库娱乐:
学生桌
+------+---------+-----------+-------+
| stID | fName | lName | house |
+------+---------+-----------+-------+
| 1 | Nadir | Roman | east |
| 2 | Jesus | Lopez | west |
| 3 | Ioannis | Chalkadis | west |
| 4 | Adry | Pepes | east |
| 5 | David | Caretas | west |
+------+---------+-----------+-------+
事件表
+----+-----------+---------------+
| ID | name | location |
+----+-----------+---------------+
| 1 | 100m | Track |
| 2 | 400m | Track |
| 3 | High Jump | High Jump Pit |
+----+-----------+---------------+
成绩表
+------+-------+-------+
| stID | ev1ID | ev2ID |
+------+-------+-------+
| 1 | 1 | 2 |
| 2 | 2 | 3 |
| 3 | 1 | 3 |
| 4 | 1 | 2 |
| 5 | 1 | 3 |
+------+-------+-------+
查询:
mysql> SELECT Events.ID, Events.name, location, Scores.stID, fName, lName, house FROM Scores LEFT JOIN (Students, Events) ON (Students.stID = Scores.stID AND (Events.ID = Scores.ev1ID OR Events.ID = Scores.ev2ID)) ORDER BY ID;
输出是:
+------+-----------+---------------+------+---------+-----------+-------+
| ID | name | location | stID | fName | lName | house |
+------+-----------+---------------+------+---------+-----------+-------+
| 1 | 100m | Track | 1 | Nadir | Roman | east |
| 1 | 100m | Track | 5 | David | Caretas | west |
| 1 | 100m | Track | 4 | Adry | Pepes | east |
| 1 | 100m | Track | 3 | Ioannis | Chalkadis | west |
| 2 | 400m | Track | 2 | Jesus | Lopez | west |
| 2 | 400m | Track | 1 | Nadir | Roman | east |
| 2 | 400m | Track | 4 | Adry | Pepes | east |
| 3 | High Jump | High Jump Pit | 2 | Jesus | Lopez | west |
| 3 | High Jump | High Jump Pit | 5 | David | Caretas | west |
| 3 | High Jump | High Jump Pit | 3 | Ioannis | Chalkadis | west |
+------+-----------+---------------+------+---------+-----------+-------+
您可以将此输出拆分为不同的数组,每个事件 1 个:
$result = $stmt->fetchAll();
$mappedEvents = [];
array_map(function($entry)
if(!isset($mappedEvents[$entry['ID']]))
$mappedEvents[$entry['ID']] = [];
$mappedEvents[$entry['ID'][] = $entry;
, $result);
foreach($mappedEvents as $eventID => $data)
// $eventID = event ID
// $data = Array with all info about the event (students, location, etc..)
【讨论】:
您好,先生。 Scores 不是数据库中的表 :) 它只是表的外部部分,因为我正在创建的系统旨在创建可以打印出来的页面,以便可以手动编写页面,也就是表格的空白栏是空白的,因此可以亲自填写。另外,我能否要求您进一步解释您的回答?我不明白它是如何回答我的问题的,因为我对 PHP 非常缺乏经验,恐怕我可能误解了你的回答。谢谢你的最低点:) 也许我误解了你的问题。您正在尝试构建一个 html 页面,其中列出了每个 Event 的表格,并且在每个表格上您应该显示有关参与他们的学生的信息,对吗? 是的。 :) 但我需要为每个事件创建一个单独的表,您的输出似乎是一个表? 我在底部添加了一个示例,展示如何拆分输出并为每个事件获取 1 个数组。以上是关于如何在逻辑上使用 PHP 显示数据库表的所有可能值?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 php 脚本中获取 JSON 格式的 mysql 表的所有值?
如何查询一个oracle数据库中所有表的所有字段哪个包含特定字符串?