【问题标题】:best practice for updating a list in database associated with checkboxes in a html form更新与 html 表单中的复选框关联的数据库中列表的最佳实践
【发布时间】:2014-10-13 06:17:20
【问题描述】:

我已经想到了两种解决方案来解决我的问题,如果您认为可能有更好的解决方案,我想知道所有可行的解决方案。

我的 MySQL 数据库中有一个列表,它与我的 html 表单中的复选框相关联。我想使用表单添加或删除列表项,然后在我的数据库中执行相同操作。我有一个列表的自动递增 ID 列。问题是,如何在执行添加和删除操作时更新表。列表必须按时间顺序排列,这通常由数据库在我们向表中添加新项目时自动完成。

解决方案 1: 复选框将具有名称属性“items []”,因此当我可以将它们作为 $_POST 数组读取并删除数据库中匹配的列表项时。这当然要求我的 ID 列始终从第一个到最后一个连续排序,即。 1, 2, 3...所以我每次删除一个项目时都必须更新 ID 列。此处建议解决方案:Reorder / reset auto increment primary key

解决方案 2: 我给新项目一个等于最大 ID+1 的 复选框值,这样每次输入一个项目时,ID 都是不同的。这样我就不必更新 ID 列。我只需要在我的表中找到最大的 ID 并将其加 1 作为我的复选框值。

总而言之,第一种方法是在每次删除项目时更新列表 ID,这似乎比较麻烦。第二种方式只是给出了一个新的不同的 ID 值,我会在数据库中查询当时最大的 ID,这样看起来效率更高。

我愿意接受其他建议 :) 非常感谢

【问题讨论】:

  • 您要解决的问题是什么?我真的想不出像这样的应用程序。您不必为数据库提供 id,数据库可以自动分配一个。
  • 问题其实很简单。我有一个与表单中的复选框相关联的文本列表。我可以添加更多文本或删除现有项目。只是想知道如何最好地实现这一目标。
  • 我个人会使用AngularJS,然后通过API在服务器端处理添加和删除功能。 AngularJS 有一个不错的 ng-repeat 选项,可以让你填充现有列表,并在 $scope 更改时删除内容。
  • 您应该提供有关这样做的目标的更多信息,因为有许多选项可以按照您所说的进行,但非常不同:如果您只需要在客户端使用此功能,请使用 javascript 库。如果您需要此更改以在以后的访问中持续存在并希望重新排序收音机,则可以使用 db,但可以使用“order”或“rank”列进行排序。如果您只想删除和添加收音机而不重新排序,只需插入它们(不带 id)并将 id 作为自动增量 id。
  • 我希望这些条目持续存在。所以整个问题仍然只是一个文本列表,每个文本都附有一个复选框,所以我可以选择要删除的文本。使用我的第一个解决方案,如果我在 10 个项目的列表中删除 ID=4 的项目,则 ID 将错过“4”。所以我的表单将只有 9 个项目,但数组索引与这些 ID 不匹配,这就是我必须更新 ID 的原因。在解决方案 2 中,我选择只为复选框提供一个新值,因此脚本会将值与数据库中的 ID 匹配,而不是使用 $_POST 数组索引来读取值。我希望我澄清了我的问题。

标签: php mysql checkbox


【解决方案1】:

这是一个快速响应,可能无法按照您需要的方式完成所有操作,但希望您可以使用一些想法。

这是在一个表中使用一个字段的解决方案。

想象一个名为“scratchpad”的表,其中一个字段名为“cb_list”。

cb_list 字段中的复选框/ID 存储为 JSON 字符串:

{"cb1":1,"cb2":0,"cb3":0,"cb4":1}

创建页面时,PHP 命令读取字段并转换为数组:

$cb_json = mysql_result(mysql_query("SELECT `cb_list` FROM `scratchpad`"), 0);
$cb_arr = json_decode($cb_json);

现在,遍历该数组并为复选框创建 HTML:

$out = '<div id="chkboxDIV">';
foreach( $cb_arr AS $key =>$val ){
    $chkd = ($val==1) ? 'checked="checked"' : '';
    $out .= $key. " <input type='checkbox' id='" .$key. "' " .$chkd. " />";
}
$out .= "</div>";
echo $out;

要添加新的复选框,您可以使用 jQuery(或 js)代码将新的复选框附加到 DIV:

var lbl = prompt('Label?');
$('#chkbox').append(lbl+ ': <input id="' +lbl+ '" type="checkbox" /> ');

当复选框准备好再次存储时,使用此 javascript 循环检查复选框并保存它们的 ID 和值:

var arrCB = {};
$("#chkbox>input[type='checkbox']").each(function(){ 
    var el = $(this);
    var id = el.attr('id');
    arrCB[id] = (this.checked ? 1 : 0)
});
var json_cb = JSON.stringify(arrCB);

现在,您可以使用 AJAX 将字符串(类似于您一开始从数据库中获取的内容)发送回 PHP 进行存储:

$.ajax({
    type: 'POST',
     url: 'your_php_file.php',
    data: the_json=json_cb
});

在 PHP 方面,您的 AJAX 处理器文件(在此示例中称为 your_php_file.php)将如下所示:

<?php
$j = $_POST['the_json'];
$result = mysql_query("UPDATE `scratchpad` SET `cb_list` = '$j' ");

Here is a jsFiddle 带有 javascript/jQuery 的示例。

资源:

您可能会觉得这很有帮助:$.ajax - dataType

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多