首页 > 解决方案 > PHP:在数据库中查找值并在插入数据之前进行转换

问题描述

使用 javascript 可能更容易做到这一点,但我碰巧仅限于这个项目的 MySQL、PHP 和 Apache(显然还有 HTML 和 CSS),而且我不擅长 PHP

我基本上已经完成了整个事情,但遇到了一个小问题。

用户创建一个体育赛事,并为此用户在两个 html 下拉列表的帮助下选择两个对立的球队(两个下拉列表都显示从位于我的数据库中的“团队”表中获取的相同的团队数组)。团队的名称在页面上显示和选择,因此一旦用户提交表单,就会在 PHP 中存储为字符串变量。

关键是,用户选择的两个团队随后将保存在一个表中,该表旨在包含两个团队的 ID,而不是他们的名称(这样更容易实施完整性约束)。但是我必须再次查询数据库以从“团队”表中获取 ID,然后将其存储在我感兴趣的表中。

使这更复杂的是,除了两个团队下拉列表之外,在前面提到的 html 表单中,用户输入了许多与两个团队一起存储的事件的其他数据;该数据应该按原样插入到同一个数据库表中,除了两个团队之外的所有内容都应该按原样插入。

我最初的想法是在我将用来插入团队数据的两个值占位符旁边添加一个子查询:

$query = "INSERT INTO sport_events
          (event_date, start_time, end_time, home_team, visiting_team) values
          (?, ?, ?, (select ID from teams where team_name = ?), (select ID from teams where team_name =?))";

然而,这会返回一个错误:

Subquery returns more than 1 row 

这没有任何意义。如果我尝试手动将相同的元组插入数据库(在 mysql 中使用这两个子查询)一切都很好:

('xyz_date', 'xyz_time', 'xyz_time', (select ID from teams where team_name = 'Manchester United'), (select ID from teams where team_name = 'Arsenal'))

如果我尝试使用两个子查询之一来查询数据库,结果总是一行,因为 team_name 总是唯一的(下面是查询):

select ID from teams where team_name = 'Manchester United';

编辑:这是代码

如何在两个 html 下拉列表中获取和显示团队:

        $teams = array();
/*populate an array with the teams from the database*/
        while ($row = mysqli_fetch_array($response)) {
          array_push($teams, $row['team_name']);
        }
        echo '<p>Home Team: <select name="home_team" value ="">';
/*unload the teams into the html element - first dropdown*/
        foreach ($teams as $team) {
          echo '<option>' . $team . '</option>';
        }
        echo '</select></p>';
/*unload the teams into the html element - second dropdown*/
        echo '<p>Visiting Team: <select name="visiting_team" value ="">';
        foreach ($teams as $team) {
          echo '<option>' . $team . '</option>';
        }
        echo '</select></p>';

然后检查用户插入表单的五条数据是否为空值(以下示例)

if(isset($_POST['submit'])) {

if(empty($_POST['home_team'])) {
        $data_missing[] = 'Home Team';
      }
      else {
        $h_team = trim($_POST['home_team']);
      }
...

然后就数据而言

if(empty($data_missing)){
        require_once('mysqli_connect.php');
        $query = "INSERT INTO sport_events
          (event_date, start_time, end_time, home_team, visiting_team) values
          (?, ?, ?, (select ID from teams where team_name = ?), (select ID from teams where team_name =?))";

        $stmt = mysqli_prepare($dbc, $query);

        mysqli_stmt_bind_param($stmt, "sssii", $e_date, $beg_at,
        $end_at, $h_team, $v_team);

        mysqli_stmt_execute($stmt);

        $affected_rows = mysqli_stmt_affected_rows($stmt);

PS 使用 MySQL 10.4.14 连接到使用 Apache 2.4 和 PHP 7.2.34 的 XAMPP 3.2.4

标签: phphtmlmysqldatabase

解决方案


您可以value为设置 a <option>,然后将其与表单一起提交给服务器的值。

因此,如果您在呈现 HTML 时将团队的 ID 放入每个选项中,那么在提交表单时您将再次获得选定的 ID。

例如

<option value="1">Anywhere United</option>
<option value="2">SomewhereElse Rangers</option>
<option value="3">Lonely Wanderers</option>

更多信息:https ://developer.mozilla.org/en-US/docs/Web/HTML/Element/option

用于选择团队的当前 SQL 未显示,但我猜想执行此操作的 SQL 查询需要类似于:

SELECT ID, team_name FROM teams

然后 PHP 读取它:

$teams = array();
/*populate an array with the teams from the database*/
while ($row = mysqli_fetch_assoc($response)) {
  array_push($teams, $row);
}
echo '<p>Home Team: <select name="home_team" value ="">';


/*unload the teams into the html element - first dropdown*/
foreach ($teams as $team) {
  echo '<option value="' . $team['ID'] . '">' . $team['team_name'] . '</option>';
}
echo '</select></p>';


/*unload the teams into the html element - second dropdown*/
echo '<p>Visiting Team: <select name="visiting_team" value ="">';
foreach ($teams as $team) {
  echo '<option value="' . $team['ID'] . '">' . $team['team_name'] . '</option>';
}
echo '</select></p>';

推荐阅读