【问题标题】:Custom error message for integrity constraint violation违反完整性约束的自定义错误消息
【发布时间】:2018-07-02 16:29:37
【问题描述】:

当 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}

【问题讨论】:

  • 请分享完整的错误
  • 你在使用命名空间吗?您的意思是使用\PDOException 吗?
  • 为什么你认为错误代码取决于它是哪个迭代?一旦检测到错误,就会抛出错误。 $e-&gt;errorInfo 的实际值是多少?
  • @Ravi 谢谢Fatal error Uncaught exception: 'PDOException' Message: 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '5-1' for key 'franchise_state_id''
  • 请更新为原帖

标签: php mysql pdo sql-insert unique-constraint


【解决方案1】:

违反完整性约束:1062 键的重复条目“5-1” 'franchise_state_id''

表示唯一键违规,franchise_state_id 列不允许重复值。如果在 franchise_state_id 中预期重复值,则需要更改表以从 franchise_state_id 列中删除唯一约束。

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

【讨论】:

  • 我需要约束,因为要使用 foreach 循环更新表,我必须使用 INSERT INTO 而不是 UPDATE。删除约束允许重复。我现在试图解决的问题是该过程的下一步。我想捕捉重复并提醒用户。
  • @JimB814 我没听懂你。所以,基本上,如果条目重复,您想向用户显示?
  • @JimB814 仅供参考,我没有说,您需要update 而不是insert,我说,如果您期望重复,请删除约束。但是,你说,你不希望重复,所以,这个选项现在排除了。
  • 是的,我明白了。我想让你知道进化。这是一个更新功能,但是因为值来自数组 UPDATE 没有工作。它每次都重写更新,以便数组的最后一个元素成为每条记录的值。然后,我尝试开发一个查询来检查这些值是否已经存在,但是我已经编写了太多测试,以至于在继续当前在约束触发错误后显示警报的想法之前,我无法准确回忆失败的地方。如果我可以在错误处停止代码,我可以显示警报。
  • 拉维。我听取了您的建议,删除了约束并编写了验证代码来检查数组 element-franchise_id 对是否已经在数据库中。我这样做了,代码有效。这是一个解决方案,尽管它不是我发布问题时寻求的解决方案。但是,我对这个解决方案非常满意,因为它可以满足我的需要。感谢您抽出宝贵时间查看我的问题以及您的替代解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
  • 2020-01-14
相关资源
最近更新 更多