【问题标题】:PHP form to edit database entries用于编辑数据库条目的 PHP 表单
【发布时间】:2013-05-29 23:03:21
【问题描述】:

我有一个我的电影收藏的 MySQL 数据库,我正在开发一个用于搜索和编辑数据库的小网站。整个项目更多的是学习,然后只是尝试以最简单的方式完成它。所以我都是从头开始写的,只是纯文本文件,而且我主要使用 PHP。

所以我想要一个可以编辑电影信息的页面。添加新信息相当简单,但删除信息呢?我有几个类型的复选框。当表单出现时,会检查当前与电影相关的任何类型。我希望能够取消选中一个框,然后该类型将从该电影中删除。我能想到的唯一方法是在表单打开时创建一个初始值数组,并在提交表单时获取 POST 数组。然后删除第一个但不是第二个数组中的所有流派。这似乎有点乱,我觉得应该有一种更优雅的方式来做到这一点。这似乎是一个非常标准的事情,所以也许人们有一个很好的方法来做到这一点?

【问题讨论】:

  • 我通常用<input type="hidden" name="genre[123]" value="0"><input type="checkbox" name="genre[123]" value="1">来解决这个问题,选中意味着id为123的流派的结果是1,不选中它会返回0
  • 如果您希望在取消选中复选框而不是单击“提交”按钮时即时进行更改,您可以使用 jQuery AJAX 调用 POST 到一个单独的 PHP 脚本来处理为您采取行动。
  • 我没有使用过 AJAX,因为我使用它的次数不多,但也许这是一个很好的机会。我可以将 AJAX 与我的 PHP 函数一起使用,以便在每次更改时更新数据库?

标签: php database forms


【解决方案1】:

您可以使用输入复选框单击事件来调用 ajax 操作。

使用 jquery (http://api.jquery.com/jQuery.ajax/):

$(document).ready(function() {
  $("#form input[type=checkbox]").click(function() {
        $.ajax({
            url : '/sample/'+$(this).attr('any_id')+'/'+$(this).attr('other_id'),
            error: function(){alert('error')},
            success : function(data){alert('success')}
        });
  });
});

然后解析 url 以获得您需要的内容,并在成功时使用 jquery 函数(如 $('element').html() 等)更新您的表单和/或页面信息。

另一个选项,如果您希望为同一功能传递 序列化数据 选项:

$(document).ready(function() {
  $("#form.checkboxes input[type=checkbox]").click(function() {
        $.ajax({
            url : '/sample-form-action',
            type: "POST",
            data: $("#form.checkboxes").serialize(),
            error: function(){alert('error')},
            success : function(data){alert('success')}
            },
  });
});

您可以在复选框周围创建表单标签,在这种情况下,您可以仅通过 ajax 发布您真正需要的信息:

<form name="checkboxes" class="checkboxes">
 <input type="checkbox" />
</form>

【讨论】:

  • 我喜欢这个解决方案。我肯定会开始研究 AJAX 并尝试实现它。我还需要一些搜索功能,我认为 AJAX 将是我最好的选择。
【解决方案2】:

我能想到的最好方法是在流派和电影之间建立多对多关系(这意味着一部电影可以有多种流派,一种流派可以出现在许多电影中)。

这涉及添加另外两个表,一个用于定义流派,另一个用于将它们与电影相关联:

genres
---------
id | name

这里是稍微棘手的部分:

genres-movies
-------------------
movie_id | genre_id

其中movie_idmovies 表中的实际ID,genre_idgenres 表中的实际ID。

例如,ID 为 1 的流派是 Science Fiction,ID 为 42 的电影是 Hitchhiker's Guide to the Galaxy(看看我在那里做了什么?),这意味着如果我有条目 42 | 1genres-movies,意味着《银河系漫游指南》是一部科幻小说。请注意,movie_idgenre_id 都不是唯一的,两者都可以出现多次,因此可能出现以下情况:

movie_id | genre_id
---------+---------
1        | 2
1        | 3
2        | 2
3        | 1

要查找电影的所有类型:

SELECT `genre_id` FROM `genres-movies` WHERE `movie_id` = <ID>;

毕竟背景,你的问题。使用这种方法,您需要多个查询,从电影中删除所有类型,然后每个都添加您选择的类型。您必须这样做,因为未选中的复选框不会发送到服务器(伪代码)

DELETE FROM `genres-movies` WHERE `movie_id` = <ID>; --Remove all genres

foreach ($genres_from_checkboxes as $genre) {
    INSERT INTO `genres-movies` (`movie_id`, `genre_id`) VALUES (:movie_id, :genre_id)
}

注意!始终使用来自用户的数据清理(或者更好的是准备!!!)查询!

呸!太长了,希望你能学到一两件事:)

【讨论】:

  • 感谢您的回答。关于多对多关系,我已经按照您所说的进行了操作,但是感谢您确认我做对了。在映射表中,我还有一个组合列,它是两个 ID 的串联;这是独一无二的(大部分情况下)。\n>从电影中删除所有类型,然后添加您选择的类型。\n\n我正在考虑进行更新,但不确定是否最好的解决方案。但我越来越相信这是最优雅的解决方案。
  • @dan08:你不需要第三列,你可以有一个UNIQUE KEY for both columns(那么它们的组合是唯一的:P)。此外,您不想开始弄乱更新以及要更新的内容、要删除的内容和要插入的内容。如果您删除所有内容并重新添加所有内容,一切都会变得更加顺利。这也没什么大不了的,只是什么,5-10 次插入顶部?
  • 好的,所以我在其他领域也有同样的情况,比如演员和收藏。最好清除所有映射并重新添加它们?此外,我正在做的规模非常小,性能和速度都不是问题。但在更大的范围内,这仍然是它的方式吗?
  • @dan08:是的,是的。这种方法肯定比试图找出哪些已经存在,哪些不存在要好得多。此外,通过正确使用准备好的语句,您可以在一遍又一遍地执行具有不同参数的相同查询时获得很好的性能提升。 (您准备一次查询,然后多次执行生成的语句,而不是多次执行查询)。你可以在 PHP 手册的 PDO 部分阅读它。
  • 哦,我有第三列,因为我在添加一个之前搜索是否存在映射,所以我不会添加多个映射。但有了这个解决方案,我就不需要这样做了。
【解决方案3】:

您可以使用php if语句检查数据库列中的值并显示已选中

<input name="column" type="radio" value="1" <?php if($table['column'] = 1) echo "checked" ?>>
<input name="column" type="radio" value="0" <?php if($table['column'] = 0) echo "checked" ?>>

或者如果你使用的是复选框

<input name="column" type="checkbox" value="1" <?php if($table['column'] = 1){ echo "checked" }elseif($table['column'] = ){ echo "" } ?>>

希望对你有用

【讨论】:

    猜你喜欢
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 2021-05-11
    • 1970-01-01
    • 2011-11-13
    相关资源
    最近更新 更多