mySQL - 无法删除带有 PHP 的 table 行(未显示错误)

mySQL - Can't delete table row with PHP (not showing an error)

我今天花了很多时间来解决大量类似的问题,并试图找出我的代码有什么问题,人们遇到的很多问题与反引号、引号等有关,但 none 似乎有帮助或改变我的事业。我的代码没有产生任何错误,但是当我使用 echo 打印出我的查询结果时,id 似乎没有得到值。

在我的 delete.php 中:

<?
ini_set('display_errors',"1");

$username="xxx";
$password="xxx";
$database="xxx";

$conn = new mysqli(localhost, $username, $password, $database);

if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$id = (int)$_GET['number'];
mysqli_query($conn,"DELETE FROM tourdates WHERE id=".$id."");

$conn->close();

?>

我的 main.php 中的删除按钮(php 的其余部分正确显示我的 table 和数据):

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

谁能帮我找出当我点击我创建的删除按钮时导致我的行不被删除的原因,或者更清楚的东西可以帮助我调试? (我不想为此使用复选框)。

编辑:

我也试过这段代码(同时将函数定义为 $sql,我收到一条 "Success" 消息:

if ($conn->query($sql) === TRUE) {
    echo "New record created successfully";
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}

编辑 2:

我按照我应该使用的建议更改了结构 POST,我想我可能发现了一些我以前没有注意到的东西,但仍然没有用。

echo "<td><form method='post' action='delete.php'>
        <input type='hidden' name='row_id' value=".$row['id']."  />
        <input type='submit' name='delete_row' />
        </form>";

-

if(isset($_POST['delete_row'])) {
    $stmt = $conn->prepare("DELETE FROM tourdates WHERE ID = ?");
    $stmt->bind_param('i', $_REQUEST['row_id']);
    $stmt->execute();
}

如果我按上面的方式做,什么也不会发生。也试过这种方式,得到语法错误:

if(isset($_POST['delete_row'])) {
    $id = $_POST['row_id'];
    $sql = "DELETE FROM tourdates WHERE id=".$id;
    mysqli_query($conn,$sql);
}

我看到的一个潜在问题是,您没有引用 localhost,因此 php 将查找名为 localhost:

的常量
$conn = new mysqli('localhost', $username, $password, $database);
                   ^         ^ here

您也没有检查错误,所以您没有看到任何错误。解决这个问题的最简单方法是让 mysqli 抛出异常。只需将其添加到脚本的顶部:

mysqli_report(MYSQLI_REPORT_STRICT);

我也不知道您是否可以像这样混合过程式和面向对象的 mysqli。您可能应该坚持使用 OOP 版本。

除此之外,您不应使用 link(GET 请求)进行删除操作。如果网络爬虫或浏览器扩展试图获取 link 怎么办?相反,您应该使用 POST 请求(例如带有按钮的表单)。

编辑: 还有一个问题导致你得不到你的 ID,当你将它投射到 int 时,你总是会得到 0 :

<td><a href='delete.php?number='".$row['id']."'>Delete</a></td>
                               ^ Oooops, closing the href attribute value here...

您的 ID 位于 href 值的值之后/引号之外。如果您查看页面的来源,您可以很容易地验证这一点。

你需要:

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

在你的php文件中替换这两部分代码,先把你的主机写在引号里

$conn = new mysqli('localhost', $username, $password, $database);

在你写的 where 条件中 id=".$id."" 将其替换为 id=".$id

写成:

mysqli_query($conn,"DELETE FROM tourdates WHERE id=".$id);

已编辑:

如果您想在查询中看到错误,请使用以下代码:

mysqli_query($conn,"DELETE FROM tourdates WHERE id=".$id) or die(mysqli_error($conn));

为什么不使用 try 和 catch 来查看错误?

无论如何都试试这个

$stmt = $conn->prepare("DELETE FROM tourdates WHERE ID = ?");<br>
$stmt->bind_param('i', $_REQUEST['number']);<br>
$stmt->execute(); 

这可能是问题所在吗?

$id = (int)$_GET['number'];

也许这样会更好...?

$id = intval($_GET['number']);

无论如何,如果 echo($query) 打印出一个空的 id,这可能是因为您的参数不是整数。