#php #forms #mysqli #dropdown #hidden
#php #формы #mysqli #выпадающий список #скрыто
Вопрос:
Используя AddTeamPlayer.php страница для передачи выбранного значения из выпадающего списка формы через скрытое поле в другое AddPlayer.php . Значение не отправляется. Код будет размещен со всех трех страниц. Результат, ошибка, показывает пустое значение при попытке отправить выбранное скрытое значение.
AddTeamPlayer.php
<select name="myselectbox">
<option>Select</option>
<?php
$sql = "SELECT TeamName, TeamID FROM Team ORDER BY TeamName";
$result = mysqli_query($link, $sql);
while ($row = mysqli_fetch_array($result)) {
echo '<option>' . $row['TeamName'] .' '. $row['TeamID'] . ' </option>';
'<input type="hidden" name="hiddenTeamID" value="('. $row['TeamID'] . ')" >';
}
?>
</select>
AddPlayer.php
//Team from the dropdown on AddTeamPlayerData.php page - hidden variable
$TeamID = mysqli_real_escape_string($link, $_REQUEST['hiddenTeamID']);
echo "hiddenteamid is $TeamID";
// insert PLAYER table data from form
$sql1 = "INSERT INTO Player (FirstName, LastName, Number, TeamID) VALUES ('$PlayerFirstName', '$PlayerLastName', '$PlayerNumber', '$TeamID')";
ПОЛУЧЕНА ОШИБКА
hiddenteamid — это
ОШИБКА: не удалось выполнить данные проигрывателя… ВСТАВЬТЕ В Player (FirstName, LastName, Number, TeamID) ЗНАЧЕНИЯ (‘pfn’, ‘pln’, ‘3’, «).
Не удается добавить или обновить дочернюю строку: сбой
playmak3_pitchcountstats
Player
ограниченияPlayer_ibfk_1
внешнего ключа (., ССЫЛКИ НА ВНЕШНИЙ КЛЮЧ ОГРАНИЧЕНИЯTeamID
Team
() (TeamID
)))
Комментарии:
1. Нам нужно увидеть больше
AddTeamPlayer.php
и как вы отправляете этоform
(?; мы не видимform
теги) вAddPlayer.php
2. Вы не можете поместить
<input>
внутрь<select>
3. Почему вы заключаете
hiddenTeamID
значение в круглые скобки? Это буквально отправит что-то вроде"(1)"
4. Если <select name=»myselectbox»> находится вне <form> в AddTeamPlayer.php затем вы можете использовать jQuery «onChange» для установки выбранного значения в поле «скрыто». Вы не можете добавить скрытое поле между тегом выбора.
Ответ №1:
Примечание: Как справедливо отметил @Phil, у вас на самом деле есть свое hidden
поле внутри select
, и поэтому это первоначальное исправление не сработает. Тем не менее, я все равно оставлю это здесь….
У вас ошибка в вашем PHP
коде:
1> $sql = "SELECT TeamName, TeamID FROM Team ORDER BY TeamName";
2> $result = mysqli_query($link, $sql);
3> while ($row = mysqli_fetch_array($result)) {
4> echo '<option>' . $row['TeamName'] .' '. $row['TeamID'] . ' </option>';
5>
6> '<input type="hidden" name="hiddenTeamID" value="('. $row['TeamID'] . ')" >';
7>
8> }
В строке 4
у вас есть точка с запятой в конце строки, завершающей echo
. Это означает, что эта строка 6
никогда не повторяется. Таким образом, с точки зрения интерфейса это выглядит так, как вы ожидаете, но скрытого поля там нет, и поэтому оно не передается.
Удалите точку с запятой и замените ее на .
вместо.
Исправление кода
Основное исправление
AddTeamPlayer.php
<select name="myselectbox">
<option disabled hidden selected>Select a team...</option>
<?php
$sql = "SELECT TeamName, TeamID FROM Team ORDER BY TeamName";
$result = mysqli_query($link, $sql);
while ($row = mysqli_fetch_array($result)) {
$teamid = $row["TeamID"];
$teamname = $row["TeamName"];
echo "<option value="{$teamid}">{$teamname}</option>";
}
?>
</select>
AddPlayer.php
//Team from the dropdown on AddTeamPlayerData.php page
$teamid = (int)$_POST["myselectbox"]; // Assuming that TeamID is an integer... Casting it to int is the only escaping you need
echo "Team ID is: ".$teamid;
// Insert PLAYER table data from form
$sql1 = "INSERT INTO Player (FirstName, LastName, Number, TeamID) VALUES ('{$PlayerFirstName}', '{$PlayerLastName}', '{$PlayerNumber}', {$teamid})";
Однако даже это оставляет вас потенциально открытыми для проблем. Часто цитируется (на этом сайте), что «экранирования вашего ввода недостаточно», чтобы защитить вас от вредоносного поведения.
Поэтому я настоятельно рекомендую вам изучить подготовленные инструкции с mysqli
помощью или PDO
Улучшение кода
mysqli
$data= [
$_POST["FirstName"], // First name from form
$_POST["LastName"], // Last name from form
$_POST["Number"], // Number from form
$_POST["myselectbox"] // Team id from select box
];
$sql = "INSERT INTO Player (FirstName, LastName, Number, TeamID) VALUES (?, ?, ?, ?)"; // SQL statement using `?` as place holders
$query = $mysqli->prepare($sql); // Prepare query
$query->bind_param("ssii", ...$data); // Bind parameters, setting data type, using PHPs unpacking operator ...
$query->execute(); // Execute the query
PDO
$data= [
$_POST["FirstName"], // First name from form
$_POST["LastName"], // Last name from form
$_POST["Number"], // Number from form
$_POST["myselectbox"] // Team id from select box
];
$sql = "INSERT INTO Player (FirstName, LastName, Number, TeamID) VALUES (?, ?, ?, ?)"; // SQL statement using `?` as place holders
$query = $pdo->prepare($sql); // Prepare query
$query->execute($data); // Bind parameters and execute query
Комментарии:
1. Он
<input>
должен быть до или после<select>
тега, а не внутри него2. @Phil честно говоря, это вообще не должно происходить.. Судя по всему, это должно быть
value
добавлено кoption
.3. Хм, да. Чем больше я смотрю на код OP, тем больше он запутывается. Похоже, OP должен просто использовать
$_REQUEST["myselectbox"]
вместо4. Спасибо за отзыв. Изменения были внесены с использованием раздела «Исправление кода» выше. TeamID теперь возвращается, но не возвращает правильное целое число. Например, он возвращает 9, когда в базе данных нет идентификатора команды, равного 9. Кроме того, когда возвращаются другие выбранные идентификаторы TeamID, они возвращают 0.
5. @bgstewart7 не могли бы вы добавить обновленный код в вопрос, чтобы я мог видеть, с чем мы сейчас работаем?