在PHP OOP中插入查询而DB中不存在行

时间:2016-10-03 08:42:06

标签: php mysql oop

我正在使用PHP OOP开发自定义CMS。基本上我已经创建了一个可以向db添加新行的类。

我的班级:

<?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。如果是,它应该收到错误消息&#34;数据无法插入db&#34;例如。因此,如果您知道如何在PHP OOP中执行此功能,请让我知道因为我真的需要它。

2 个答案:

答案 0 :(得分:2)

有两种方法可以实现。对于第一种方法,您需要拥有主/唯一密钥,这会导致查询失败。将PDO设置为在故障时抛出异常,您可以检查&#34;重复密钥&#34;的例外消息。 要做到这一点,您需要更改连接选项,如[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查询之间插入重复行,由另一个同时运行的脚本插入。

这就是我推荐第一种方式的原因。无论如何你都需要这样做才能赶上比赛条件。

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

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

答案 1 :(得分:0)

因此您应该检查表中是否存在行,并且仅在行不存在时插入数据(如果我正确理解您的问题)。首先选择具有给定菜单名称$ins = $this->db->prepare("SELECT FROM menu_nav (menu_name, menu_items) VALUES (?, ?)");的行,然后检查是否有任何数据。去here,你会得到线索)