#php #html #ajax
Вопрос:
У меня есть html-форма и скрипт ajax, который отправляет ее без обновления страницы, у меня также есть проверка того, что две одинаковые даты публикации не попадают в базу данных, но когда я нажимаю «Отправить», он все равно пишет «форма была отправлена», помогите мне это исправить
Вот мой сценарий
lt;htmlgt; lt;headgt; lt;script src="http://code.jquery.com/jquery-1.9.1.js"gt;lt;/scriptgt; lt;scriptgt; $(function () { $('#my_form').on('submit', function (e) { e.preventDefault(); $.ajax({ type: 'POST', url: '/main/store', data: $('#my_form').serialize(), success: function () { alert('form was submitted'); } }); }); }); lt;/scriptgt; lt;/headgt;
Комментарии:
1. Это проблема с кодом на стороне сервера-вывод в клиенте зависит от того, что вы отправляете обратно с сервера. Если есть дубликат отправьте ответ, в результате которого обратный вызов ajax отобразит другое сообщение
2. Я хотел знать, как создать условие для отображения сообщения в ajax, если запись уже существует
3. Я понимаю, что вы хотите сделать — я предлагаю вам отправлять разные ответы из вашего PHP-скрипта (
/main/store
) на основе результатов проверки даты. Затем измените обратный вызов (обратный вызов ajax), чтобы обработать эти данные ответа и, таким образом, контролировать, что являетсяalerted
для пользователя4. Хорошо, я постараюсь, спасибо
5. Если вы добавите PHP-код, который проверяет дату, вам будет легче показать подход, который я пытался описать
Ответ №1:
Не зная данных, которые вы отправляете в запросе ajax, или того, как вы обрабатываете запрос на сервере, вам нужно будет адаптировать следующий полу-псевдокод в соответствии с вашими потребностями или просто разработать собственное решение, используя некоторые из них.
По сути, обратный вызов ajax должен получать данные с сервера. В вашем коде обратный вызов не содержит аргументов — добавьте переменную, success: function () {...
аналогичную success: function(r) {...
, чтобы ответ от сервера теперь был назначен r
С помощью этого ответа вы теперь можете отображать пользователю другое сообщение, основанное на значении r
. Например:
lt;?php /**************** /main/store */ if( $_SERVER['REQUEST_METHOD']=='POST' ){ require 'dbconn.php'; /* example pseudo function to test date */ function date_is_duplicate( $date ){ global $db; // your db connection variable $sql='select * from `TABLE` where `DATEFIELD`=?'; $stmt=$db-gt;prepare( $sql ); $stmt-gt;bind_param('s',$date); $stmt-gt;execute(); $stmt-gt;store_result(); $rows=$stmt-gt;num_rows; $stmt-gt;free_result(); $stmt-gt;close(); /* ..... etc, etc, etc and return a value to be used in ajax callback If there are ZERO rows send ZERO as response - or more than ZERO means duplicate */ return $rows; } /* Do the Duplicate Date search tests */ $result=date_is_duplicate( $_POST['date'] ); if( $result ) exit( $result ); else{ /* do other exciting things - add to db etc etc but SEND a response to the ajax callback so that it can display the correct message. send ZERO as response. */ } } ?gt;
А затем модифицированный javascript, содержащий переменную ответа, которая помогает развить логику программы:-
$(function(){ $('#my_form').on('submit', function(e){ e.preventDefault(); $.ajax({ type: 'POST', url: '/main/store', data: $('#my_form').serialize(), success:function(r) { let message='OK, form was submitted'; if( Number(r)===1 )message='Bogus, duplicate date detected'; alert(message); } }); }); });
Гораздо более надежной структурой данных для отправки обратно был бы JSON, а не одно целое число — это было поспешно собрано вместе, чтобы проиллюстрировать концепцию. С помощью JSON вы можете создать более сложное решение