【发布时间】: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->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