php - 在数据库中不存在行时在 PHP OOP 中插入查询

标签 php mysql oop

我正在使用 PHP OOP 开发自定义 CMS。基本上我已经制作了一个可以向数据库添加新行的类。

我的类(class):

<?php
class Navigation
{
    private $db;

    public function __construct()
    {
        $this->db = new Connection();
        $this->db = $this->db->dbConnect();
    }

    public function NewMenu($menu_name,$menu_numbers)
    {
        if (!empty($menu_name) && !empty($menu_numbers)) {
            $sql = "INSERT INTO menu_nav "
                . "(menu_name, menu_items) VALUES (?, ?)";
            $ins = $this->db->prepare($sql);

            $ins->bindParam(1,$menu_name);
            $ins->bindParam(2,$menu_numbers);
            $ins->execute();
        } else {
            header("Location: maint/php/includes/errors/009.php");
            exit();
        }
    }
}

这个类工作正常,但问题是我不知道如何检查 menu_name 是否已经存在于表中。如果是,它应该收到错误消息,例如“数据无法插入数据库”。因此,如果您知道如何在 PHP OOP 中执行此功能,请告诉我,因为我确实需要它。

最佳答案

有两种方法可以实现这一点。对于第一种方法,您需要有一个主键/唯一键,这会导致查询失败。将 PDO 设置为在失败时抛出异常,您可以检查“重复键”的异常消息。
为此,您需要更改连接选项,例如 [1]:

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$opt = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
$pdo = new PDO($dsn, $user, $pass, $opt);

然后 pdo::exec() 将抛出一个异常,而不仅仅是返回 false。

第二种方法需要先查询数据库,如果返回0行再插入。这种方法的问题在于它会触发竞争条件。其中,由另一个同时运行的脚本在检查和 INSERT 查询之间插入重复行。

这就是为什么我建议以第一种方式进行。因为无论如何你都需要这样做,以 catch 比赛条件。

PS:作为执行方法 1 的替代方法,您可以在 SQL 查询中使用 ON DUPLICATE KEY。如果您想插入或更新数据。

[1]:从这里复制https://phpdelusions.net/pdo

关于php - 在数据库中不存在行时在 PHP OOP 中插入查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39827574/

相关文章:

PHP从列表构建递归数组

php - 通过 Php 表单创建用户(Bash 脚本)

php - Mysql 第二次 JOIN 返回空数组

c++ - 将类的属性泄露给它的组件

php - "Notice: Undefined variable"、 "Notice: Undefined index"、 "Warning: Undefined array key"和 "Notice: Undefined offset"使用 PHP

php - 在 PHP 中创建基于边缘检测的图像

php mysql对剩余行进行多次循环

swift - 需要一些一般类(class)的建议

oop - 首批第一本丛书中的objectville是什么?

php - 插入到 MYSQL 表中的值与原始值不同