我正在使用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中执行此功能,请让我知道因为我真的需要它。
答案 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,你会得到线索)