【发布时间】: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 添加代码