我正在编写一个维护用户首选项主列表的 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);
}
}
最佳答案
这个问题有几个不同的解决方案;这是我以前使用过的一些策略。
-- 每次更新用户首选项时删除所有条目
效率不是很高,但很容易实现。每次他们保存首选项时,首先将数据库中的所有值设置为“未检查”值。然后,照常保存他们的偏好。
-- 给未选中的框赋值
如果您将隐藏的输入元素放在复选框的正前方,并为其指定与复选框相同的名称,则只要复选框未选中,隐藏元素就会提交其值。例如,
<input type='hidden' name='box1' value='off' />
<input type='checkbox' name='box1' value='on' />
这会让您知道要在数据库中取消设置哪些 ID。
可能还有一个更面向数据库的解决方案,但我必须更多地了解您的结构才能提出任何建议。
关于php - 我将如何返回数组中与任何 $_POST 结果不匹配的任何项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5945267/