根据使用php选中的复选框,从数据库中删除多行

根据使用php选中的复选框,从数据库中删除多行,php,mysql,Php,Mysql,我需要编写一个代码,让用户取消订阅他们订阅的各种警报。我想在他们登录后维护会话,并检查他们的用户ID。 我编写了以下代码: <?php session_start(); $con = mysql_connect("localhost", "root", "hgd"); echo "<html><body>"; if (!$con) { die("could not connect" . mysql . error()); } mysql_

我需要编写一个代码,让用户取消订阅他们订阅的各种警报。我想在他们登录后维护会话,并检查他们的用户ID。 我编写了以下代码:

<?php
session_start();
$con = mysql_connect("localhost", "root", "hgd");
echo "<html><body>";

if (!$con)
    {
    die("could not connect" . mysql . error());
    }

mysql_select_db("Project", $con);

if (isset($_SESSION['userid']) || isset($_SESSION['username']))
    {
    echo "Unsubscribe for alerts on:" . "<br/>";
    $userid = $_SESSION['userid'];
    $query = "select * from BOOK_ALERTS where Userid='$userid'";
    $result = mysql_query($query, $con);
    echo "<form method='post' action=''>";
    while ($row = mysql_fetch_array($result))
        {
        $isbn = $row[1];
        $datapoint = $row[2];
        $type = $row[4];
        $value = $row[3];
        $time = $row[7];
        $str = "A book with ISBN:" . $isbn . " whose " . $datapoint . "'s " . $type . " " . $value;
        echo "<br/><input type='checkbox' name='checkbox[]' value='" . $str . "'/>$str<br />";
        }

    echo "<input type='submit' name='submit' value='UNSUBSCRIBE'>";
    echo "</form>";
    if (isset($_POST['submit']))
        {
        if (isset($_POST['checkbox']))
            {
            $delquery = "delete  from BOOK_ALERTS where Isbn='$isbn' AND Datapoint='$datapoint' AND     Alert_type='$type' AND Datapoint_value='$value'";
            $delresult = mysql_query($delquery, $con);
            if (!$delresult)
                {
                echo "Deleting record failed: (" . $con->errno . ") " . $con->error;
                }
              else
                {
                echo "Unsubscribed the alert for " . $str;
                }
            }
        }
      else
        {
        echo "<br />";
        echo "already logged in";
        header("Location:./abc.php");
        }

    echo "</body></html>";
?>

考虑对id使用复选框的值部分,而不是用户可读的字符串(如果不可用,可能是ISBN)。值不会显示给用户,但在处理输入时,所有选中复选框(具有相同的名称标记)的值将最终显示在一个数组中,例如:

如果
行[0]
是您的id:

echo "<br/><input type='checkbox' name='checkbox[]' value='" . $row[0] . "'/>$str<br />";
这将在每个选中的复选框上循环(在它实际上是一个数组之前进行检查)

您以前也没有使用
DELETE
语句,而是使用
SELECT
,它只检索数据,不删除数据

正如您所见,这依赖于每个记录的单个ID,我只能在您的案例中推荐

此外,您需要在将数据插入数据库之前对其进行转义(正如我在这里所做的),有关详细信息,请使用google forsql injection


编辑:此代码确实会删除每个选中的记录,如果需要,您必须切换到其他位置。

主要问题是您没有评估实际的$\u POST值(您只是检查它们是否已设置,而不是使用它们)。相反,您正在评估用于显示复选框的变量,这就是(仅)删除最后一个复选框的原因。(请参阅我的答案以获得更多的细节)也不要考虑编辑你的问题源代码(将它改编成一个答案),因为这使得很难跟上问题问答风格。它是删除而不是选择。这是无意的。我是PHP新手,初始化为$checked_id需要做什么?当我用你给出的更改编辑代码时,我得到了以下错误:PHP解析错误:语法错误,第32行的/var/www/unsubisbn.PHP中出现意外的T_FOREACH。你的BOOK_ALERTS表中是否有ID字段(通常带有“AUTO_INCREMENT”和“PRIMARY KEY”属性)?这将使您的生活更加轻松,或者换言之,处理特定行。缺少括号,这是我的错误,我立即修复代码!我在表中没有任何自动递增字段。|表的描述:Userid int(11)NO PRI NULL Isbn varchar(30)NO PRI | NULL Datapoint varchar(40)NO PRI | NULL Datapoint_value float NO PRI | NULL Alert|u type | varchar(30)没有PRI | NULL每个用户可以使用不同的值订阅相同的isbn。
if (isset($_POST['checkbox']) && is_array($_POST['checkbox']))
foreach ( $_POST['checkbox'] as $checked_id )
{
    // $delquery = "select * from BOOK_ALERTS where Isbn='$isbn' AND Datapoint='$datapoint' AND     Alert_type='$type' AND Datapoint_value='$value'";
    $delquery = "DELETE FROM BOOK_ALERTS WHERE id=".mysql_real_escape_string($checked_id);
    $delresult = mysql_query($delquery, $con);
    if (!$delresult)
    {
        echo "Deleting record failed: (" . $con->errno . ") " . $con->error;
    }
    else
    {
        echo "Unsubscribed the alert with id " . intval($checked_id); // Also this is not really nice showing a number to your user, you might wanna modify it later, but I really don't wanna throw too much at you at once
    }
}