如何返回数组中与任何$ _POST结果不匹配的任何项目

时间:2011-05-10 04:45:03

标签: php mysql

我正在编写一个PHP / MySQL应用程序来维护一个用户首选项的主列表,并且我自己一直试图从该列表中删除项目。目前,应用程序生成一个项目列表,并在用户先前选择的项目旁边标记一个复选框,然后用户可以更改其选择(添加或删除复选标记)并重新提交。表单仅为用户已检查的项目提交supplyid。

我对列表进行了排序,以便首先显示未标记的选择,并且我已经获得了在数据库中插入/更新项目的代码,但是我在确定如何删除用户取消选中的项目时遇到了问题(现在不返回supplyid的)。

此时,我编写了一个MySQL查询,只返回以前列在列表中的结果(因为那些是唯一需要删除的结果。)我需要的是返回的数组中的项目通过与任何$ _POST结果不匹配的查询。我已经成功地将数组与之前包含的项目的$ _POST结果进行比较,但是我可以看到我的逻辑是错误的,我试图找回不匹配的结果。虽然我能够查看哪些项目匹配,但我不确定如何消除它们作为可能性。我是否完全以错误的方式解决这个问题?

$iduser = $_SESSION["iduser"];
$possibleresults = $_POST["possibleresults"];
$sql_onlist = "select supply.idsupply from supply, kit
                    where supply.class = 'basic'
                      and kit.iduser = '".$iduser."'
                      and supply.idsupply = kit.idsupply";

$possible_delete = $connection->query($sql_onlist);

//for each record we know is already in the database, check to make sure it has been checked, otherwise delete
for ($i=0; $i<$possibleresults; $i++) {
$count = 0;
$item_delete = $possible_delete->fetch_assoc();
if ($_POST['item_'.$i.'']) {
    $idsupply = $connection->real_escape_string($_POST['item_'.$i.'']);
//if there is a match, increase the counter
if ($idsupply == $item_delete["idsupply"]) {
    $count++;
    //this does successfully return a count = 1 - idsupply = number for all rows which should have matches
        echo "count = ". $count . " - idsupply = " . $idsupply;
}           
    //this statement doesn't work because it doesn't know which idsupply
    if ($count < 1) {
        $idsupply = $item_delete["idsupply"];
        $sql_delete = "delete from kit 
                  where idsupply = '".$idsupply."'
                  and iduser =  '".$iduser."'";
    $result_delete = $connection->query($sql_delete);   
    }
}

3 个答案:

答案 0 :(得分:2)

这个问题有几种不同的解决方案;这是我以前用过的一些策略。

- 每次更新用户的偏好时删除所有条目
效率不是很高,但很容易实现。每次保存首选项时,首先将数据库中的所有值设置为“未检查”值。然后,照常保存他们的偏好。

- 为未选中的复选框添加值
如果您在复选框之前放置一个隐藏的输入元素并为其指定与复选框相同的名称,则只要未选中该复选框,隐藏元素就会提交其值。如,

<input type='hidden' name='box1' value='off' />
<input type='checkbox' name='box1' value='on' />

这将告诉您在数据库中取消设置哪些ID。

也可能有更多面向数据库的解决方案,但我必须更多地了解您的结构以提出任何建议。

答案 1 :(得分:0)

我不太了解你的代码,但我认为你需要这样的东西

$to_keep = array();
for ( $i=1 ; $i < 10 ; $i++ ) {
    // Add ids of elements we want to save
    $to_keep[] = $i;
}
if ($to_keep) {
    mysql_query("DELETE FROM table WHERE id NOT IN (". implode(',', $to_delete) . ")");
}

答案 2 :(得分:0)

圣洁的莫莉,多么混乱......有点把自己画成角落呃?不用担心它会发生在我们所有人身上。 :)

所以我认为,一旦你有一个真正有效的算法,代码就会在它周围聚集在一起。所以我们来分析你的问题:

  • 您的主要目标是存储用户设置。

  • 您正在使用表单和复选框来显示当前设置并允许用户更改其当前设置。这很优雅。

  • 生成用户POSTed设置列表(也就是从POST数组中获取新设置)并将这些结果存储在专用数据容器中,如数组或链表。

  • 获得新设置列表后,您需要将该列表用作地图,以设置/取消设置数据库表中的各个字段。

  • 从存储在不同数据容器中的数据库中获取所有用户保存设置的列表

  • 逐个案例比较,查看变量是否匹配,将结果记录在另一个数据容器中,或立即写入数据库。

  • 向用户展示其操作的人类可读结果。

    注意:顺便说一下,您可能已经知道这一点,但如果您使用isset($_POST['mychkbox1'])并返回正值,则会选中该复选框。如果isset()返回false,则不设置复选框,或者不存在复选框。就像我说你可能已经知道的那样,但我想我把它丢在那里。

    祝你好运

ħ