在过去的几个小时里,我一直在搜索这个问题,并且有一些非常相似的问题和答案,但没有一个对我的情况非常有用。我要做的是插入一组歌曲列表,设置为两列相同的值,每行一列,并通过单选按钮设置几个选项。后者是我无法在textarea中编写所有歌曲并将其拆分的原因。
这就是表格的样子(显然没有完全设计)
现在我只有三个工作,实际上可以通过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')";
}
我需要更改以确保输入所有三个(或更多)?
答案 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字符串,但是没有在循环中执行语句,你只能从循环的最后一次迭代中获取值。在循环中移动查询执行,你应该得到所有三行。
*除非全部检查