【问题标题】:Trying to delete specific row in a list of items from a MySQL database using PHP尝试使用 PHP 从 MySQL 数据库中删除项目列表中的特定行
【发布时间】:2017-07-20 05:26:10
【问题描述】:

我有一个通过 PHP/MySQL 输出的项目列表。我在一列中还有一个编辑按钮和一个删除按钮。我试图弄清楚如何通过单击“删除”按钮来删除特定行上的列表项。我尝试了以下方法:

$id = $_GET['id'];

if(isset($_POST["deletelist"])) {

    $query = "SELECT * FROM lists";
    $result = mysqli_query($db, $query);
    if(mysqli_num_rows($result) == 1) {

    $query = "DELETE FROM lists WHERE id = '$id'";
} else {
        echo "Cannot delete";
    }
}

这当然行不通。谁能帮我解决这个问题?

更新

这是整个页面的代码:

https://pastebin.com/raw/qjnZkUU2

更新代码

$id = $_GET['id'];

if(isset($_POST["deletelist"])) {

    $query = "SELECT * FROM lists";
    $result = mysqli_query($db, $query);
    if(mysqli_num_rows($result) == 1) {

    $query = "DELETE FROM lists WHERE id = '$id'";
    mysqli_query($db, $query);
} else {
        echo "Cannot delete";
    }
}

我很困惑的是查询如何知道要删除哪个项目?我是否应该将 ID 附加到 URL 以传递 ID?

更新

好的,我想我明白了....在删除按钮中,我需要回显该行的 ID,因此当查询从单击删除按钮运行时,它知道要正确删除哪个 ID?

已解决

好的。我想通了!

我有一个引用列表项 ID 的按钮:

echo "<a href='includes/deletelist.php?id=$row[id]'><input class=\"btn btn-danger\" value=Delete style=\"width: 85px;\"></a>

然后我将该 ID 传递给 deletelist.php

if (!isset($_GET['id'])) {
    echo 'No ID was given...';
    exit;
}

if ($db->connect_error) {
    die('Connect Error (' . $con->connect_errno . ') ' . $con->connect_error);
}

$sql = "DELETE FROM lists WHERE id = ?";
if (!$result = $db->prepare($sql)) {
    die('Query failed: (' . $db->errno . ') ' . $db->error);
}

项目被删除。

【问题讨论】:

  • 请显示HTML代码
  • 了解prepared statements以防止sql注入
  • 你从不执行删除查询

标签: php mysql


【解决方案1】:

您必须对数据库中的任何操作执行查询

mysqli_query($db, $query);

所以执行删除查询,然后再试一次

【讨论】:

    【解决方案2】:

    您必须执行查询。没有查询执行代码。试试这个

    $id = $_GET['id'];
    
    if(isset($_POST["deletelist"])) {
    
        $query = "SELECT * FROM lists";
        $result = mysqli_query($db, $query);
        if(mysqli_num_rows($result) == 1) {
    
        $query = "DELETE FROM lists WHERE id = '$id'";
        mysqli_query($db, $query);
    } else {
            echo "Cannot delete";
        }
    }
    

    【讨论】:

    • 我应该得到未定义的索引吗?
    • 小心在语句中直接使用来自 GET 的用户输入!更好地使用带有参数绑定的准备好的语句。见stackoverflow.com/q/60174/1915746
    【解决方案3】:

    为了删除特定行,我需要在链接/按钮中回显 ID。然后,这会将 ID 传递给所需的 PHP,以从数据库中删除该行。

    在按钮中回显行 ID

    echo "<a href='includes/deletelist.php?id=$row[id]'><input class=\"btn btn-danger\" value=Delete style=\"width: 85px;\"></a>
    

    PHP删除动作行

    <?php
    
    include("db.php");
    
    if (!isset($_GET['id'])) {
        echo 'No ID was given...';
        exit;
    }
    if ($db->connect_error) {
        die('Connect Error (' . $con->connect_errno . ') ' . $con->connect_error);
    }
    $sql = "DELETE FROM lists WHERE id = ?";
    if (!$result = $db->prepare($sql)) {
        die('Query failed: (' . $db->errno . ') ' . $db->error);
    }
    
    if (!$result->bind_param('i', $_GET['id'])) {
        die('Binding parameters failed: (' . $result->errno . ') ' . $result->error);
    }
    if (!$result->execute()) {
        die('Execute failed: (' . $result->errno . ') ' . $result->error);
    }
    if ($result->affected_rows > 0) {
        echo "The ID was deleted with success.";
    } else {
        echo "Couldn't delete the ID."; }
    $result->close();
    $db->close();
    header('Location: ../account.php');
    ?>
    

    这会删除项目行,然后将用户返回到 account.php。在这种情况下,页面永远不会真正改变。

    【讨论】:

      【解决方案4】:

      试试下面的

      if(isset($_POST["deletelist"]) && isset($_GET['id']) ) {
          $id = $_GET['id'];
          $query = "SELECT * FROM lists";
          $result = mysqli_query($db, $query);
          if(mysqli_num_rows($result) == 1) {
      
               $query = "DELETE FROM lists WHERE id = '".mysqli_real_escape_string($db,$id)."'";
              mysqli_query($db, $query);
          } else {
              echo "Cannot delete";
          }
      }
      

      【讨论】:

      • 尝试如下不是答案。解释你改变了什么以及为什么
      • @Jens mysqli_real_escape_string 需要用于删除 mysql 弹出。并且 mysqli_query($db , $query) 需要执行任何 mysql 操作。谢谢
      • mysqli_real_escape_string 不能完全阻止 SQL 注入。
      • 这个函数在传递给这个函数的字符串中肯定危险的字符之前添加一个转义字符,反斜杠,\。所以我们可以通过使用这个函数来防止这个问题。
      猜你喜欢
      • 1970-01-01
      • 2018-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多