在这里挖掘。我一遍又一遍地看着我的代码,直到我的脑子都麻木了,仍然无法弄清楚问题出在哪里。
我使用的删除功能适用于类似CRM的应用程序的后端。每个注册用户都有一个用户列表,其中包含每个注册用户的表单,以及一个提交按钮,用于运行代码以通过其ID从数据库中删除所选用户。
复选框是在foreach循环中生成的,该循环使用从select查询返回的数组填充表。每个用户的每个复选框行都是这样的:
<input type="checkbox" name="checked[]" value="<?php echo ($userfromforeach['id']); ?>">
表单的提交按钮包含(name="deleteusers")
。
表单提交的实际删除代码如下:
// Delete users by selected as posted by form
if(isset($_POST['deleteusers']))
{
foreach($_POST['checked'] as $user)
{
$query = "
DELETE
FROM $usertable
WHERE id = $user
";
try
{
// These two statements run the query against your database table.
$stmt = $db->prepare($query);
$stmt->execute();
}
catch(PDOException $ex)
{
die("MySQL execution error, please contact technical support.");
}
}
// $_POST['checked'] = NULL;
header("Refresh:0");
}
由于某些我不知道的原因,所有内容似乎都正常启动,但没有从数据库中删除任何记录。没有返回MySQL错误,当我print_r
输出它显示的$_POST['checked']
变量时:
Array ( [0] => 122 [1] => 115 )
^每个键的值是用户的ID。
有什么想法?我是不是因为错过了一些完全基本的东西而在我自己的脑袋里挣扎?非常感谢你的帮助。
答案 0 :(得分:3)
使用for / foreach函数循环时。你可以用花括号包裹整个重复逻辑。否则仅执行一个单一声明
在您的情况下,为$query
变量分配一个字符串。就是这样。虽然仍有许多改进。但要解决这一特定问题,您的foreach应如下所示:
foreach($_POST['checked'] as $user)
{
$query = "DELETE FROM $usertable WHERE id = $user";
try
{
$stmt = $db->prepare($query);
$stmt->execute();
}
catch(PDOException $ex)
{
die("MySQL error, blah blah blah...");
}
}
答案 1 :(得分:2)
为什么在循环中运行删除查询,如果用户选择200条记录怎么办?你会查询200次?
我建议您以满足以下查询的方式编写PHP登录信息
DELETE from tablename WHERE id IN (1,2,3,...,200);
如果您有连续的ID,请使用BETWEEN:
DELETE from tablename WHERE id BETWEEN 1 AND 200;
仅限某些ID:
DELETE from tablename WHERE id BETWEEN 1 AND 200 AND id<>47;
这样查询只会被触发一次,前提是MySQL查询(ID)的输入是通过PHP循环预先生成的。
答案 2 :(得分:1)
if(isset($_POST['deleteusers'])) <-- submit button with the name "deleteusers"
{
foreach($_POST['checked'] as $user)
{
$query = "DELETE FROM $usertable WHERE id = :user";
try
{
$stmt = $db->prepare($query);
$stmt->bindParam(':user', $user);
$stmt->execute();
}
catch(PDOException $ex)
{
die("MySQL error, blah blah blah...");
}
}
}
你可以使用这个查询在一个语句中运行这个
$query = "DELETE FROM $usertable WHERE id IN (:user)";
$ stmt-&GT; bindParam( ':用户',内爆( “”,$ _ POST [ 'deleteusers']));
答案 3 :(得分:1)
我是个白痴。
经过多次挖掘后发现,这个问题是我在bootstrap的模态弹出框中的提交按钮,显然即使按照我的理解,模态只是隐藏并在页面中显示div,任何帖子数据从模态div赢得传递回主页。 &gt;:[因此,我能想到的唯一解决方案是在点击删除按钮时从javascript设置$_POST['deleteusers']
变量......保姆很痛苦......
无论如何,谢谢大家的帮助,我将标记The Bigbyte Number的答案,因为他涵盖了另外两个非常重要的考虑因素 - 正确使用预准备语句以及如何将流程简化为单个查询,节省资源和理论上的CPU时间也是如此。