【问题标题】:Why doesn't my PHP delete button work?为什么我的 PHP 删除按钮不起作用?
【发布时间】:2014-05-05 17:40:00
【问题描述】:

我在这里做错了什么?我正在尝试创建一个表,该表在每行旁边都有一个删除按钮/链接,单击时会删除该行。

<?php

ini_set('display_errors',1); 
 error_reporting(E_ALL);

mysql_connect('localhost', 'root', 'ca229');

mysql_select_db('testdb');

$result = mysql_query('select * from products');

$numrows = mysql_numrows($result);

//****************************************************************
print "<table border = 3 style = width:400px>";


for($i = 0; $i < $numrows; $i++)
{
    $row = mysql_fetch_row($result);

    print "<tr>";


    foreach($row as $cell)
    {

        print "<td>";
        print $cell;
        print "</td>";



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


    print "</tr>";


}


print "</table>";
//***************************************************************   

mysql_close();

?>

还有……

<?php

$id = $_GET["id"];
$delete = " DELETE * from products where id = ". $id ;

mysql_query($delete) ; 

?>

【问题讨论】:

  • 尝试将您的删除&lt;a href='delete.php?id=".$row["id"] ."' &gt;Delete&lt;/a&gt; 放入您的foreach($row as $cell) 循环中。另外,如下所述,删除DELETE之后的*
  • 您是否收到错误消息?究竟会发生什么?
  • 如果这是公共 Internet 上的应用程序,我会更关心您那里的 巨大 SQL injection bug,因为完全鲁莽地无视 proper escaping practices。请不要使用mysql_query 编写新代码,因为它已经过时了,并且在不久的将来会从 PHP 中删除。
  • 我假设单击您的链接后,响应的 PHP 文档会重新连接到数据库?你收到什么样的错误信息?除此之外,我会远离 mysql_* 函数。改为查看 mysqli 或 PDO。
  • 看起来delete.php 没有打开数据库连接。其他事情:您正在使用已弃用的mysql_*() - 使用mysqli_*()PDO;您没有转义 $_GET 查询中使用的 DELETE 变量,因此它对 SQL 注入开放。查看准备好的语句。

标签: php mysql button html-table sql-delete


【解决方案1】:

在 delete.php 文件的开头添加数据库连接行。

mysql_connect('localhost', 'root', 'ca229');
mysql_select_db('testdb');

您需要为 mysql_query 打开连接才能在您的数据库上工作。

【讨论】:

    【解决方案2】:

    在我们继续讨论好东西之前,让我先指出最初的错误在哪里。

    由于$row = mysql_fetch_row($result); 创建了一个枚举数组(例如:array(0=>'value1', 1=>'value2', ...)),而不是关联数组,$row["id"] 将是未定义的。这仍然会生成 HTML,但您的所有删除按钮都不会指定 id。

    这一行:

    $delete = "DELETE * from products where id = ". $id;
    

    您不需要* 只需这样做:

    $delete = "DELETE from products where id = ". $id;
    

    现在,好东西)---顺便说一句,我使用id - product - city 作为列示例。

    这是一个mysqli_* 版本。将 xxx 替换为您的数据库凭据。

    <?php
    ini_set('display_errors',1); 
    error_reporting(E_ALL);
    
    DEFINE ('DB_HOST', 'xxx');
    DEFINE ('DB_USER', 'xxx');
    DEFINE ('DB_PASSWORD', 'xxx');
    DEFINE ('DB_NAME', 'xxx');
    
    $db = mysqli_connect (DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) 
    OR die("could not connect");
    
    $results = mysqli_query($db,"select * from products");
    
    print "<table border=1 cellspacing=\"0\" cellpadding=\"3\">\n";
    
    echo "<tr>\n";
    echo '<td width="25%">
          <p align="center">ID</td>
        <td width="25%">
          <p align="center">PRODUCT</td>
        <td width="25%">
          <p align="center">CITY</td>
        <td width="25%">
          <p align="center">ACTION</td>
      </tr>';
    
    while ($row = mysqli_fetch_assoc($results)) {
    
        print "<tr><td>" . $row['id'] . "</td>\n<td>" . $row['product'] . "</td>\n" . "<td>" . $row['city'] . "</td>\n" . "<td>\n"  . "<a href='delete.php?id=".$row["id"] ."'>Delete</a>\n</td>\n</tr>\n";
    
    }
    
    print "</table>\n";
    
    echo "<hr>"; // simply a seperator. You can delete this
    
    mysqli_close($db);
    
    ?>
    

    删除代码 - mysqli_* (delete.php)

    <?php
    DEFINE ('DB_HOST', 'xxx');
    DEFINE ('DB_USER', 'xxx');
    DEFINE ('DB_PASSWORD', 'xxx');
    DEFINE ('DB_NAME', 'xxx');
    
    $db = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) 
    OR die("could not connect");
    
    $id = (int)$_GET["id"];
    
    $delete = "DELETE from products where id = ". $id;
    // You can also use
    // $delete = "DELETE from products where id=$id";
    
    if (mysqli_query($db,$delete))
      {
      echo "Database updated successfully";
      }
    else
      {
      echo "An error occurred: " . mysqli_error($db);
      }
    
    ?>
    

    mysql_*函数弃用通知:

    http://www.php.net/manual/en/intro.mysql.php

    此扩展自 PHP 5.5.0 起已弃用,不推荐用于编写新代码,因为它将来将被删除。相反,应该使用mysqliPDO_MySQL 扩展名。在选择 MySQL API 时,另请参阅MySQL API Overview 以获得更多帮助。

    这些函数允许您访问 MySQL 数据库服务器。有关 MySQL 的更多信息,请访问 »http://www.mysql.com/

    可以在 »http://dev.mysql.com/doc/ 找到 MySQL 文档。

    这里有一些关于准备好的语句的教程,您可以学习和尝试:

    这里有一些关于 PDO 的教程:

    【讨论】:

    • 你对他的过程和循环结果的解释是完全错误的。
    • 请问?你需要详细说明。我不提交 just cuz @DanielWilliams - 我用 OP 的代码在循环外对其进行了测试,但它没有工作。我建议您在没有毫无根据的情况下自己测试它。 -1 也是不需要的(来自谁反对它)。
    • 您对 $cell['id'] 的解释不正确。他正在遍历行的列,因为该行是一个简单的数组,然后尝试像关联数组一样使用它(这是他的错误)。考虑到他的假设,他的印刷品位置也不错。所以当然没用。但不是因为你给的原因。
    • foreach($row as $cell)$row["id"] 再看一遍,告诉我这行得通。 AS $cell @DanielWilliams --- 这与 OP 的 &lt;a href='delete.php?id=".$row["id"] ."' &gt;Delete&lt;/a&gt; 相关,点击时会失败。我建议您像我一样花一个小时来彻底测试它并使用&lt;a href='delete.php?id=".$row["id"] ."' &gt;Delete&lt;/a&gt;&lt;a href='delete.php?id=".$cell["id"] ."' &gt;Delete&lt;/a&gt; 进行比较
    • 当然点击删除会失败。但不是因为您发布的原因。如果你真的在这上面花了一个小时,你可以花 1 分钟来找出你的错误。
    猜你喜欢
    • 2020-06-29
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 2023-03-06
    相关资源
    最近更新 更多