【问题标题】:Deleting a row with Php & MySQL用 PHP & MySQL 删除一行
【发布时间】:2015-04-14 23:07:33
【问题描述】:

我是 php 和 SQL 的新手,我只是在玩一个项目,以了解如何访问、更新和删除数据库中的数据。

我已经设法显示了选定的数据,创建了一个按钮来删除特定的 ID,但确实需要一些帮助来删除选定的行或记录,而不是在我的删除 php 脚本中对 ID 进行硬编码。

这是我的脚本示例:

<?php

    $sql = "SELECT id, firstname, lastname, joinDate FROM customers";
    $result = $conn->query($sql);

    if ($result->num_rows > 0) {
        // output data of each row

        while($row =  $result->fetch_assoc()) {
            echo 
                "<div class='trow'>" . 
                $row["id"]. ": " . 
                $row["firstname"] . " " . 
                $row["lastname"]. " " . 
                $row["joinDate"]. " " . 
                "<span class='deleteMember'>
                    <form action='deleteMember.php' method='POST'>
                        <button type='submit'>Delete</button>
                    </form>
                </span>" . " " . 
                "<span class='editMember'><a href='#'>Edit</a></span>" . 
                "<br></div>";
        }

    } else {
        echo "0 results";
    }

    $conn->close();

?>

这里是delete.php

<?php

    // sql to delete a record
    $sql = "DELETE FROM customers WHERE id='6' ";

    if ($conn->query($sql) === TRUE) {
       header("Location: index.php");
    } else {
        echo "Error deleting record: " . $conn->error;
    }

    $conn->close();

?>

我希望它做的是,删除您从中点击删除按钮的行,而不仅仅是删除我在 delete.php 脚本中指定的行。我通过发布 id 了解它应该如何工作,但不知道该怎么做。

【问题讨论】:

  • 您可能想研究使用 GET 来删除向您的 delete.php 脚本发送请求的按钮。类似于:delete.php?id=
  • 您使用的是 PDO 还是 mysqli
  • @tadman 从num_rowsfetch_assoc() 看来我会说mysqli。
  • MySQLi 是我正在使用的一个,因为我试图学习基础知识 - 这只是学习如何更新和删除数据等
  • @Maximus2012 他们可能不会那么好。您应该使用GET 请求执行破坏性操作,并且尤其是不要使用GET 请求执行DELETEs。如果这些 URL 被蜘蛛抓取,每条记录都会被删除。

标签: php mysql forms


【解决方案1】:

这样做

<?php

    // sql to delete a record
    $sql = "DELETE FROM customers WHERE id='".$_GET['id']."' ";

    if ($conn->query($sql) === TRUE) {
       header("Location: index.php");
    } else {
        echo "Error deleting record: " . $conn->error;
    }

    $conn->close();

?>

<?php

    $sql = "SELECT id, firstname, lastname, joinDate FROM customers";
    $result = $conn->query($sql);

    if ($result->num_rows > 0) {
        // output data of each row

        while($row =  $result->fetch_assoc()) {
            echo 
                "<div class='trow'>" . 
                $row["id"]. ": " . 
                $row["firstname"] . " " . 
                $row["lastname"]. " " . 
                $row["joinDate"]. " " . 
                "<span><a href='deleteMember.php?id=".$row['id']."'>Delete</a></span>" . 
                "<span class='editMember'><a href='#'>Edit</a></span>" . 
                "<br></div>";
        }

    } else {
        echo "0 results";
    }

    $conn->close();
?>

【讨论】:

  • 然后这会将我带到 404?我已经采取了上述措施,但似乎失败了?
  • 好的,对不起,我正在编辑将 delete.php 更改为 deleteMember.php。
  • 我需要指出,这里显示的方法非常不安全,不能在任何生产环境中使用,在 SQL 查询中添加 $_GET 值是不行的 - 更不用说不清理了首先!
【解决方案2】:

用这个代替你的表格

<a href="deleteMember.php?id=<?php echo $row['id'];?>">DELETE</a>

并且在您的删除查询中必须如下所示

$sql = "DELETE FROM customers WHERE id='".$_GET['id']."' ";

【讨论】:

  • 不,不,不。永远不要将$_GET 直接放在查询中。这会创建一个巨大的SQL injection hole
  • 另外,正如另一个答案中提到的,不要使用GET 方法在服务器上执行具有副作用的操作。即 GET 不应用于执行 CRUD 操作。
【解决方案3】:

或留在您的帖子表单中:

 while($row =  $result->fetch_assoc()) {
            echo 
                "<div class='trow'>" . 
                $row["id"]. ": " . 
                $row["firstname"] . " " . 
                $row["lastname"]. " " . 
                $row["joinDate"]. " " . 
                "<span class='deleteMember'>
                    <form action='deleteMember.php' method='POST'>
                        <input type='hidden' name='myid' value='".$row['id']."' />
                        <button type='submit'>Delete</button>
                    </form>
                </span>" . " " . 
                "<span class='editMember'><a href='#'>Edit</a></span>" . 
                "<br></div>";
        }

在你的 delete.php 中:

<?php
    $id=(int) $_POST['myid'];

    // sql to delete a record
    $sql = "DELETE FROM customers WHERE id=".$id;

    if ($conn->query($sql) === TRUE) {
       header("Location: index.php");
    } else {
        echo "Error deleting record: " . $conn->error;
    }

    $conn->close();

?>

【讨论】:

  • 对数据挥动(int) 魔法棒然后将其注入查询中并不是真正的正确方法。
  • @tadman 当然,使用 pdo 或 mysqli 的准备语句只是一个更安全的步骤。您可以忘记它或使用它: $q=$this->db->prepare('DELETE FROM customers WHERE id=:id'); $q->bindValue(':id', $id, PDO::PARAM_INT); $q->执行()
  • 使用prepare 很明显,您必须竭尽全力才能弄错。使用(int) 会留下严重错误的空间,只需要忘记一次,您就可能会被彻底毁掉。
  • @Tadman,请分享您的知识,我很想知道它如何破坏我的代码。这只是为了保护接收到的数据,好像不等于 0。这也是在 bindvalue() 中使用 PDO::PARAM_INT 时所做的。所以一起使用应该比什么都不用更安全。
  • 这里的风险是有一天您忘记输入(int),将代码推送到生产环境而不注意,并且有恶意的人使用扫描工具发现了它。然后修复就太晚了。使用占位符时,您必须在可怕的事情发生之前犯几个错误,而不仅仅是一个。
【解决方案4】:

无需为删除或编辑目的添加额外的form 元素。尝试这种方式传递id的行进行Eelete或Edit操作

while($row =  $result->fetch_assoc()) 
       {
            $id=$row['id'];// capture your row id & pass to your delete & edit
            echo 
             "<div class='trow'>" . 
                 $row["id"]. ": " . 
                 $row["firstname"] . " " . 
                 $row["lastname"]. " " . 
                 $row["joinDate"]. " " . 
                 "<span class='deleteMember'>
                    <a href='deleteMember.php?id=<?=$id;?>'>Delete</a>
                 </span>" . " " . 
                 "<span class='editMember'>
                     <a href='editMember.php?id=<?=$id;?>'>Edit</a>
                 </span>" . 
                 "<br>
           </div>";
        }

编辑: 然后在您的相关页面上捕捉id为您的操作。

//deleteMember.php

<?php
    $id=$_GET['id'];
    // sql to delete a record
    $sql = "DELETE FROM customers WHERE id='".$id."'";

    if ($conn->query($sql) === TRUE) {
       header("Location: index.php");
    } else {
        echo "Error deleting record: " . $conn->error;
    }

    $conn->close();

?>

注意:请改用PDOMYSQLi的Prepared Statements,以避免SQL Injection和手动转义。

【讨论】:

  • 我的 SQL 查询在 delete,php 中应该是什么样子?
  • 你能花 20 秒正确地逃离这东西,然后再将它释放到野外吗?对准备好的语句喃喃自语是一个很好的姿态,但发布“工作”代码并不是一个很好的例子。
  • 我现在收到一个错误“删除记录时出错:您的 SQL 语法有错误;查看与您的 MySQL 服务器版本相对应的手册,了解在第 1 行的“=”附近使用的正确语法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
  • 1970-01-01
  • 2014-11-02
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多