1

我正在制作一个应用程序,其中有这张表:

<?php
require_once 'Connect2db3.php';
?>    
<form>    
<fieldset>
<article class="rondehoeken"> 
<header>
    <div class="streep1"></div>
    <div class="streep2"></div>
    <div class="streep3"></div>
    <div class="streep4"></div>
    <div class="streep5"></div>
    <h1 id="artikel-titel" >Op Vooraad</h1>
</header>

<div id="artikel-container">    
<table class="table 1">
<thead>
 <title>Inventory Grid.html</title>
    <meta charset = "UTF-8" />
    <style type = "text/css">
    table, td, th {
      border: 1px solid black;
    } 
    </style>
</thead>    
<tbody>
 <?php
$con=mysqli_connect("localhost","root","admin","inventarisdb");
// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

$result = mysqli_query($con,"SELECT * FROM BCD");

echo "<table border='0'>
<tr>
<th>Categorie</th>
<th>SerieNummer</th>
<th>MacAdress</th>
<th>ProductCode</th>
<th>Prijs</th>
<th>RekNummer</th>
<th>PaletNummer</th>
<th>Hoeveelheid</th>
<th>Aantekeningen</th>
</tr>";

while($row = mysqli_fetch_array($result))
  {
  echo "<tr>";
  echo "<td>" . $row['Categorie'] . "</td>";
  echo "<td>" . $row['SerieNummer'] . "</td>";
  echo "<td>" . $row['MacAdress'] . "</td>";
  echo "<td>" . $row['ProductCode'] . "</td>";
  echo "<td>" . $row['Prijs'] . "</td>";
  echo "<td>" . $row['RekNummer'] . "</td>";
  echo "<td>" . $row['PaletNummer'] . "</td>";
  echo "<td>" . $row['Hoeveelheid'] . "</td>";
  echo "<td>" . $row['Aantekeningen'] . "</td>";
  echo '<td><input type="hidden" class="entryid" name="id" value='.$row['ID'].' /><a href="#" class="delete">delete</a></td>';
  echo "</tr>";
  }
echo "</table>";

mysqli_close($con);
?>

</article>
</fieldset>
</form>

在标题中:

删除表格:

<?php
$db = array (
    'host' => 'localhost',
    'user' => 'root',
    'pass' => 'admin',
    'dbname' => 'inventarisdb'
);

if(!mysql_connect($db['host'], $db['user'], $db['pass']))
{
    trigger_error('Fout bij verbinden: '.mysql_error());
}
elseif(!mysql_select_db($db['dbname']))
{
    trigger_error('Fout bij selecteren database: '.mysql_error());
}
else
{
    $sql = "SET SESSION sql_mode = 'ANSI,ONLY_FULL_GROUP_BY'";
    if(!mysql_query($sql))
    {
        trigger_error('MySQL in ANSI niet mogelijk');
    }
}

$id = $_GET['id'];
$sql="DELETE FROM BCD WHERE id='$Categorie', '$SerieNummer', '$MacAdress', '$ProductCode', '$Prijs', '$RekNummer','$PaletNummer' ,'$Hoeveelheid', '$Aantekeningen'";
?> 

该表从另一个表中查找数据,还提供了从数据库中删除该表中的行的选项。

我刚才所说的这个表的所有内容都适用于这个脚本,除了从我的数据库中实际删除的数据。按下删除后,将执行删除操作,并提示您将删除一行。它将它从表中删除,但是当您签入数据库或只是用表刷新页面时,该行仍然存在并且没有被删除

任何想法为什么会发生这种情况或该怎么做?或者也许怎么做更容易?

4

4 回答 4

3

我认为这行不通

$sql="DELETE FROM BCD WHERE id='$Categorie', '$SerieNummer', '$MacAdress', '$ProductCode', '$Prijs', '$RekNummer','$PaletNummer' ,'$Hoeveelheid', '$Aantekeningen'";

您应该使用AND或 OR分隔参数,具体取决于您的成功删除条件不需要逗号,每次还提供列名

就像是

$sql="DELETE FROM BCD WHERE id='$Categorie' AND  serial_number='$SerieNummer', //etc

基于主键而不是这样的值范围删除会更好

也不要使用 mysql_ 函数,使用带有参数化查询的 mysqli 或 PDO

于 2013-08-22T07:22:51.997 回答
2

因为在您的代码中很明显,您不执行查询。

于 2013-08-22T08:03:53.780 回答
1

您的隐藏输入被命名id并且您正在调用$id = $_GET['id'],您在查询中拥有的所有其他变量都是未定义的,因为如果您定义了它们,您还没有显示定义它们的位置。

代替:

$id = $_GET['id'];
$sql="DELETE FROM BCD WHERE id='$Categorie', '$SerieNummer', '$MacAdress', '$ProductCode', '$Prijs', '$RekNummer','$PaletNummer' ,'$Hoeveelheid', '$Aantekeningen'";

和:

$id = intval($_GET['id']); // assuming your id column is integer type.
$sql="DELETE FROM BCD WHERE id=$id";

另请注意,mysql_不推荐使用函数。您应该使用mysqlipdo

于 2013-08-22T07:29:42.537 回答
0

根据您的示例代码演示,我得出与@BabakBandpay 相同的结论;你从来没有真正运行过 DELETE 查询

不管这是否属实,虽然迁移到 MySQLi 库是一个很好的步骤,但您仍在使用非常容易受到 SQL 注入影响的代码。尝试使用准备好的语句:http ://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php

这是基于您的代码(和 API 文档)的示例:

<?php

    $mysqli = new mysqli('localhost', 'root', 'admin', 'inventarisdb');

    /* check connection */
    if (mysqli_connect_errno()) {
        printf("Connect failed: %s\n", mysqli_connect_error());
        exit();
    }

    // ... the rest of your code

    $id = $_GET['id'];
    $stmt = $mysqli->prepare("DELETE FROM BCD WHERE id=?");
    $stmt->bind_param("i", $id);

    $success = $stmt->execute();

    $mysqli->close();
?> 

这段代码虽然未经测试并且不是真正的生产质量,但仅从绑定语句的性质来看就更安全了:

绑定变量将被服务器自动转义。

当我还在 PHP 中编码时,我更喜欢 PDO,但是使用 MySQLi 的 OOP 版本是一个不错的折衷方案,所以我强烈建议通读文档中的示例。

编辑:作为附录,我还建议通过过滤器模块(http://www.php.net/manual/en/book.filter.php)运行您的输入变量。假设$id应该是一个整数,我会将分配更新为:

$id = filter_var($_GET['id'], FILTER_SANITIZE_NUMBER_INT);

这将删除$_GET['id']不是数字或 +/- 符号的所有内容。

于 2013-08-22T08:36:45.950 回答