Всем привет, вы наверное знаете как динамически без перезагрузки страницы оповестить об успешной или ошибочной обработки формы, например вывести что произошла ошибка, поле не заполнено и т.д. Вот я хочу узнать как это все делается, php знаю на уровне новичка с javaScript когда то 2 или 3 функции писал но уже тупо его забыл. Вы бы не могли мне помочь подкрепить знания и порекомендовать что либо и освоится в данном языке. Буду признателен если будете в эту тему кидать свой код с подробным описанием.
@romach Спасибо, смотреть буду и применять) Обрабатывать ошибки могу только при помощи php))) --- Добавлено --- @romach Привет мир уже посмотрел alert я уже понял что выводит сообщения)
https://github.com/MouseZver/uaekrpngshr только в ajax изменить click AS submit / a.AJAX AS form --- Добавлено --- немного устарел алгоритм и место filter_var можно использовать filter_input_array а в 14 строке надо было -> rowCount() > 0
@MouseZver а как же обработка ошибок, чтобы ошибка открывалась в этом же окне, что и форма под каждым inputom: Например: Введите name юзер не ввел имя и ему под этим input вывелось, вы не ввели имя.
Это самому дописывать надо. Тут же учат и помогают чем могут, примерами / по возможности готовыми скриптами. На гитхабе наброски вполне рабочие. Хоть и корявые, смотрю сейчас.
@MouseZver ты меня не понял, я хожу вывести под каждым input соответствующую ошибку, чтобы стр не перезагружалась, такого можно добиться что ли только ajax или же javascript тоже в помощь? За пример огромное спасибо уже тестирую его.
@MouseZver что правда, ajax и js это один язык что ли, блин мне заморочили голову, в инете... Смотрел инфу кто то объяснял что если хочешь программировать на ajax нужно выучить js то что без него не как( И что ж делать? 10 стр прочитал про js в принципе не чем не отличается от php правда переменные там по другому вводятся ну и вывод данных по другому делается.
@MouseZver Протестировал пример, и что то мне подсказывает что я не чего не понял в файле ajax.js просто 2 строки расписаны жаль конечно. Пойду читать дальше от г до я первую половину прочитал просто
только что для своего сайта написал --- Добавлено --- Код (Javascript): $(function ( menu, num_menu, i ) { function EngineMenuClose() { $( '#ACCOUNT-MENU' ).animate({ left: -288 }); setTimeout( function () { $( '#ACCOUNT-MENU' ).empty(); menu = false; }, 500 ); } $( 'body' ).on( 'mouseenter', '#ENGINE-USER-MENU', function () { if ( menu && num_menu != 'USER' ) { EngineMenuClose(); } setTimeout( function () { if ( menu !== true ) { menu = true; num_menu = 'USER'; $( '#ACCOUNT-MENU' ).append( '<div class="U-MENU-PRIMARY">' + '<a class="AVATAR" href="#"><img src="/styles/test/img.jpg"></a>' + '<h3><a href="/u/MouseZver" title="Посмотреть Ваш профиль">MouseZver</a></h3>' + '<div>Активный пользователь</div>' + '<h4><a href="/u/MouseZver">Страница профиля</a></h4>' + '</div>' ) $( '#ACCOUNT-MENU' ).animate({ left: 10 }); } }, 500 ); }) .on( 'mouseenter', '#ENGINE-NOTICE-MENU', function () { if ( menu && num_menu != 'NOTICE' ) { EngineMenuClose(); } setTimeout( function () { if ( menu !== true ) { menu = true; num_menu = 'NOTICE'; $( '#ACCOUNT-MENU' ).append( '<div class="U-MENU-PRIMARY">' + '<div class="LIST-NOTICES">Капуста</div>' + '</div>' ) $( '#ACCOUNT-MENU' ).animate({ left: 10 }); } }, 500 ); }) if ( menu ) { $( document ).mousedown( function ( e ) { EngineMenuClose(); }); } $( 'body' ).on( 'submit', 'form', function ( e ) { e.preventDefault(); var obj = new FormData( $( this ).get(0) ); $.ajax( { url: $( this ).attr( 'action' ), type: $( this ).attr( 'method' ), contentType: false, processData: false, data: obj, dataType: 'JSON', success: function ( json ) { if ( json.REDIRECT != undefined ) { window.location.href = json.REDIRECT; } if ( json.MSGERROR != undefined ) { $( '.errorPanel' ).remove(); $( '.RAY_WRAPPER_REGISTER' ).prepend( '<div class="errorPanel"></div>' ); i = 1; $.each( json.MSGERROR, function ( index, value ) { $( '.errorPanel' ).append( '<p>' + i++ + ') ' + value + '</p>' ); }); } } }); }); }); --- Добавлено --- PHP: <?php namespace Page\register; use Application\System\Mouse\SQL; class init extends \Engine { public static function StaticInit() { self::$DOCUMENT_STYLE = 'register'; self::_( 'SET_PAGE_TITLE', self::$RAY['PAGE']['register']['TITLE'] ); if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) { header ( 'Content-type: application/json' ); self::RegisterAccount(); } else { setcookie ( 'REGISTER', $_SERVER['REQUEST_TIME'] ); } } public static function RegisterAccount() { $ARGS = [ 'username' => [ 'filter' => FILTER_VALIDATE_REGEXP, 'options' => [ 'regexp' => '/^[A-Za-z0-9_-]{3,25}$/' ] ], 'email' => FILTER_VALIDATE_EMAIL, 'password' => FILTER_UNSAFE_RAW, 'confirm_password' => FILTER_UNSAFE_RAW ]; $INPUTS = filter_input_array ( INPUT_POST, $ARGS ); $E = []; if ( $INPUTS['username'] === FALSE || $INPUTS['username'] === NULL ) { if ( $INPUTS['username'] === NULL ) { $E['username'] = 'Undefined username :('; } else { $E['username'] = 'Пожалуйста, введите имя, содержащее от 3-х до 25 латинских символов.'; } } elseif ( SQL::P( 'SELECT ID FROM USRACCOUNT WHERE lower ( USERNAME ) = ?', [ strtolower ( $INPUTS['username'] ) ] ) -> rowCount() > 0 ) { $E['username'] = 'Введенное имя уже используется.'; } if ( $INPUTS['email'] === FALSE || $INPUTS['email'] === NULL ) { if ( $INPUTS['email'] === NULL ) { $E['email'] = 'Undefined email :('; } else { $E['email'] = 'Адрес электронной почты должен быть валидным.'; } } elseif ( SQL::P( 'SELECT ID FROM USRACCOUNT WHERE lower ( EMAIL ) = ?', [ strtolower ( $INPUTS['email'] ) ] ) -> rowCount() > 0 ) { $E['email'] = 'Введенная почта уже используется.'; } if ( $INPUTS['password'] === NULL || empty ( $INPUTS['password'] ) ) { if ( $INPUTS['password'] === NULL ) { $E['password'] = 'Undefined password :('; } else { $E['password'] = 'Пожалуйста, введите пароль.'; } } elseif ( $INPUTS['password'] != $INPUTS['confirm_password'] ) { $E['password'] = 'Введенные пароли не совпадают.'; } # errors count if ( count ( $E ) == 0 ) { SQL::P( 'INSERT INTO USRACCOUNT ( USERNAME, EMAIL, PASSWORD, STATUS, DATAREG, LASTONLINE ) VALUES ( ?,?,?,?,?,? )', [ $INPUTS['username'], $INPUTS['email'], password_hash ( $INPUTS['password'], PASSWORD_DEFAULT ), 1, $_SERVER['REQUEST_TIME'], $_SERVER['REQUEST_TIME'] ] ); $UID = SQL::lastInsertId(); $SID = md5 ( $UID . $_SERVER['REQUEST_TIME'] . $_SERVER['REMOTE_ADDR'] ); SQL::P( 'INSERT INTO SESSREM ( SID, UID, TIMEOUT ) VALUES ( ?,?,? )', [ $SID, $UID, strtotime ( '+30 day' ) ] ); echo self::_( 'JSON', [ 'REDIRECT' => '/?' . $INPUTS['username'] ] ); } else { echo self::_( 'JSON', [ 'MSGERROR' => $E ] ); } exit; } } --- Добавлено --- 75 строке место empty === FALSE --- Добавлено --- а не... все правильно.. string(0) '' возращает
Код (Text): Лимит времени (20 мин.) на редактирование этого сообщения истёк. нееееее там условия переделать нид --- Добавлено --- Код (Text): 1) Undefined username :( 2) Undefined email :( 3) Undefined password :(
@MouseZver Классный код, мне твой стиль программирования нравится) в данный момент для меня, код где понятен где нет, и затрудняюсь его легко читать) особенно js, ajax. За попытку мне помочь, спасибо)
если просто, то ajax это технология, есть разные реализации, одна из них это "библиотека" XMLHttpRequest доступная из javascript, ещё есть fetch например, вот JQuery сделали удобную обёртку над XMLHttpRequest
@_ne_scaju_ да, можно. Но обычно от сервера запрашивают только те подсказки, которые нельзя проверить на клиенте, например свободен ли логин или используется на сайте уже такая почта, всё дублировать на сервере обязательно.
@denis01 На php я знаю как вывести эти подсказки делаю запрос и потом делаю проверку, а с js + php как можно все это оперировать вместе?
@_ne_scaju_ тебе нужно отследить изменение в input, есть onchange или onkeyup + лучше задержку делать, как данные в форме изменились, то ты делаешь запрос в PHP с передачей данных, проверяешь и возвращаешь результат проверки, например в json так как его в PHP легко составить и прочитать в js, на основе результата в js показываешь сообщение, можно сделать видимым div с сообщением например
@denis01 мне бы увидеть как взаимодействует JS с php и формой на самом элементарном примере, чтобы я понял)
@denis01 Спасибо, сейчас взгляну. --- Добавлено --- @denis01 протестировал) но не понял принцип работы, из-за того что вы выводите все в var_damp(); я увидел только то что без перезагрузки страницы приходят данные) и это именно то что я хочу)))
@denis01 можно задам не скромный вопрос, написал регистрацию, с полями login, email, pass. Но теперь решил добавить еще поля пол человека, дату рождения. В чем суть заключается, я в базе дату рождения разделил на три поля day, month, year и а HTML названия месяцев я записываю так: HTML: <select id="month" name="month" class=""> <option>Месяц рождения</option><option value="1">Января</option><option value="2">Февраля</option><option value="3">Марта</option><option value="4">Апреля</option> <option value="5">Мая</option><option value="6">Июня</option><option value="7">Июля</option><option value="8">Августа</option><option value="9">Сентября</option> <option value="10">Октября</option><option value="11">Ноября</option><option value="12">Декабря</option> </select> Как можно уменьшить эту писанину? решения было вот такое: PHP: for(i=0; i<=12; i++){ echo i; } но мне не подходит так как выводятся одни цифры а надо названия месяца выводить пробовал массив месяцев сделать но не получилось у меня... Как это организовать правильно?
Можно в базе хранить в одном столбце, есть же datetime. Массив и цикл, так что направление правильное PHP: <?php $days = ['Пн', 'Вт', 'Ср',]; foreach($days as $key => $day) { ?> <option value="<?=$key?>"><?=$day?></option> <?php } так var_dump просто помогает выводить массив, https://secure.php.net/manual/ru/language.types.array.php
@denis01 я знаю что можно в datetime хранить, я просто решил так хранить день рождения) я такой массив создавал но хотел вывести через for но не получалось(, точно foreach массивчик вывести можно, отлично буду пробовать так сделать спасибо) а на счет года так же сделать? Я вывожу его от 1940 до 2017 и все это в ручную по принципу месяца делал, но запись получается еще больше, тоже как то через foreach или же как то через for() можно сделать и как лучше вывести?