Добрый день всем, подскажите имеется данный код
|
1 |
<form class="subscribe" id="subscribe" method="POST" action="subscribe.php"> <p>Подписка на информационную рассылку</p> <div class="inputs"> <div class="d-flex"> <input class="form-control" type="email" name="email" id="email" required placeholder="Email"> <button class="btn" type="submit" name="submit_form" value="submit"> <img src="/newdev/images/arrow-submit.svg" alt=""> </button> </div> </div> <div class="success" style="display: none;">Вы успешно подписаны</div> </form> |
|
1 |
if(isset($_POST['email'])) { $email = $_POST["email"]; $query_result = db::i()->query("INSERT INTO s_mailer_list (added,email,cats) VALUES (NOW(),'$email',',С сайта,')"); } |
вот сообщение выводится для успешной подписки так
|
1 |
$('#subscribe').on("submit", function (e) { e.preventDefault(); var $target = $(e.currentTarget); var $inputs = $($target.find('.inputs')); var $success = $($target.find('.success')); $.post(e.currentTarget.action, $target.serialize(), function (data, status) { if (status === 'success') { $inputs.hide(); $success.show(); } }) }); |
как можно вывести сообщение " пользователь с таким емейлом уже есть в базе"
колонка email unique
выдает при дубликате в браузере -
|
1 |
array(3) { ["message"]=> string(94) "SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'p@p.ru' for key 'email'" ["function"]=> string(5) "query" ["sql"]=> string(86) "INSERT INTO s_mailer_list (added,email,cats) VALUES (NOW(),'p@p.ru',',С сайта,')" } |
Дополнительно:
Содержание
как можно сделать обработку на повторяющийся email если таков есть в базе, с выводом ошибки
Надо создать уникальный индекс по этому полю в структуре таблицы. Тогда выполнение INSERT приведёт к ошибке, которая отлавливается на стороне PHP.
|
1 |
array(3) { ["message"]=> string(94) "SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'p@p.ru' for key 'email'" ["function"]=> string(5) "query" ["sql"]=> string(86) "INSERT INTO s_mailer_list (added,email,cats) VALUES (NOW(),'p@p.ru',',С сайта,')" } |
а как ее можно вывести для людей ? не могу разобраться, это я только в браузере вижу в консоле
Ответы:
ChatGPT на что?
Необходимо изменить запрос на добавление данных в базу, чтобы он не вызывал ошибку при дубликате, а вместо этого возвращал информацию о том, что пользователь с таким емейлом уже существует. Для этого можно использовать конструкцию INSERT IGNORE или INSERT ... ON DUPLICATE KEY UPDATE.
Пример с использованием INSERT IGNORE:
|
1 |
if (isset($_POST['email'])) { $email = $_POST["email"]; $query_result = db::i()->query("INSERT IGNORE INTO s_mailer_list (added, email, cats) VALUES (NOW(), '$email', ',С сайта,')"); if ($query_result) { // Пользователь успешно добавлен echo "success"; } else { // Пользователь с таким емейлом уже существует echo "duplicate"; } } |
или просто try...catch:
|
1 |
if (isset($_POST['email'])) { $email = $_POST["email"]; try { $query_result = db::i()->query("INSERT INTO s_mailer_list (added, email, cats) VALUES (NOW(), '$email', ',С сайта,')"); // The query was successful, so the user is subscribed. echo "success"; } catch (Exception $e) { // Check if the exception is related to a duplicate entry for the 'email' column. if ($e->getCode() === 23000) { // This code represents a MySQL duplicate key error (Integrity constraint violation). // Handle the case when the email is already in the database. echo "duplicate"; } else { // Handle other exceptions if needed. echo "error"; } } } |
Дальше JS сам, думаю, допишешь.
- Доброй ночи! спасибо! а почему может быть такое когда вписываю email любой который есть в бд или нет , выдает success? попробовал оба метода
- Night386, потому что перед добавлением лучше проверять существование такой записи. И выводить ошибку, если запись уже существует. А INSERT IGNORE - плохая практика, положительный результат при отсутствии результата. Тем более INSERT ... ON DUPLICATE KEY UPDATE - черезвычайно плохая практика, можно поменять/поломать подписки всем пользователям, почтовые ящики которых известны.
P.S. А полное отсутствие защиты от SQL Injections - за такое розгами надо пороть. Прилюдно.
- AUser0, я понял, только как это все сделать ?)
- AUser0, попробовал вот так опять пишет запись существует и не добавляет другие записи теперь
PHP1if(isset($_POST['email'])) { $email = $_POST["email"]; $check = db::i()->query("SELECT * FROM s_mailer_list WHERE email = '".$email."'"); if($check != null) {echo "Запись уже существует";} else { $sql = db::i()->query("INSERT INTO s_mailer_list (added,email,cats) VALUES (NOW(),'$email',',С сайта,')"); echo "OK"; } }
- Night386, а вы проверяли, чему равно $check при наличии/отсутствии записи в БД? Там точно null либо не null?
Не добавляет другие записи? Вам нужно добавит несколько записей?
- AUser0, вот так я еще раз попробовал , если запись имеется то check выдает true , если нет записи то пишется в базу, но уведомления и что есть запись что нет - success
PHP1if (isset($_POST['email'])) { $email = $_POST["email"]; $check = db::i()->query("SELECT EXISTS(SELECT `email` FROM `s_mailer_list` WHERE `email` = '".$email."' LIMIT 1) AS exist"); try { $query_result = db::i()->query("INSERT INTO s_mailer_list (added, email, cats) VALUES (NOW(), '$email', ',С сайта,')"); // The query was successful, so the user is subscribed. echo "success"; } catch (Exception $e) { // Check if the exception is related to a duplicate entry for the 'email' column. if ($e->getCode() === 23000) { // This code represents a MySQL duplicate key error (Integrity constraint violation). // Handle the case when the email is already in the database. echo "duplicate"; } else { // Handle other exceptions if needed. echo "error"; } } }
- Night386, поздравляю, у вас нет проверки на наличие записи. Вне зависимости от результата SELECT у вас выполняется код в try{}, и если там произошла ошибка и db::i()-&query() выкинуло Exception - выполнится catch{}. $check ни где не проверяется, можете удалить SELECT - ничего не поменяется, гы-гы-гы!
- AUser0, а как можно сделать такую проверку? не подскажете? уже столько вариантов перепробовал(
- Night386, так напрягитесь и узнайте точное содержимое $check при наличии и отсутствии записи в Базе Данных. От этого и пляшите.
- AUser0, понял , пока не получилось конечно, может не те условия пишу как то
- Night386, как-то напрягитесь и узнайте точное содержимое $check при наличии и отсутствии записи в Базе Данных. Это не просто, но это надо сделать, как-то собраться и как-то напрячься.
- AUser0, когда запись есть $check выдает true , когда нету тоже самое тру
- Night386, ну вот, уже конкретный результат. Теперь смотрите другие запросы, из которых нормально вытаскиваются данные - и повторяйте весь алгоритм здесь, проверяйте возвращаемое значение
emailна не пустоту, и т.д. - AUser0, спасибо! буду пробовать
Для решения данной проблемы вы можете воспользоваться услугами фрилансеров. Мы выполним необходимую работу быстро и качественно.
Оставить комментарий Отменить
Ответы
- Есть ответ! к записи Как уменьшить масштаб меньше 100% в Windows 10 (22H2)
- Есть ответ! к записи Аналоги CloudFlare в России?
- Есть ответ! к записи Аналоги CloudFlare в России?
- Есть ответ! к записи Как называется человек, который дизайн придумает для сайта и сверстает его?
- Есть ответ! к записи Можно ли установить Яндекс.Диск на АльтЛинукс?
- Есть ответ! к записи Картинки мутные только на сафари, есть выход?
- Есть ответ! к записи Keenetic. Как настроить SSTP клиент с сертификатом?
- Есть ответ! к записи Чем заменить executor в aiogram 3?
Для вывода сообщения об ошибке в PHP можно использовать функцию
echoилиprint, а также функциюdie()илиexit(). Например, если у вас есть переменная, содержащая текст ошибки, вы можете вывести ее на экран следующим образом:Если вы хотите завершить выполнение скрипта после вывода сообщения об ошибке, то можно использовать функцию
die()илиexit(). Например:Это простой способ вывести сообщение об ошибке на экран и остановить выполнение скрипта. Однако, для более сложных сценариев работы с ошибками рекомендуется использовать конструкцию
try...catchдля обработки исключений. Вот пример использования:Этот код позволяет перехватить и обработать исключение, выведя сообщение об ошибке на экран. Такой подход более гибкий и позволяет более детально управлять ошибками в вашем коде.