Пользовательское сообщение об ошибке для нарушения целостности

Любые идеи о том, как создать пользовательское сообщение об ошибке для нарушения ограничения целостности, когда 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}

0

Решение

Нарушение ограничения целостности: 1062 Дублирующая запись ‘5-1’ для ключа
‘Franchise_state_id’»

Указывает на нарушение уникального ключа и franchise_state_id столбец не допускает повторяющихся значений. Если ожидается повторяющееся значение в franchise_state_id, то вам нужно изменить таблицу, чтобы удалить уникальные ограничения из franchise_state_id колонка.

Но, если ожидается сохранение уникального значения, необходимо внести изменения в приложение, чтобы убедиться, что вы не пропустите повторяющуюся запись (проверьте, если запись уже существует из базы данных).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]