Используйте выпадающий список для передачи основного идентификатора в форму PHP с использованием MYSQLi не работает

#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 не могли бы вы добавить обновленный код в вопрос, чтобы я мог видеть, с чем мы сейчас работаем?