如何在逻辑上使用 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 表的所有值?

如何在仅使用 PHP 发布后保留 textarea 表单值

如何查询一个oracle数据库中所有表的所有字段哪个包含特定字符串?

如何在PHP-jQuery中的DataTables中显示列的总和(其中所有值都是十进制值)?

数据结构-----顺序表的实现

如何将表的行从一个数据库插入另一个数据库(使用两个PDO)