php - 更新数据库中的多项选择复选框

标签 php mysql forms checkbox multiple-choice

多选选项

例如,ID 为“10”的用户可以选择他使用的语言。 他使用“多重选择”或“多个复选框”来选择每种语言,如下所示:

<input name="lang[]" value="en" type="checkbox" />
<input name="lang[]" value="es" type="checkbox" />
<input name="lang[]" value="jp" type="checkbox" />

我想知道的是,存储这些选项的数据库表是什么样的以及服务器端php如何插入/更新它们?

到目前为止我的猜测

我想象的是表格看起来像这样:

CREATE TABLE user_langs (id INT AUTO_INCREMENT PRIMARY KEY, lang VARCHAR, fk_user INT);

在将值插入新用户时,php 会执行一个简单的插入循环:

$stmt = $pdo->prepare('INSERT INTO user_langs (lang,fk_user) VALUES(?,?)');
foreach($_POST['lang'] as $lang){
    $stmt->execute(array($lang, $user_id));
}

我遇到的问题是更新,最简单的方法是删除该用户的所有现有条目,然后插入新条目。

$stmt1 = $pdo->prepare('DELETE FROM user_langs WHERE fk_user=?');
$stmt1->execute(array($user_id));
$stmt2 = $pdo->prepare('INSERT INTO user_langs (lang,fk_user) VALUES(?,?)');
foreach($_POST['lang'] as $lang){
    $stmt2->execute(array($lang, $user_id));
}

但我认为,如果主 id 被积极使用,这会导致主 id 的增加过快,即使 id 的上限是天文数字,我不喜欢污染数据库的想法,所以我猜我是做错了什么,所以想知道高手是怎么处理的。

最佳答案

您还可以使用某种差异。

算法:

  1. 用户使用选定的语言发布了表单
  2. 您选择当前语言
  3. 使用 array_diff() 两次(新旧之间的差异,以及相反的差异),您将获得 2 个需要删除和添加的语言数组
  4. 根据 3 中的数组,您执行一次 INSERT 和一次 DELETE 查询

关于php - 更新数据库中的多项选择复选框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5646688/

相关文章:

php - 使用PHP错误查看存储在MySQL数据库中的PDF文件

php - json_encode PHP 数组作为 JSON 数组而不是 JSON 对象

mysql - 如何编写具有多个左连接的 MySQL 删除

javascript - 调整动态表单以处理多个部分

php - 隐藏 div 内的表单在发布时没有值

php - 避免 php serialize() 中的空字节

php - 如何使用 mysql_query 在这种方法中添加 "no record found"

mysql - 是否可以在一个查询中更新同一列中的 2 个字段(mysql)

ios - 表单中的选取器在SwiftUI中留下了领先的空间

forms - HTML5 中的验证。 :invalid classe after submit