从数据库中删除多行,具体取决于使用php检查的复选框

时间:2014-05-06 08:05:24

标签: php 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>";
?>

无论选中哪个复选框,上面的代码都只删除最后一行,因为删除查询会删除最后一次更新后获取变量值的行。 我不知道编写此代码的任何其他方式。任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

考虑使用复选框的值部分来代替用户可读字符串(或者如果不可用,则可以使用ISBN)。值不会显示给用户,但所有选中的复选框(具有相同的名称标签)的值将在处理输入时以数组结尾,例如:

如果row[0]是你的身份:

echo "<br/><input type='checkbox' name='checkbox[]' value='" . $row[0] . "'/>$str<br />";

此时您还没有评估用户已检查的内容,而是使用显示的最后$value进行删除。

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
    }
}

这会遍历每个选中的复选框(在它之前检查它实际上是一个数组)。

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

正如您所看到的,这依赖于每条记录的单个ID,我只能在您的情况下推荐。

此外,您需要在将数据插入数据库之前将其转义(如我在此处所做),谷歌搜索 sql注入以获取更多信息。

编辑:此代码会删除每条CHECKED记录,如果您需要,则必须切换它。