【问题标题】:Trying to delete an entry in a table. Query doesn't delete the row, no idea how to debug试图删除表中的条目。查询不删除行,不知道如何调试
【发布时间】:2016-03-25 06:01:39
【问题描述】:

我正在尝试使用以下代码删除我的数据库中的一个条目。 javascript 函数使用正确的“adventureID”将我带到index.php?delpost=,但是当我检查我的数据库时,该行仍然存在。我最近开始使用 PDO,所以我想知道 execute() 语句是否可能是问题所在。 $dbh 在页面顶部连接到我的数据库,它正在打印我试图从中删除行的表中的每一行。我的目标是在调用 javascript 函数时成功删除一行。问题是 - 它没有。

<script language="JavaScript" type="text/javascript">
    function delpost(adventureID, title)
    {
        if (confirm("Are you sure you want to delete '" + title + "'" + " '" + adventureID + "'"))
        {
            window.location.href = 'index.php?delpost=' + adventureID;
        }
    }
</script>


<?php
    if(isset($_GET['delpost'])){
        $stmt = $dbh->prepare("DELETE FROM adventure WHERE adventureID = :adventureID");
        $stmt->execute(array(':adventureID' => $_GET['delpost']));
        header('Location: index.php?action=deleted');
        exit;
    }
?>


<?php
if(isset($_GET['action'])){
    echo '<h3>Post '.$_GET['action'].'.</h3>';
}

try {
    foreach($dbh->query("SELECT adventureID, title, postDate FROM adventure ORDER BY adventureID DESC") as $row) {
        echo '<tr>';
        echo '<td>'.$row['title'].'</td>';
        echo '<td>'.date('jS M Y', strtotime($row['postDate'])).'</td>';
        ?>

        <td>
            <a href="javascript:delpost('<?php echo $row['adventureID'] ?>','<?php echo $row['title'] ?>')">Delete</a>
        </td>

        <?php
        echo '</tr>';

    }

} catch(PDOException $e) {
    echo $e->getMessage();
}
?>

【问题讨论】:

  • mysql在运行命令时会说什么?
  • 如果我在 phpMyAdmin 中运行该命令,它会删除该行
  • 返回给php的是什么?
  • try {移到if(isset($_GET['delpost']))之前
  • 好吧,把重定向注释掉...

标签: javascript php mysql pdo


【解决方案1】:

您可能正面临 MYSQL 安全更新 处于打开状态的问题。为了避免它并最终能够删除行,您可以采用以下策略:

SET SQL_SAFE_UPDATES = 0;

--- YOUR DELETE STATEMENT ---

SET SQL_SAFE_UPDATES = 1;

要检查您是否启用了SQL_SAFE_UPDATES,您可以运行:

SHOW VARIABLES LIKE 'sql_safe_updates'

【讨论】:

    【解决方案2】:

    尝试替换此代码:

    $stmt = $dbh->prepare("DELETE FROM adventure WHERE adventureID = :adventureID");
    $stmt->execute(array(':adventureID' => $_GET['delpost']));
    

    通过以下方式:

    $stmt = $dbh->prepare("DELETE FROM adventure WHERE adventureID = :adventureID"); 
    $stmt->bindParam('adventureID', $_GET['delpost']);
    $stmt->execute();
    

    解释:

    • 您可以:在查询中使用“:variable”,然后通过将变量与“bindParam”函数绑定来传递变量。
    • 或者:使用“?”在您的查询中,然后在“执行”函数中传递变量。

    完整的例子可以在这里找到:http://php.net/manual/fr/pdostatement.execute.php#example-1050

    【讨论】:

    • 你有什么错误吗?请尝试更明确。
    • 我没有收到任何错误。它只是没有用。我不知道如何将错误(如果出现)打印到屏幕上。
    • 你有日志文件吗?服务器日志文件?你有“on”中的“display_errors”吗?
    • 我不知道。基本上没有。
    • ini_set("display_errors", "on") 放在 PHP 文件的顶部。然后重试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    相关资源
    最近更新 更多