如何将表单值(一些具有相同名称)插入多个MySQL行

时间:2017-01-23 20:28:31

标签: php mysql mysqli

在过去的几个小时里,我一直在搜索这个问题,并且有一些非常相似的问题和答案,但没有一个对我的情况非常有用。我要做的是插入一组歌曲列表,设置为两列相同的值,每行一列,并通过单选按钮设置几个选项。后者是我无法在textarea中编写所有歌曲并将其拆分的原因。

这就是表格的样子(显然没有完全设计)

enter image description here

现在我只有三个工作,实际上可以通过javascript添加无限量。

代码:

<form action="" method="post">
        <label>Session ID</label>
        <input type="text" name="session-id"><br>
        <label>Songs</label><br>
        <input type="text" name="song-key[]"><input type="checkbox" name="is-partial[]"><input type="checkbox" name="is-jam[]"><br>
        <input type="text" name="song-key[]"><input type="checkbox" name="is-partial[]"><input type="checkbox" name="is-jam[]"><br>
        <input type="text" name="song-key[]"><input type="checkbox" name="is-partial[]"><input type="checkbox" name="is-jam[]"><br>
        <input type="text" name="update-date" value="<?php echo date(" Y-m-d H:i:s ");?>" hidden readonly><br>
        <input type="submit" name="submit" value="Submit">
    </form>

假设已经设置了ID并且为每个歌曲输入了一首独特的歌曲,以及单选按钮上的任何变化,所需的结果将是三个表行。 session-id和update-date都是相同的值,其余的将根据条目唯一。

这是我目前所拥有的,但它只会插入三首歌曲中的最后一首。

for ($i=0; $i < count($_POST['song-key']); $i++ ) {
$sessionkey = mysqli_real_escape_string($connection, $_POST["session-key"]);
$songkey = mysqli_real_escape_string($connection, $_POST["song-key"][$i]);
$partial = mysqli_real_escape_string($connection, isset($_POST['is-partial'][$i])) ? 1 : 0;
$jam = mysqli_real_escape_string($connection, isset($_POST['is-jam'][$i])) ? 1 : 0;
$updated = mysqli_real_escape_string($connection, $_POST["update-date"]);

$sql = "INSERT INTO session_songs (session_key, song_key, is_partial, is_jam, last_updated)
VALUES ('$sessionkey', '$songkey', '$partial', '$jam', '$updated')";
}

我需要更改以确保输入所有三个(或更多)?

1 个答案:

答案 0 :(得分:2)

如果更改输入名称,则可以获得更有用的$_POST数组。

<input type="text" name="songs[0][key]">
<input type="checkbox" name="songs[0][is-partial]">
<input type="checkbox" name="songs[0][is-jam]"><br>

<input type="text" name="songs[1][key]">
<input type="checkbox" name="songs[1][is-partial]">
<input type="checkbox" name="songs[1][is-jam]"><br>

<input type="text" name="songs[2][key]">
<input type="checkbox" name="songs[2][is-partial]">
<input type="checkbox" name="songs[2][is-jam]"><br>

使用指定的键,复选框类型输入将与文本输入正确匹配,您现在可以使用它们,它们不会* ,因为只有选中的复选框才会提交给PHP。 (尝试仅检查第二行中的“is-partial”和第三行中的“is-jam”,然后var_dump($_POST),您将看到它们都有索引0.)

如果您的表单结构如此,则可以使用foreach循环而不是for循环插入记录。

foreach ($_POST['songs'] as $song) {
    $key = $song['key'];
    $partial = isset($song['is-partial']) ? 1 : 0;
    $jam = isset($song['is-jam']) ? 1 : 0;
    // do the insert inside the loop rather than just building the SQL
}

你目前只得到最后一个的原因是你在循环中定义了SQL字符串,但是没有在循环中执行语句,你只能从循环的最后一次迭代中获取值。在循环中移动查询执行,你应该得到所有三行。

*除非全部检查