【问题标题】:PHP: looking up values in DB and converting before inserting dataPHP:在数据库中查找值并在插入数据之前进行转换
【发布时间】:2021-01-07 20:44:38
【问题描述】:

这可能用 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);

附:使用 MySQL 10.4.14 连接到 XAMPP 3.2.4 使用 Apache 2.4 和 PHP 7.2.34

【问题讨论】:

  • 分享更多代码。根据您的解释,问题出在您执行查询的参数中。
  • ok 添加代码

标签: php html mysql database


【解决方案1】:

你可以为&lt;option&gt;设置一个value,然后将它的值与表单一起提交给服务器。

因此,如果您在呈现 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>';

【讨论】:

  • 从 db select 填充下拉列表。
  • @Biaaach 这只是您的 HTML 最终需要如何查看的示例。您可以使用 PHP 使 HTML 看起来像这样。不幸的是,我目前看不到您用于选择团队的 SQL 查询,因此我无法准确地建议您如何更改它 - 否则我会这样做。我确实说过“在渲染 HTML 时将团队的 ID 放入每个选项中”——我的意思是用 PHP 动态渲染它,如果不清楚,抱歉。
  • @Biaaach 我添加了一个更清晰的示例,基于我认为查询可能是什么,查看您的其他代码,以及处理它的结果 PHP 将是什么。查看更新的答案。
  • 谢谢@ADyson,你真的帮了我大忙!
  • @Biaaach 是的,很抱歉,您真的应该为此使用 mysqli_fetch_assoc。如果没有它,你的原件就不应该工作,这很奇怪。无论如何,我确实在我的原始版本中打错了字,我在发布后不久就对其进行了编辑。检查您是否使用的是最新版本。如果您在此处查看答案的修订历史记录:stackoverflow.com/posts/65620103/revisions 您可以看到我所做的更改。
【解决方案2】:

我会完全不同。我是针对分类页面的类别这样做的。

而且我认为您已经具备所有先决条件。

首先获取表格teams的所有值。

SELECT ID, teams from teams 

将其存储到一个数组中。

然后从该数组中构建您的 2 个选择下拉列表 - 值是 ID,显示的是团队名称,您的用户不会看到任何差异 该函数仅返回选项 - 选择行被放入代码/模板中

因此,您将拥有 id,而不必执行 2 个昂贵的文本搜索子查询。

$query = "INSERT INTO sport_events
          (event_date, start_time, end_time, home_team, visiting_team) values
          (?, ?, ?, ?, ?))";

无需更改数据库。 子查询没有问题 下拉列表自动填充 - 如果您有一个新团队,只需在数据库中插入一行,它就会在那里 :-)

【讨论】:

  • 好的哇,这好多了,但是我将如何将团队 ID 与团队名称分开呢?一旦用户选择了团队名称,我就不再关心它,只想插入相应的 ID?
  • 是的,我也必须获取 ID,别无他法。丹克目录!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多