【问题标题】:Delete row from database with an image and a value that is a primary key从数据库中删除带有图像和主键值的行
【发布时间】:2012-12-09 09:06:12
【问题描述】:

我得到了这段代码来在我的网页上显示一个表格。表的内容与数据库链接。所以我从数据库中的 html 表中获取表。在每个(html)行的末尾,我得到一个图像(icon-delete.png)。这将获取$row[0] 的值(这是我的 PKID 所在的位置,因此它始终是唯一的数字并且它是自动上升的。现在我想用 PHP 清除单击 icon-delete.png 按钮的单个行代码。该行也必须从数据库中删除。这是我此时的代码:

$con = mysql_connect('localhost', 'root', '');
if ($con) {
    mysql_select_db('bieren', $con);
    $result = mysql_query('SELECT * FROM brouwers');
    echo '<form action="" method="post">';
    echo '<table border="0" cellspacing=0>';    
    echo '<tr class="heads">
        <th>brouwernr</th>
        <th>brouwernaam</th>
        <th>adres</th>
        <th>postcode</th>
        <th>gemeente</th>
        <th>omzet</th>
    </tr>';

    $counter = 0;
    while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
        if($counter % 2 == 0){
            echo '<tr class="even">';
        } else{
            echo '<tr class="oneven">';
        }

        for($i = 0; $i <=6; $i++){
            $counter ++;
            echo '<td>';
            echo $row[$i];
            echo'</td>';
        }

        echo '<td> <input type="image" src="icon-delete.png" name="delete" value ="'.$row[0].'" /> </td>';
        echo '</tr>';
    }   
} else {
    echo 'Connectie niet geslaagd. Reden: ' . mysql_error() . '. Probeer opnieuw.';
}
echo '</table>';
echo '</form>';

if(isset($_POST))
{
    $con = mysql_connect('localhost', 'root', '');

    if ($con) {
        mysql_select_db('bieren', $con);
        $result = mysql_query('DELETE FROM brouwers 
                  WHERE brouwers.brouwernr = "'.$row[0].'"');}
}

我的代码的最后一条规则是:WHERE brouwers.brouwernr = $row[0] 但这不是要删除的正确行。我还将在 html 中显示我现在得到的图像,以便您了解它必须做什么:

【问题讨论】:

  • 注意! PHP 的未来版本将弃用和删除mysql_ 系列函数。现在是switch to PDOmysqli 的好时机。
  • 首先我现在不想使用 PDO。我现在所拥有的基本上是我尝试过的,我改变了很多,但只是接近从数据库中删除一些东西,而不是当前行(如此硬编码)

标签: php mysql sql database


【解决方案1】:

我相信您最初问题的答案是您需要使用 $_POST['delete'] 作为要删除的行的 id,@vlcekmi3 似乎已经很好地回答了这个问题。

但是,我确实相信我可以为您原来的问题增加一些额外的价值,并希望能说服您改变主意,使用旧的 ext/mysql 扩展(现在已弃用并且长期以来一直不鼓励)。我注意到您说您现在不想使用 PDO。我认为这种想法有问题的是,现在是停止使用旧的 mysql API 并开始使用更新的 API 的最佳时机,例如 PDOMySQLi。与其试图给你不使用旧 API 的理由,我将尝试向你提供一些你应该使用较新 API 的理由。

  1. 您当前使用的 API(mysql_* 函数)已经使用了将近 15 年。我们大多数人都没有那么旧的汽车。您是否像重视您的交通方式一样重视您的代码?该扩展是在 MySQL 版本 3.x 期间引入的,并且从那时起一直向后兼容该版本的 MySQL。由于这种无关的向后兼容性限制,API 在支持所有数据库的新功能方面仍然缺乏支持,而其中大部分功能对于当今网络上的现代应用程序开发来说是无价的。
  2. API 不再接受来自 MySQL 社区的任何维护或支持。这意味着您不应该期望此扩展中的任何内容多年来都会发生变化。这包括错误修复、潜在的安全补丁,以及多年来 MySQL 中的任何更改都可能破坏您的扩展。这不是一件好事(你把自己置于危险之中)。 PDO 和 MySLQi 都可以保护您的代码免受这些风险的影响,并且还提供了额外的便利,因为如果出现任何问题(发现任何错误),您可以期望这些扩展得到及时修复。
  3. 较新的 API 为您提供无法在 ext/mysql 中使用的功能,例如:
    • 准备好的语句(在许多常见情况下可能提供更快的性能)
    • 参数化查询(可帮助您避免常见的人为错误,例如您刚刚在此处遇到的转义问题)
    • 异步查询(另一个性能优势)
    • 存储过程(一个出色的工具,提供常规 SQL 查询所不具备的优势)
    • 多种查询功能
    • 事务支持(用于财务数据等关键任务应用程序)
    • SSL 支持(当您在网络上有多个数据库服务器时)
    • 能够运行与 MySQL 服务器交互的命令,这是旧 API 无法做到的。
  4. 较新的 API 使您的代码更易于阅读和使用。您可以使用这些 API 抽象出大部分计算逻辑的 SQL 逻辑,并避免 ext/mysql 给您带来不必要的复杂性。
  5. PDO 是一个与数据库无关的 API,这意味着您只需在 PHP 中学习相同的一组函数即可与 PHP 可以支持的任何数据库进行交互。如果将来您必须在任何给定时间使用新数据库,您将不必重新学习新界面。这样可以节省您处理 PHP 代码的时间和精力。

在查看了我为您列出的一些好处之后;我挑战你看看现在不切换的好处,并告诉我它们是否超过了切换的好处。我非常有信心您将无法得出这个结论,因为我什至想不出将您进一步推迟到更新的 API 的移动有什么好处。这个旧的 API 促进了不良做法,您今天在得到答案时才意识到其中之一,而且不只是您将这些不良做法从多年使用 ext/mysql 的大脑中根深蒂固。甚至我也意识到在过去 8 年左右的时间里,我从 ext/mysql 中养成了多少坏习惯。但是当我真正看到优点和缺点时(而且我在过去 2 年一直在这样做),我得出的结论是优点远远大于缺点。

作为一个简单的例子,让我们看看如果您是使用 PDO。

/* This creates a new PDO object that holds the connection to your database */
$db = new PDO('mysql:dbname=bieren;host=localhost;charset=UTF-8', 'root', '');

/* This puts PDO into Exception Mode making it easier for you to catch errors */
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0); // turn off emulation

/* Create your HTML table */
echo "<table>";

// Look how easy it is to loop over the results
foreach($db->query('SELECT * FROM brouwers', PDO::FETCH_NUM) as $i => $row) {
    echo ($i % 2 ? '<tr class="oneven">' : '<tr class="even">');
    foreach ($row as $column) {
        echo "<td>$column</td>";
    }
    echo "</tr>\n";
}

echo "</table>";

看看这段代码看起来多么漂亮和简洁,而且实际上更容易阅读!你同意吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多