使用图像和作为主键的值从数据库中删除行

时间:2012-12-09 09:06:13

标签: php mysql sql database

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

$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中获得的图像,以便您了解它必须做什么:

The webpage view

1 个答案:

答案 0 :(得分:4)

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

但是,我确实相信我可以为您的原始问题添加一些额外的价值,并希望说服您改变主意使用旧的ext / mysql扩展名(现已弃用,并且长期以来不鼓励< / em>的)。我注意到你说你现在不想使用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代码。
  6. 看了我为你列出的一些好处之后;我挑战你看看现在不切换的好处,并告诉我它们是否超过了切换的好处。我更有信心你无法得出这个结论,因为我甚至无法想到推迟你转向更新的API的单一好处。这个旧的API会促进糟糕的做法,其中一个你今天刚刚意识到你正在得到你的答案,并且不仅仅是因为使用ext / mysql多年来这些不良做法已经根深蒂固。即使我已经意识到在过去8年左右我从ext / mysql中汲取了多少不良习惯。但是,当我真正看到优势和劣势时(我花了最近两年的时间),我得出的结论是,优点远远超过了缺点。

    作为一个简单的示例,让我们看看你的代码将会是多少漂亮更容易阅读更容易调试使用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>";
    

    只要看看代码看起来有多精细和简洁,它实际上更容易阅读!你同意吗?