代码之家  ›  专栏  ›  技术社区  ›  JimB814

完整性约束冲突的自定义错误消息

  •  0
  • JimB814  · 技术社区  · 6 年前

    当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 block中的解决方案如下:

    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}
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Ravi    6 年前

    完整性约束冲突:密钥的1062个重复条目“5-1” '特许经营权\u状态\u id''

    表示唯一密钥冲突,以及 franchise_state_id 列不允许重复值。如果中需要重复值 特许经营权\u状态\u id ,则需要更改表以从中删除唯一约束 特许经营权\u状态\u id

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