У меня есть хранимая процедура, с помощью которой я пытаюсь вставить некоторые данные в две таблицы, но не хочу вставлять повторяющиеся ключи. Поэтому я написал следующую процедуру с обработкой ошибки 1062: дубликат ключа. Вот код:
DELIMITER $$
CREATE DEFINER=`root`@`localhost`
PROCEDURE `insert_profilo_staff`(IN `id_persona` INT(11) UNSIGNED, IN `id_staff` VARCHAR(15) CHARSET utf8, IN `id_ruolo` VARCHAR(30) CHARSET utf8, IN `id_zona` VARCHAR(15) CHARSET utf8, IN `id_territorio` VARCHAR(15) CHARSET utf8, IN `gerarchia` INT(5) UNSIGNED, IN `ambito_giurisdizionale` VARCHAR(15) CHARSET utf8)
MODIFIES SQL DATA
BEGIN
DECLARE EXIT HANDLER FOR 1062 ROLLBACK;
BEGIN
SIGNAL SQLSTATE '23000' SET MESSAGE_TEXT = "Il profilo che si sta cercando di inserire e' già associato all'utente.";
START TRANSACTION;
IF gerarchia < 10000 THEN
INSERT INTO tb_utenti_profili SET
id = id_persona,
staff = id_staff,
ruolo = id_ruolo,
id_zona = id_zona;
ELSE
INSERT INTO tb_utenti_profili SET
id = id_persona,
staff = id_staff,
ruolo = id_ruolo,
id_zona = id_zona;
INSERT INTO tb_utenti_territori_supervisori SET
id = id_persona,
staff = id_staff,
id_territorio = id_territorio;
END IF;
-- SET @erroreOut = '00000';
COMMIT;
END;
END$$
DELIMITER;
Затем я выполняю процедуру с помощью msqli внутри блока try catch, который вы видите ниже. Но даже если я вставляю в БД несуществующие n-элементы, я всегда получаю ошибку, с которой мне удалось справиться, внутри блока catch. Что не так?
$db_connection = mysqli_connect($db_server, $db_username, $db_password, $db_name);
$is_exception = 0;
try {
$query = "CALL insert_profilo_staff( ?, ?, ?, ?, ?, ?, ? ) ";
$stmt = $db_connection->prepare($query);
$stmt->bind_param("issssis", $inp_id_persona, $inp_id_staff, $inp_id_ruolo, $inp_id_zona, $inp_id_territorio, $inp_gerarchia, $inp_ambito_giurisdizionale);
$inp_id_persona = intval(trim($_POST['id_persona'] ?? ''));
$inp_id_staff = trim($_POST['id_staff'] ?? '');
$inp_id_ruolo = trim($_POST['id_ruolo'] ?? '');
$inp_id_zona = trim($_POST['id_zona'] ?? '');
$inp_id_territorio = trim($_POST['id_territorio'] ?? '');
$inp_gerarchia = intval(trim($_POST['gerarchia'] ?? ''));
$inp_ambito_giurisdizionale = trim($_SESSION['kaikan'] ?? '');
$stmt->execute();
}
catch(Exception $e)
{
error_log( "l eccezione: " . $e->getMessage() );
$is_exception = 1;
error_log( "Call procedure insert_profilo_staff failed ");
error_log( "Stato errore: " . $db_connection->sqlstate . " ");
error_log( "N.ro errore: ". $db_connection->errno . " ");
error_log( "Errore: " . $db_connection->error . " ");
$result = 'error';
$message= "" . $db_connection->error . " ";
$mysql_data = [];
}
finally {
$stmt->close();
$db_connection->close();
$query = "";
}
if ($is_exception == 0)
{
$result='success';
$message='OK';
$mysql_data = [];
}
$data = array(
"result" => $result,
"message" => $message,
"data" => $mysql_data
);
// Convert PHP array to JSON array
$json_data = json_encode($data);
Подробнее здесь: https://stackoverflow.com/questions/784 ... osent-work
Php 8.1 + mysql 5.7: обработчик ошибок в хранимой процедуре не работает ⇐ Php
Кемеровские программисты php общаются здесь
1716513562
Anonymous
У меня есть хранимая процедура, с помощью которой я пытаюсь вставить некоторые данные в две таблицы, но не хочу вставлять повторяющиеся ключи. Поэтому я написал следующую процедуру с обработкой ошибки 1062: дубликат ключа. Вот код:
DELIMITER $$
CREATE DEFINER=`root`@`localhost`
PROCEDURE `insert_profilo_staff`(IN `id_persona` INT(11) UNSIGNED, IN `id_staff` VARCHAR(15) CHARSET utf8, IN `id_ruolo` VARCHAR(30) CHARSET utf8, IN `id_zona` VARCHAR(15) CHARSET utf8, IN `id_territorio` VARCHAR(15) CHARSET utf8, IN `gerarchia` INT(5) UNSIGNED, IN `ambito_giurisdizionale` VARCHAR(15) CHARSET utf8)
MODIFIES SQL DATA
BEGIN
DECLARE EXIT HANDLER FOR 1062 ROLLBACK;
BEGIN
SIGNAL SQLSTATE '23000' SET MESSAGE_TEXT = "Il profilo che si sta cercando di inserire e' già associato all'utente.";
START TRANSACTION;
IF gerarchia < 10000 THEN
INSERT INTO tb_utenti_profili SET
id = id_persona,
staff = id_staff,
ruolo = id_ruolo,
id_zona = id_zona;
ELSE
INSERT INTO tb_utenti_profili SET
id = id_persona,
staff = id_staff,
ruolo = id_ruolo,
id_zona = id_zona;
INSERT INTO tb_utenti_territori_supervisori SET
id = id_persona,
staff = id_staff,
id_territorio = id_territorio;
END IF;
-- SET @erroreOut = '00000';
COMMIT;
END;
END$$
DELIMITER;
Затем я выполняю процедуру с помощью msqli внутри блока try catch, который вы видите ниже. Но даже если я вставляю в БД несуществующие n-элементы, я всегда получаю ошибку, с которой мне удалось справиться, внутри блока catch. Что не так?
$db_connection = mysqli_connect($db_server, $db_username, $db_password, $db_name);
$is_exception = 0;
try {
$query = "CALL insert_profilo_staff( ?, ?, ?, ?, ?, ?, ? ) ";
$stmt = $db_connection->prepare($query);
$stmt->bind_param("issssis", $inp_id_persona, $inp_id_staff, $inp_id_ruolo, $inp_id_zona, $inp_id_territorio, $inp_gerarchia, $inp_ambito_giurisdizionale);
$inp_id_persona = intval(trim($_POST['id_persona'] ?? ''));
$inp_id_staff = trim($_POST['id_staff'] ?? '');
$inp_id_ruolo = trim($_POST['id_ruolo'] ?? '');
$inp_id_zona = trim($_POST['id_zona'] ?? '');
$inp_id_territorio = trim($_POST['id_territorio'] ?? '');
$inp_gerarchia = intval(trim($_POST['gerarchia'] ?? ''));
$inp_ambito_giurisdizionale = trim($_SESSION['kaikan'] ?? '');
$stmt->execute();
}
catch(Exception $e)
{
error_log( "l eccezione: " . $e->getMessage() );
$is_exception = 1;
error_log( "Call procedure insert_profilo_staff failed ");
error_log( "Stato errore: " . $db_connection->sqlstate . " ");
error_log( "N.ro errore: ". $db_connection->errno . " ");
error_log( "Errore: " . $db_connection->error . " ");
$result = 'error';
$message= "" . $db_connection->error . " ";
$mysql_data = [];
}
finally {
$stmt->close();
$db_connection->close();
$query = "";
}
if ($is_exception == 0)
{
$result='success';
$message='OK';
$mysql_data = [];
}
$data = array(
"result" => $result,
"message" => $message,
"data" => $mysql_data
);
// Convert PHP array to JSON array
$json_data = json_encode($data);
Подробнее здесь: [url]https://stackoverflow.com/questions/78479959/php-8-1-mysql-5-7-error-handler-in-stored-procedure-dosent-work[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия