【问题标题】:Trying to Delete the data displayed in my tables试图删除我的表格中显示的数据
【发布时间】:2016-01-29 02:05:02
【问题描述】:

我已经能够将数据库中的数据显示到我的网站上,我正在尝试删除一行。

现在按钮可以工作了,但它会完全删除您从代码中得知的所有内容。

我不知道如何将删除按钮分配给表中的特定行,它只是删除该特定行中的数据。

除此之外,我的桌子上有一个删除按钮,不知道如何为给定的每一行设置单独的删除按钮。

admin.php(显示我的数据)

<?php

echo "<table style='box'>";
echo "<tr><th>ID</th><th>First Name</th><th>Last Name</th><th>Role</th>
<th>Email</th><th>Username</th><th>Delete</th><th>Amend</th></tr>";

class TableRows extends RecursiveIteratorIterator {

  function __construct($it) {
    parent::__construct($it, self::LEAVES_ONLY);
  }

  function current() {
    return "<td style='box'>" . parent::current(). "</td>";
  }
  function beginChildren(){
    echo "<tr>";
  }

  function endChildren(){
    echo "</tr>";
  }
}

require 'connection.php';

try {
  $stmt = $conn->prepare("SELECT id, FirstName, LastName, Role, Email, Username FROM users");
  $stmt->execute();

  $result = $stmt->setFetchMode(PDO::FETCH_ASSOC);

  foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v){
    echo $v;
  }
}
catch (PDOException $e){
  echo "Error: " . $e->getMessage();
}

$conn = null;
?>

<form method="post" action="delete.php">
  <input <input class="btn-default" type="submit" name="login" value="Delete">
</form>

<?php
echo "</table>";

?>

删除.php

<?php
$servername = 'localhost';
$username = 'root';
$pass = 'root';
$database = 'tutor_database';

try {
  $conn = new PDO("mysql:host=$servername;dbname=$database", $username, $pass);
  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

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

  $conn->exec($sql);
  echo "Record deleted!";

} catch(PDOException $e) {
  echo $sql . "<br>" . $e->getMessage();
}
$conn = null;

?>

我会展示一张图片,但我没有足够的声望点来展示它。

【问题讨论】:

    标签: php mysql button delete-row


    【解决方案1】:

    DELETE 语句中的 WHERE 子句将始终返回 true。在每一行上,ID 总是等于 ID。因此,所有内容都被删除。您需要将参数传递给删除脚本以过滤要删除的行。您可以通过使用 get="method" 或 &lt;form&gt; 的隐藏 HTML 输入值来实现。

    但是,关键是如何从网页的选择查询中获取该 id。此外,您需要将输入按钮放在每行的末尾以删除相应行的 id。对于这两个项目,您可能不得不返回到网页上的传统循环而不是RecursiveArrayIterator(),因为我们需要在表格中添加一个未获取的对象(表单删除按钮)。

    admin.php (通知表单按钮作为每行的最后一个表格单元格)

    ...same code as above...
    
    try {
      $stmt = $conn->prepare("SELECT id, FirstName, LastName, Role, Email, Username FROM users");
      $stmt->execute();
    
      $result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
    
      while($row = $result->fetch()) {  
      ?>
        <tr>    
         <td style="box"> <?php echo $row['id']; ?></td> 
         <td style="box"> <?php echo $row['FirstName']; ?></td> 
         <td style="box"> <?php echo $row['LastName']; ?></td> 
         <td style="box"> <?php echo $row['Role']; ?></td> 
         <td style="box"> <?php echo $row['Email']; ?></td> 
         <td style="box"> <?php echo $row['Username']; ?></td> 
         <td>
           <form method="get" action="delete.php">
               <input type="hidden" name="rowid" value="<?php echo $row['id']; ?>">
               <input class="btn-default" type="submit" name="login" value="Delete">
           </form>
         </td>
       <tr>
      <?php
      }
    }
    catch (PDOException $e){
         echo "Error: " . $e->getMessage();
    }
    
    $conn = null;
    

    delete.php (注意 $id 由 $GET() 生成并用于删除查询)

    $servername = 'localhost';
    $username = 'root';
    $pass = 'root';
    $database = 'tutor_database';
    
    try {
      $conn = new PDO("mysql:host=$servername;dbname=$database", $username, $pass);
      $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
      // OBTAIN ROWID FROM $_GET
      if(isset($_GET['rowid'])) {
            $id = $_GET['rowid'];
      }
    
      // DELETE SPECIFIED ROW
      $sql = "DELETE FROM users WHERE id = ".$id;
    
      $conn->exec($sql);
      echo "Record deleted!";
    
    } catch(PDOException $e) {
      echo $sql . "<br>" . $e->getMessage();
    }
    $conn = null;
    

    【讨论】:

    • 您好,我已经尝试了您对 admin.php 文件的方法,但由于某种原因,记录不再像以前那样显示。我可能在这里遗漏了什么?没有把握。我可以看到我的表的标题,但数据库中的数据不像以前那样显示。
    • users表中有记录吗?回想一下,在之前的尝试中,您删除了所有内容。
    【解决方案2】:

    努力追随你所拥有的。您是否尝试过将 id 设置为 var?

    $sql = "DELETE FROM users WHERE id = id";
    

    例子:

    $sql = "DELETE FROM users WHERE id = '$id'";
    

    【讨论】:

    • 一开始我没有使用任何变量,就像你在我的代码中看到的那样。
    【解决方案3】:

    一个问题是您的DELETE 语句不包含变量。

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

    你需要更多类似的东西:

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

    其中 $id 使用所选行的 ID 定义。

    让我们解决另一个“隐藏”的问题。

    现在按钮可以使用,但它会完全删除您从代码中得知的所有内容。

    鉴于您说这会删除所有记录,我猜您每一行的id 是字符串'id',而不是唯一的整数值。

    DELETE FROM {table} WHERE id = {number} 不会删除所有记录。它只删除符合条件的记录。您应该确保在添加行时正确设置id。 id 列应具有以下属性:INT UNSIGNED NOT NULL AUTO_INCREMENT。

    【讨论】:

    • 嗯,我不知道怎么说。但是一旦我按下按钮后再次检查数据库值,它肯定会删除与唯一整数值​​相关的所有内容。
    • 您能否编辑您的答案以包含调用delete.php 前后数据库中的数据?
    • 我会用图片向你展示之前和之后的结果,但不幸的是网站不允许我这样做。从我在删除之前(现在)可以告诉你的情况来看,有两个 id 设置为 18 和 19,其中包含名字、姓氏、角色等以及相关信息。一旦我按下删除按钮,它就会给我"Record Deleted!" 的返回消息,然后检查我看到Empty set (0.00 sec) 的数据库。这就是id = id;
    • 我猜这个id = id; 是一个错误,它减少到DELETE from users;,这是一个从整个表中删除所有行的命令。在输入另外几行后,尝试将 id 值硬编码为:DELETE FROM users WHERE id = 20;。
    • 我已经尝试过你的方法,它确实可以从数据库中删除唯一指定的 ID。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多