如何插入具有多个值的多行,但仅适用于旁边已勾选复选框的项目



我正在为音乐数据库编写一个discography工具。

艺术家可以将曲目、单曲、EP和专辑全部插入数据库的单独表格中。

将曲目放在各自单独的表中,可以将相同的曲目附加到多首单曲、EP和专辑中,同时只需要在数据库中为该曲目保留一张唱片。

这意味着各个曲目页面可以自动生成一个链接列表,链接到它们出现的单曲、EP和专辑。这使得在网站上浏览数据库变得更加流畅。

我已经到了这样一个地步,我正在编写一个工具,将数据库中给定艺术家的任何现有曲目附加到专辑页面上。

我正在使用数据库中的另一个名为"trackconnections"的表来创建曲目表中的曲目id和专辑表中的专辑id之间的关系链接,并提供一个称为albumtracknum的附加列,以便在专辑页面上查询时能够按正确的顺序输出曲目。

该工具的代码位于一个标有"将现有曲目附加到相册"的按钮后面。此工具的代码如下:

if (isset($_POST['attachexistingtracktoalbum-submit'])) {

require "includes/db_connect.pdo.php";
$artistid = $_POST["artistid"];
$albumid = $_POST["albumid"];
echo '<strong>Select each track you would like to add to this album below and type in the track number you want it to have on the album in the box underneith the name of each selected track.</strong><br><br>';
$stmt = $pdo->query("SELECT * FROM track WHERE artist_id = '$artistid'
order by trackname");
while ($row = $stmt->fetch())
{           
echo '<form action="includes/attachexistingtracktoalbum.inc.php" method = "post">';
echo '<div class="checkbox">';
echo '<label>';
echo "<input type='checkbox' name='trackid[]' value='".$row['id']."' />";
echo '<span class="cr"><i class="cr-icon glyphicon glyphicon-ok"></i></span>';
echo ' '.$row['trackname'];
echo '</label>';
echo "<br><label for='albumtracknum'>Track number:</label><br>
<input type='text' name='albumtracknum[]'>
<input type='hidden' name='albumid[]' value='".$albumid,"'>
<br><br>";
echo '</div>';
}
?>
<input type="hidden" name="albumidforreturn" value="<?php echo $albumid;?>">
<button type="submit" name="attachexistingtracktoalbum-submit">Attach track(s) to album</button>

<?php }
else {
header("Location: /index.php");
exit();
}?>

(注意:这里的帖子数据没有为sql查询清除,因为它是以隐藏的形式从原始相册页面传递的)

这会生成一个页面,其中包含当前艺术家的所有曲目名称,列表中有复选框,每个曲目名称后面都有一个数据输入框,用于输入要添加到的专辑的曲目编号。

提交表格后交给以下代码:

if (isset($_POST['attachexistingtracktoalbum-submit'])) {
require "db_connect.pdo.php";

$albumid = implode(',',$_POST['albumid']);
$trackid  = implode(',',$_POST['trackid']);
$albumtracknum  = implode(',',$_POST['albumtracknum']);
$albumidforreturn = $_POST['albumidforreturn'];
// echo 'albumid: '.$albumid.'<br>';
// echo 'trackid: '.$trackid.'<br>';
// echo 'albumtracknum: '.$albumtracknum.'<br>';

$sql = "INSERT INTO trackconnections (albumid, trackid, albumtracknum) VALUES (?,?,?);";
$stmt= $pdo->prepare($sql);
$stmt->execute([$albumid,$trackid,$albumtracknum]);
header("Location: ../albumdetail.php?albumid=$albumidforreturn");
exit();
}
else {
header("Location: ../index.php");
exit();
}

(注意:注释出的回声用于测试上一个表单的输出)

我遇到的两个问题是,我的"将现有曲目附加到专辑"表单提交:

1.传递的数据太多

生成的表单应该只传递选中复选框的曲目ID、专辑编号和曲目编号。用于插入"trackconnections"表。

相反,它缩小了勾选的复选框,只跟踪,然后为要选择的每个可用跟踪创建逗号分隔的值,而不仅仅是实际选择的值。

当将数据从表单传递到include时,这会导致令人讨厌的输出,例如以下内容:

albumid: 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4
trackid: 30,14
albumtracknum: ,2,3,,,,,,,,,,,,,,,,,,,,,

此处应仅读作:

albumid: 4,4
trackid: 30,14
albumtracknum: 2,3

传递过多的数据意味着,一旦我完成了这项工作,多个INSERT上的行插入就不会正确,因为它们不会以正确的顺序相互对齐。

2."trackconnections"表中只包含INSERTS 1行

我似乎误解了如何用这里的代码向数据库中添加多行。

由于在我的"将现有曲目附加到专辑"表单上勾选了多个复选框,每次提交表单时只会在数据库中插入一行。

一直以来,唯一添加到"trackconnections"表中的曲目是第一首勾选了复选框的曲目,由于上面的问题1,albumtracknum始终为0,除非我在可用检查表上的第一个albumtracknum框中键入数字。

我需要对这段代码进行调整,以便将问题1和问题2一起解决,这意味着勾选复选框&在曲目名称后面的每个框中添加曲目编号实际上会将多行及其相应的专辑曲目编号添加到数据库中。

我希望有人能帮忙。

编辑以显示改进的工作代码:

复选框和文本框部分的新代码-

if (isset($_POST['attachexistingtracktoalbum-submit'])) {

require "includes/db_connect.pdo.php";
$artistid = $_POST["artistid"];
$albumid = $_POST["albumid"];
echo '<strong>Select each track you would like to add to this album below and type in the track number you want it to have on the album in the box underneith the name of each selected track.</strong><br><br>';
$stmt = $pdo->query("SELECT * FROM track WHERE artist_id = '$artistid'
order by trackname");
echo '<form action="includes/attachexistingtracktoalbum.inc.php" method = "post">';
while ($row = $stmt->fetch())
{           

echo '<div class="checkbox">';
echo '<label>';
echo "<input type='checkbox' name='trackid[]' value='".$row['id']."' />";
echo '<span class="cr"><i class="cr-icon glyphicon glyphicon-ok"></i></span>';
echo ' '.$row['trackname'];
echo '</label>';
echo "<br><label for='albumtracknumber'>Track number:</label><br>
<input type='text' name='albumtracknumber_".$row['id']."'>
<input type='hidden' name='albumid[]' value='".$albumid,"'>
<br><br>";
echo '</div>';
}
?>
<input type="hidden" name="albumidforreturn" value="<?php echo $albumid;?>">
<button type="submit" name="attachexistingtracktoalbum-submit">Attach track(s) to album</button>
</form>

<?php }
else {
header("Location: /index.php");
exit();
}

包含INSERT处理的新代码-

if (isset($_POST['attachexistingtracktoalbum-submit'])) {
require "db_connect.pdo.php";

$albumid = implode(',',$_POST['albumid']);
$trackid  = implode(',',$_POST['trackid']);
$albumidforreturn = $_POST['albumidforreturn'];

foreach($_POST['trackid'] as $trackidloop) {

$albumtracknum = $_POST["albumtracknumber_{$trackidloop}"];
$sql = "INSERT INTO trackconnections (albumid, trackid, albumtracknum) VALUES (?,?,?);";
$stmt= $pdo->prepare($sql);
$stmt->execute([$albumid,$trackidloop,$albumtracknum]);
}
header("Location: ../albumdetail.php?albumid=$albumidforreturn");
exit();
}
else {
header("Location: ../index.php");
exit();
}

这不是一个完整的解决方案,但我看到了一些问题:您正在循环浏览轨迹,并为每个轨迹创建一个新形式。第一个问题是,您缺少结束表单标记。我猜浏览器在看到下一个表单开始标记时会自动创建一个??这就是为什么你只得到一个单独的张贴复选框。我会把所有的track复选框放在一个表单中。然后发布的trackid[]数组将包含所有选中的项目。

[在评论后编辑:隐藏字段albumid[]发布整个数组,而trackid[]复选框只发布实际的复选框(HTML规范)。

您可以将复选框值的trackID和albumid放在一起,然后在处理帖子时将它们分开:$value = $row['id']. ',' . $row['albumid'];echo "<input type='checkbox' name='trackid[]' value='".$value."' />";

此外,SQL;插入(..)..值(…)";只插入一行
在所有复选框的循环中执行SQL很容易
foreach($_POST['trackid'] as $value) {// parse the $value...// SQL Insert...}

编辑2:根据我自己的评论:与隐藏字段一样,输入(文本)字段数组也发布整个数组(空白输入为空值)。(同样,这不是PHP的事情,它是web浏览器的标准,只发布选中的复选框和单选按钮。但所有文本和隐藏的INPUT都会发布。)因此,在您的示例中,您需要编写一个机制来知道每个复选框对应的文本框。又快又脏。。。您可以在复选框值中添加一个行索引(0,1,2,3…)作为另一个逗号分隔的数字,然后将索引放入已发布的文本框数组中。或者,您可以将文本框命名为' .. name="textinput_' . $row['trackid'] . '" ...'(而不是数组),然后在发布时,使用
$val = $_POST["textinput_{$trackid}"];在foreach循环中读取它们

最新更新