【问题标题】:php delete $row not workingphp删除$行不起作用
【发布时间】:2017-03-20 23:05:18
【问题描述】:

我有一张注册用户的桌子。我的代码假设在单击表中的删除时删除一行。 这是在database.php中

.....
 while ($row = mysqli_fetch_array($r, MYSQLI_ASSOC)) {
    echo '<tr><td align="left">' . $row['Id'] . '</td><td align="left"><a href="delete.php?id=' . $row['Id'] . '">Delete</a></td></tr>';
  }
...... 

所以,我在单击删除时得到了 id。到目前为止,这部分有效,但是当我尝试运行删除查询时它不起作用。 删除.php

<?php
session_start();
include 'connection.php';
   if (isset($_POST['Id']) && is_numeric($_POST['Id'])){
   $id = mysqli_real_escape_string($conn, $_POST['Id']);
   $result = mysqli_query("DELETE FROM table_name WHERE Id= '$id' ")
   or die(mysqli_error());

   echo "<h3><br><br><a href=database.php> <b> Go Back</a></h3>";
   echo "Data Deleted";
   }else {
      echo "Error";
      echo "<h3><br><br><a href=database.php> <b> Go Back</a></h3>";
   }  
?>

我只是得到“错误”并且它没有删除该行。我该如何解决?

编辑:

<?php
session_start();
include 'connection.php';

if (isset($_GET['Id']) && is_numeric($_GET['Id']))
{
$id = mysqli_real_escape_string($conn, $_GET['Id']);
$result = mysqli_query("DELETE FROM User_reg WHERE Id= '$id' ")
or die(mysqli_error());



echo "<h3><br><br><a href=AdminLog.php> <b> Go Back</a></h3>";
echo "Data Deleted";
}else {
echo "Error";
echo "<h3><br><br><a href=AdminLog.php> <b> Go Back</a></h3>";
}
?>

删除查询不起作用时仍然得到相同的结果。 此外,“Id”名称的设置方式与数据库中的设置方式相同。

【问题讨论】:

  • id 区分大小写
  • 警告:使用mysqli 时,您应该使用parameterized queriesbind_param 将用户数据添加到查询中。 请勿使用手动转义和字符串插值或连接来完成此操作,因为您将创建严重的SQL injection bugs。意外未转义的数据是一种严重的风险。
  • 这个问题有太多的额外编辑
  • 已经说过id 区分大小写。 ?id$_GET['Id'] 不匹配。
  • @– Fred -ii- 我已经解决了。但现在我得到一个空页面而不是回显消息。

标签: php mysql mysqli sql-delete


【解决方案1】:

$_POST['Id'] 未设置,因为您通过链接访问了该脚本。

<a href="AdminDelete.php?id=' . $row['Id'] . '">Delete</a>

链接是 GET 请求,而不是 POST 请求。所以,应该设置$_GET['id'](注意是$_GET['id']而不是$_GET['Id'],因为你在链接中使用了id),但是it's not really safe to use a link to delete things to begin with

有多种方法可以解决此问题。一种方法是让表中的删除链接将您引导至发布到实际删除脚本的中间确认页面。

【讨论】:

  • 我已将 POST 替换为 GET,但仍然得到相同的结果,没有删除。
  • 另请参阅this comment,了解“id”与“Id”的区分大小写。我编辑了答案以显示($_GET['id'] 而不是$_GET['Id'])。
  • 但在我使用的数据库中“Id”是列的名称而不是“id”
  • $_GET 中的键与数据库中使用的内容无关。这仅取决于您在此处的 URL 中使用的内容:AdminDelete.php?id=
  • 您尚未将连接添加到mysqli_query 呼叫。该函数有两个参数(请参阅the manual 中的“程序样式”部分)。第一个应该是您的连接 ($conn)。
【解决方案2】:

它不起作用,因为您正在发送 get 参数并检查 post 并注意上面准备好的语句的评论,并且尽量不要使用 get 删除数据,因为程序员可以轻松更改 id 并删除另一个用户信息使用而是发布,因为它不能被调整,这就是为什么社交使用让我称它为 ajax 来删除,因为除非您创建一个替代项,否则无法检索已删除的内容,因此请使用 POST METHOD 来更改它

 if (isset($_POST['id']) && is_numeric($_POST['id'])){
 $id = mysqli_real_escape_string($conn, $_POST['id']);

到这里

 if (isset($_GET['id']) && is_numeric($_GET['id'])){
$id = mysqli_real_escape_string($conn, $_GET['id']);

这应该可以工作

【讨论】:

  • 我已将 POST 替换为 GET,但仍然得到相同的结果。
  • 更改让你 id 小写字母编辑我的答案 id 区分大小写,并注意如果你的数据会变宽,这意味着很多用户尽量不要使用帖子删除
猜你喜欢
  • 2014-12-30
  • 2018-07-17
  • 1970-01-01
  • 2018-02-02
  • 2017-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多