Я пытаюсь вставить 4 формы, которые являются одинаковыми. но с разными значениями для mysql с использованием PHP.
Когда я отправляю свои данные, база данных принимает только значения из последней формы и вставляет ее 4 раза. Я пытаюсь получить значения из всех 4 на submit.
<div class="req3"> <h1>Requirement 4</h1> <form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>"> <br> Enter info for 4 teams and it will inserted into the database<br><br> <div class="sqlForm"> <p class="formHead">Team 1</p> <label>Team Name:</label> <input type="text" name="teamname"><br> <label>City:</label> <input type="text" name="city"><br> <label>Best Player:</label> <input type="text" name="bestplayer"><br> <label>Year Formed:</label> <input type="text" name="yearformed"><br> <label>Website:</label> <input type="text" name="website"><br> </div> <div class="sqlForm"> <p class="formHead">Team 2</p> <label>Team Name:</label> <input type="text" name="teamname"><br> <label>City:</label> <input type="text" name="city"><br> <label>Best Player:</label> <input type="text" name="bestplayer"><br> <label>Year Formed:</label> <input type="text" name="yearformed"><br> <label>Website:</label> <input type="text" name="website"><br> </div> <div class="sqlForm"> <p class="formHead">Team 3</p> <label>Team Name:</label> <input type="text" name="teamname"><br> <label>City:</label> <input type="text" name="city"><br> <label>Best Player:</label> <input type="text" name="bestplayer"><br> <label>Year Formed:</label> <input type="text" name="yearformed"><br> <label>Website:</label> <input type="text" name="website"><br> </div> <div class="sqlForm"> <p class="formHead">Team 4</p> <label>Team Name:</label> <input type="text" name="teamname"><br> <label>City:</label> <input type="text" name="city"><br> <label>Best Player:</label> <input type="text" name="bestplayer"><br> <label>Year Formed:</label> <input type="text" name="yearformed"><br> <label>Website:</label> <input type="text" name="website"><br><br></div> <input class="styled-button" type="submit" name="insert" value="Submit"> </form> <?php if (isset($_POST['insert'])) { insertTable(); } else { $conn->close(); } function insertTable() { $servername = "localhost:3306"; $username = "XXXXX"; $password = "XXXXX"; $dbname = "XXXXX"; // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { echo ("Connection failed: " . $conn->connect_error); } else { $varTname = $_POST['teamname']; $varCity = $_POST['city']; $varBplayer = $_POST['bestplayer']; $varYearformed = $_POST['yearformed']; $varWebsite = $_POST['website']; $sql = "INSERT INTO Teams (teamname, city, bestplayer, yearformed, website) VALUES ('$varTname', '$varCity', '$varBplayer', '$varYearformed', '$varWebsite'), ('$varTname', '$varCity', '$varBplayer', '$varYearformed', '$varWebsite'), ('$varTname', '$varCity', '$varBplayer', '$varYearformed', '$varWebsite'), ('$varTname', '$varCity', '$varBplayer', '$varYearformed', '$varWebsite')"; if ($conn->multi_query($sql) === TRUE) { echo "New record created successfully"; } else { echo "Error: " . $sql . "<br>" . $conn->error; } mysql_query($sql); function PrepSQL($value) { // Stripslashes if(get_magic_quotes_gpc()) { $value = stripslashes($value); } // Quote $value = "'" . mysql_real_escape_string($value) . "'"; return($value); } } } ?>
chnage имена ваших элементов управления, чтобы они отправляли в виде массивов
<input type="text" name="teamname[G1]"> <input type="text" name="teamname[G2]">
это почему, когда вы используете $varTname = $_POST['teamname'];
$varTname
– это массив, и каждое из 4 значений teamname
устанавливается как $varTname['G#']
где # соответствует номеру, установленному для этой группы полей ввода.
затем используйте цикл for, чтобы получить данные и выполнить запрос, что-то вроде ниже. в то время как вы на нем вы также можете устранить уязвимость SQL Injection. вы также можете захотеть сделать еще несколько санитарных условий для данных, чтобы быть уверенными
$varTname = $_POST['teamname']; $varCity = $_POST['city']; $varBplayer = $_POST['bestplayer']; $varYearformed = $_POST['yearformed']; $varWebsite = $_POST['website']; $stmt = $mysqli->prepare('INSERT INTO Teams (teamname, city, bestplayer, yearformed, website) VALUES (?,?,?,?,?,?)'); $varTname1Bind = ""; $varTnameBind = ""; $varCityBind = ""; $varBplayerBind = ""; $varWebsiteBind = ""; // assuming they are all strings, adjust where needed $stmt->bind_param('sssssss', $varTname1Bind, $varTnameBind, $varCityBind, $varBplayerBind, $varYearformedBind, $varWebsiteBind); for($i = 1; i < 5; $i++) { $varTname1Bind = $varTname['G'.$i]; $varTnameBind = $varTname['G'.$i]; $varCityBind = $varCity['G'.$i]; $varBplayerBind = $varBplayer['G'.$i]; $varYearformedBind = $varYearformed['G'.$i]; $varWebsiteBind = $varWebsite['G'.$i]; $stmt->execute(); }
сэкономит вам на том, сколько кода вам нужно сделать
Вы можете преобразовать свои input
name
s в массивы, добавив []
затем в ваш php-цикл через массив $_POST[]
и создав свой $sql
объединив значения, пока вы не закончите цикл через все значения, а INSERT
это как несколько значений ,
HTML:
<label>Team Name:</label> <input type="text" name="teamname[]"><br> <label>City:</label> <input type="text" name="city[]"><br> <label>Best Player:</label> <input type="text" name="bestplayer[]"><br> <label>Year Formed:</label> <input type="text" name="yearformed[]"><br> <label>Website:</label> <input type="text" name="website[]"><br>
PHP:
<?php $sql = "INSERT INTO Teams (teamname, city, bestplayer, yearformed, website) VALUES "; for($i = 0 ; $i < count($_POST['teamname']) ; $i++){ $varTname = $_POST['teamname'][$i]; $varCity = $_POST['city'][$i]; $varBplayer = $_POST['bestplayer'][$i]; $varYearformed = $_POST['yearformed'][$i]; $varWebsite = $_POST['website'][$i]; $sql .= "(" .$varTname. " , " .$varCity. " , " .$varBplayer. " , " .$varYearformed. " , " .$varWebsite. "),"; } $sql = rtrim($sql, ','); // omit the last comma // Then Excute your query ?>
Таким образом, вам не нужно name="test2"
им уникальные имена name="test1"
, name="test2"
и поэтому, чтобы увидеть это в действии, проверьте этот name="test2"
PHP в нижней части страницы результатов, я уже установил значения полей ввода, просто нажмите «Отправить» и перейдите в нижнюю часть страницы результатов, чтобы увидеть INSERT
оператор INSERT
.
Обратите внимание, что приведенный выше SQL
– это просто демонстрация того, как его создать, НЕ используйте его так, как это делается без проверки и дезинфекции. ТАКЖЕ STOP запрашивает этот способ и вместо этого использует подготовленные выражения с PDO или MySQLi, чтобы избежать SQL-инъекций.
Поэтому для подготовленных операторов MySQLi, процедурного стиля – я работаю с PDO – как вы видите в этом PHP Fiddle 2 , код:
<?php // you validation goes here if (isset($_POST['insert'])) { insertTable(); } else { $conn->close(); } function insertTable() { // enter your credentials below and uncomment it to connect //$link = mysqli_connect('localhost', 'my_user', 'my_password', 'world'); $sql = "INSERT INTO Teams (teamname, city, bestplayer, yearformed, website) VALUES"; $s = ''; $bind = ''; for($i = 0 ; $i < count($_POST['teamname']) ; $i++){ $sql .= " (?, ?, ?, ?, ?)"; $s .= 's'; $varTname = $_POST['teamname'][$i]; $varCity = $_POST['city'][$i]; $varBplayer = $_POST['bestplayer'][$i]; $varYearformed = $_POST['yearformed'][$i]; $varWebsite = $_POST['website'][$i]; $bind .= " , " . $varTname. " , " .$varCity. " , " .$varBplayer. " , " .$varYearformed. " , " .$varWebsite; } $sql = rtrim($sql, ','); // omit the last comma $s = "'" .$s. "'"; $stmt = mysqli_prepare($link, $sql); mysqli_stmt_bind_param($stmt, $s , $bind); mysqli_stmt_execute($stmt); } ?>
Обычно это делается путем создания массивов контроллера формы.
<input type="text" name="teamname[]"> <input type="text" name="city[]">
И тогда вы можете получить массив в почтовом запросе.
Надеюсь это поможет!
используйте другое имя, например teamname1
, teamname2
, teamname3
, teamname4
<input type="text" name="teamname1"> <input type="text" name="teamname2"> <input type="text" name="teamname3"> <input type="text" name="teamname4">
Для получения значений: –
$varTname1 = $_POST['teamname1']; $varTname2 = $_POST['teamname2']; $varTname3 = $_POST['teamname3']; $varTname4 = $_POST['teamname4'];
Для значений вставки:.
$sql = "INSERT INTO Teams (teamname) VALUES ('$varTname1'), ('$varTname2'), ('$varTname3'), ('$varTname4')
или вы можете попробовать следующее: –
<input type="text" name="teamname[]">
Получите значение как: –
$_POST['teamname'][0]
попробуйте этот метод
$sql = "INSERT INTO Teams (teamname, city, bestplayer,yearformed,website) VALUES ('$varTname', '$varCity', '$varBplayer', '$varYearformed', '$varWebsite'), "; $sql.= query same as abov $sql.= query same as abov $sql.= query same as abov if (!$mysqli->multi_query($sql)) { echo "Multi query failed: (" . $mysqli->errno . ") " . $mysqli->error; }
обратите внимание .
после первого запроса.
Я думаю, вы также должны использовать клавишу автоматического увеличения
Это должно сработать.