我有一个数组,我通过$ _POST变量传递。在foreach循环中,我想检查是否已检查“删除”。如果是这样,我将删除该记录。如果未选中删除,我将更新记录。当我运行此更新工作完美。如果我检查了删除 - 它将删除数组中的第一条记录 - 而不是带有复选框的记录的相应ID的记录。如果我有2个检查 - 它将采取第一个2.如果我所有检查它们 - 它显然将删除所有记录。我整天都在和这个人搏斗 - 寻求一点帮助。谢谢。
if (isset($_POST['update'])) {
$slo_id = $_POST['slo_id'];
foreach ($_POST['score_id'] as $key=>$score_id) {
$del = $_POST['del'][$key];
if ($del == 'checked') {
$sql2 = " DELETE FROM slo_score WHERE score_id = $score_id ";
#execute SQL statement
$result = mysql_query($sql2);
# check for error
if (mysql_error()) { print "Database ERROR in SQL Update Statement: " . mysql_error(); }
}
else {
$growth_target = $_POST['growth_target'][$key];
$final_score = $_POST['final_score'][$key];
$meets = $_POST['meets'][$key];
//update table
$sql1 = "UPDATE slo_score SET growth_target='$growth_target',final_score='$final_score',meets='$meets' WHERE score_id = $score_id";
#execute SQL statement
$result = mysql_query($sql1);
# check for error
if (mysql_error()) { print "Database ERROR in SQL Update Statement: " . mysql_error(); }
}
}
header("location:...);
}
答案 0 :(得分:0)
试试这个
if (isset($_POST['update'])) {
$slo_id = $_POST['slo_id'];
foreach ($_POST['score_id'] as $key=>$score_id) {
if (isset($_POST['del'][$key])) {
//use mysqli to delete the record
}
else {
$growth_target = $_POST['growth_target'][$key];
$final_score = $_POST['final_score'][$key];
$meets = $_POST['meets'][$key];
//update table
use mysqli to update the record
}
}
header("location:...);
}
答案 1 :(得分:0)
您应该不惜一切代价避免循环删除MySQL。
如果您要收到要删除的ID数组,为什么不直接将其发送到一个(或几个,如果这是我们正在谈论的数千个ID;将它们分块)查询:
$score_ids = isset($_POST['score_id']) ? $_POST['score_id'] : array();
$score_ids_in = implode("', '", $score_ids);
$sql = sprintf("DELETE FROM slo_score WHERE score_id IN ('%s')", $score_ids_in);
$result = mysql_query($sql);
当然,这不会为您提供逐行反馈,但它会使您的数据库不会被窒息死亡。
此外,您已经知道应该使用Mysqli来防止人们破坏您的数据库,从中提取敏感数据,或两者兼而有之。这与你现在正在做的事情并没有太大的变化,除了它更加安全。