2011-04-13 74 views
0

多选选项更新数据库中的

例如选择题复选框,以“10”的ID的用户有权利选择他在说什么语言的选项。 他选择用“多选”或“多选框”每一种语言,像这样的:

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

我想知道的是,这是如何存储db表这些选项的样子,以及如何将服务器边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的上限是天文数字,我不喜欢我的污染数据库的想法,所以我猜测我做错了什么,所以我想知道专业人员如何处理它。

+0

“这会过快地增加主ID”---那又如何? – zerkms 2011-04-13 09:00:55

+0

如果这是它应该如何处理,那就这么说吧,我会很快乐的。 – 2011-04-13 09:02:13

+0

他们不*过度*。 Id没有任何商业意义。谁在乎它是42还是42424242 PK值?我不。 – zerkms 2011-04-13 09:03:30

回答

0

这个问题似乎来自上述例子中的id是人为的事实,解决方法是使用multi-column primary keys也叫Compound key,当我问这个问题时我并不知道。

然后将溶液变成使用表是这样的:

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

这改善数据完整性,因为一个用户可以不再具有相同的语言的2项。

要插入你做同样的值:

$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)); 
} 

你也可以像zerkms建议,要选择所有的语言,然后运行和array_diff找到新旧值,并删除旧的并插入新的,但是这也意味着运行3个查询和比较结果,而在lang的情况下使用者说话超过3个是非常罕见的,这就是为什么只是删除和再次插入似乎是最好的选择。

1

你也可以使用某种差异。

算法:

  1. 网友发帖的形式与选择的语言
  2. 您选择当前语言
  3. 使用array_diff()两次你得到2个阵列的语言(新与旧,和对面的一个之间的差异),这你需要删除,以及你需要添加哪一个
  4. 根据3的数组,你执行一个INSERT和一个DELETE查询