【问题标题】:delete a specific row of a table using php使用php删除表的特定行
【发布时间】:2014-11-24 07:18:24
【问题描述】:

这个问题非常基本,我在 stackoverflow 中发现了许多类似的问题,但没有一个对我有用。

我设计了一个表格,可以显示如下数据:

ID  name    Delete
1   abc     Delete
2   def     Delete

上面显示的代码是

<?php
$con=mysqli_connect("abc","abc","abc","abc");
// Check connection
if (mysqli_connect_errno()) 
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$result = mysqli_query($con,"SELECT * FROM student");
echo "<table class='table table-striped table-bordered table-hover'>
<thead>
<tr>
<th>ID</th>
<th>name</th>
<th>delete</th>   
</tr>
</thead>";
while($row = mysqli_fetch_array($result)) 
{
echo "<tbody data-link='row' class='rowlink'>";
echo "<tr>";
echo "<td>" . $row['id'] . "</td>";
echo "<td>" . $row['name'] . "</td>";
echo "<td><a href='delete.php'>Delete</a></td>";
echo "</tr>";
echo "</tbody>";    
}
echo "</table>";
mysqli_close($con);
?>

delete.php 的代码

<?php
$con=mysqli_connect("abc","abc","abc","abc");
// Check connection
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
mysqli_query($con,"DELETE FROM student WHERE id='$id'");
mysqli_close($con);
header("Location: index.php");
?> 

数据库视图

Id  name
1   abc
2   cdf

问题是它没有删除数据,也没有显示任何错误

我是这个领域的新手,如果有人可以帮助我,将不胜感激

【问题讨论】:

  • 您的删除代码中没有定义$id你有吗?它没有显示/包含。
  • 您还在整数周围加上引号,并且无法检查您的函数返回。
  • 让你的删除脚本成为一个简单的 GET 方法肯定会让你大吃一惊。永远不要在 get 后面放置像这样的破坏性操作 - 考虑如果您的浏览器决定预取页面上的所有链接会发生什么。 “哎呀”。
  • 有人能告诉我运行查询的正确方法吗
  • @Sam “谁能告诉我运行查询的正确方法” - 当然。看看我下面的回答。它现在可以工作了。但是请考虑使用准备好的语句,它们更安全。链接已列出。

标签: php mysql sql mysqli


【解决方案1】:

更改这一行:

echo "<td><a href='delete.php'>Delete</a></td>";

echo "<td><a href=\"delete.php?id=".$row['id']."\">Delete</a></td>";

然后对于 delete.php(如评论中最初所述,$id 未定义)。

<?php
$con=mysqli_connect("abc","abc","abc","abc");
// Check connection
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$id = $_GET['id']; // $id is now defined

// or assuming your column is indeed an int
// $id = (int)$_GET['id'];

mysqli_query($con,"DELETE FROM student WHERE id='".$id."'");
mysqli_close($con);
header("Location: index.php");
?> 

它会起作用的。

然而,为了安全起见,您应该考虑使用 mysqli with prepared statementsPDO with prepared statements它们更安全。我在下面提供了一个示例。


这是一个准备好的语句示例:

<?php 
$DB_HOST = "xxx";
$DB_NAME = "xxx";
$DB_USER = "xxx";
$DB_PASS = "xxx";

$con = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if($con->connect_errno > 0) {
  die('Connection failed [' . $con->connect_error . ']');
}

$id = (int)$_GET['id'];

$update = $con->prepare("DELETE FROM student WHERE id = ?");
$update->bind_param('i', $id);
$update->execute();
$update->close();

【讨论】:

    【解决方案2】:

    在您的链接中添加GET 参数:

    echo "<td><a href='delete.php?id='".$row['id']."'>Delete</a></td>";
    

    然后在您的 delete.php 查询中捕获它:

    $id = $_GET['id'];
    mysqli_query($con,"DELETE FROM student WHERE id='".$id."'");
    

    【讨论】:

    • 在修改数据库中的数据时使用GET 绝不是一个好主意。例如,使用预取浏览器扩展程序,您将自动清除数据库。
    • 为什么不是个好主意?你可以通过 intval($id) 清除 $id ,然后它是安全的。
    • @CarcaBot 我还没有提到sql注入,我只是在谈论一个自动跟踪所有链接的浏览器。
    • @jeroen 你把它设置为“自动”了吗?
    【解决方案3】:

    您可能不想在每次删除一行时刷新页面,您可以使用对服务器的 ajax 请求更快地完成此操作。您可以从以下链接获取完整代码:delete individual row from databse using ajax

    【讨论】:

      猜你喜欢
      • 2018-12-05
      • 2015-01-10
      • 2019-02-03
      • 2019-03-10
      • 1970-01-01
      • 2017-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多