我正在使用 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/