违反完整性约束的自定义错误消息

Custom error message for integrity constraint violation

关于当 INSERT INTO 包含 foreach 循环时如何为违反完整性约束创建自定义错误消息的任何想法?

$states is an array;
$franchise_id is an integer;

查询:

public static function update($franchise_id, $states)
{

    try
    {
        // establish db connection
        $db = static::getDB();

        $sql = "INSERT INTO franchise_states SET
                state_id     = :state_id,
                franchise_id = :franchise_id";
        $stmt = $db->prepare($sql);
        foreach($states as $state)
        {
            $stmt->execute([':state_id' => $state, ':franchise_id' => $franchise_id]);
        }
        return $stmt;
    }
    catch (PDOException $e)
    {
       echo "Error updating franchise data: " . $e->getMessage();
       exit();
    }
}

我想添加这样的内容--

echo '<script>';
echo 'alert("State already included.")';
echo '</script>';

--这样用户可以保持在同一页面上。

catch 块中的解决方案如下:

if ($e->errorInfo[1] == 23000) {
    ....
}

不工作。可能是因为在循环第一次迭代后抛出错误。

这也不是:

foreach($states as $state)
{
    $result = $stmt->execute([':state_id' => $state, ':franchise_id' => $franchise_id]);
    if (!result) 
    {
        ...
    }    
}    

当循环运行它的第一次迭代时,它似乎遇到了约束冲突,所以之后的代码没有被执行。不确定这是否是实际发生的事情。

看来必须可以插入自定义错误消息。如果有人知道怎么做,我将不胜感激。

错误:

Fatal error
Uncaught exception: 'PDOException'

Message: 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '5-1' for key 'franchise_state_id''

Stack trace:

#0 C:\xampp\htdocs\agt\App\Models\Franchise_state.php(69): PDOStatement->execute(Array)
#1 C:\xampp\htdocs\agt\App\Controllers\Admin\Franchisors.php(336): App\Models\Franchise_state::update('5', Array)
#2 C:\xampp\htdocs\agt\Core\Router.php(206): App\Controllers\Admin\Franchisors->update()
#3 C:\xampp\htdocs\agt\public\index.php(162): Core\Router->dispatch('admin/franchiso...')
#4 {main}

Integrity constraint violation: 1062 Duplicate entry '5-1' for key 'franchise_state_id''

表示违反唯一键,franchise_state_id列不允许重复值。如果 franchise_state_id 中需要重复值,那么您需要更改 table 以从 franchise_state_id 列中删除唯一约束。

但是,如果它希望存储唯一值,那么您需要对应用程序进行更改以确保您不会传递重复条目(验证条目是否已从数据库中存在)。