php - 链接 MySQL 数据库中的行并使用 PHP 进行查询

标签 php mysql hyperlink row

我刚刚用 PHP 完成了我的第一个网站,现在我才注意到一个问题。我的很多动态内容都“链接”到其他表中的行。因此,当其他表中的这些行被删除时,显然会给我一个错误。

例如,我有一个表“book_groups”,它从表“books”、“hosts”和“locations”中提取数据。因此,在查询某个 book_group 后,我会根据与该组一起存储的 book_id、host_id 和 location_id 对其他表进行更多查询。

我显然计划得不够好。因为如果一本书被不小心删除然后重新添加,id就会改变,它就会被破坏。

我的问题是,现在我已经全部完成了,解决这个问题的最佳方法是什么?我可以返回每个查询并添加 if( $query_result != false ) 以查看该行是否仍然存在。但是,有很多查询,因为我有很多不同类型的组和相关表。

作为将来的引用,是否有更好的方法来链接 MySQL 中的表,而不仅仅是存储相关表行的 id?

最佳答案

您的主题是参照完整性。在 MySQL 中,您可以通过数据库触发器强制执行这种完整性。

例如,您可以定义一个在父记录上发生删除之前执行的触发器:

CREATE TRIGGER trg_books_bef_delete
    BEFORE DELETE
    ON books
    FOR EACH ROW
BEGIN
    DELETE FROM book_groups WHERE book_id = old.book_id;
END;

此特定触发器将删除 book_groups 中引用正在删除的 book 记录的任何相关记录。

您可以决定采取不同的响应方式,并在删除具有相关记录的 book 记录时引发错误。从 MySQL 5.5 开始,您可以执行以下操作:

CREATE TRIGGER trg_books_bef_delete
    BEFORE DELETE
    ON books
    FOR EACH ROW
BEGIN
    IF (SELECT COUNT(*) FROM book_groups WHERE book_id = old.book_id) > 0
    THEN
       SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Foreign Key Constraint Violated!';
    END IF;
END;

在这种情况下,如果发现 book_groups 记录引用了被删除的 book 记录,则会引发严重异常,并且 delete 操作被取消。

您可以使用 MySql 阅读有关引用完整性的内容 here .

您可以在 PHP 中执行类似的操作,但是当通过其他工具(例如 phpAdmin)连接时,有可能绕过此类代码。触发器的优点是它们的执行独立于您连接的位置,并且它们在与主要操作相同的事务中执行。缺点是除了 php 代码之外,您还需要维护另一层代码。并且 php 代码必须了解这些触发器可能对其他表产生的副作用。

php中对书籍进行受控删除的一些想法:

$confirmed = false;
if (isset($_POST["confirm"])) {
    $confirmed = true;
}

$book_id = $_POST["book_id"]);

$con = mysqli_connect(...);

// Check for dependent records that would also be deleted:
if ($stmt = mysqli_prepare($con, 
        "SELECT COUNT(*) AS cnt FROM book_groups WHERE book_id = ?")) {
    mysqli_stmt_bind_param($stmt, "i", $book_id);
    mysqli_stmt_execute($stmt);
    mysqli_stmt_bind_result($stmt, $cnt);
    mysqli_stmt_fetch($stmt);
    mysqli_stmt_close($stmt);
    if ($cnt > 0 && !$confirmed) {
        ?>
        <html>
        <body>  
            <form action="" method="post">
                <input type="hidden" name="book_id" value="<?=$book_id?>"/>
                This book is categorised in groups, 
                are you sure to delete that information?
                <input type="submit" value="confirm" name="confirm"/> 
            </form>
        </body>
        </html>
        <?php
        exit;
    }
}

// continue to delete book below...

关于php - 链接 MySQL 数据库中的行并使用 PHP 进行查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33812819/

相关文章:

javascript - 如何在饼图中创建超链接

php - 如何获取上传到 FTP 服务器的文件的 HTTP URL

php - Laravel 5.3 中的 concat 集合

php - 如何获取插入查询的结果

php - 反向计算深层嵌套多维数组的值

html - 链接横跨整个页面(使用图片作为链接)

php - 嵌套选择框

php - 将 Android 应用程序连接到 MySQL 的最佳方式是什么?

mysql - 获取MySQL中小数范围的频率分布

html - 标志的链接只有部分功能