elena180607
Здравствуйте, уважаемые специалисты. На сайте есть раздел, где пользователь вводит указанные данные и жмет «сохранить». Данные записываются в data.csv файл. Реализован код так, как в примере ниже. Незадача в том, что с некоторых пор первое поле стало игнорироваться (не записывается), а в логах появляется ошибка [15-Mar-2021 09:44:40 UTC] PHP Notice: Undefined index: field1 in /home/site/public_html/fdata/posted.php on line 7. Ранее все было ОК.
Что характерно, когда самостоятельно тестирую — данные записываются. Если пользователь нажимает на «сохранить» — первое поле не сохраняется, а остальные — нормально…
В файле posted.php значение field1 указано. Ткните носом пожалуйста, только доступно, если можно, а то я слабо разбираюсь в вопросе…form.html
HTML:
<?php session_start(); ?> <form> <input type=«text» onchange=«Saveme(‘field1’, this.value); checkme()» inputmode=«numeric» /> <input type=«text» onchange=«Saveme(‘field2’, this.value); checkme()» inputmode=«numeric» /> <select onchange=«Saveme(‘field3’, this.value);»> </select> </form> <script> function Saveme(name, value) { $.ajax({ type: «POST», url: «/saver.php», data: { ‘GO-Function’: «Saveme», ‘name’: name, ‘value’: value } }); } $(«#pushme»).click(function() { $.ajax({ type: «POST», url: «/posted.php» }); }); </script>posted.php
PHP:saver.php
PHP:
twim32
Возможно стоят неправильные события на кнопках. Не ‘onchange’, a ‘onclick’.
И заблокируйте основной триггер клика по кнопке через event.preventDefault()
elena180607
‘onchange’ указаны на полях ввода данных (это не кнопки). Так или иначе, вы имееете ввиду попробовать вот так:
PHP:
<input type=«text» onclick=«Saveme(‘field1’, this.value); checkme()» inputmode=«numeric» />+
Так?
PHP:
<button id=«pushme» onClick={e => e.preventDefault()}>сохранить</button>
twim32
Простите, с текстовыми полями я написал какую-то ахинею.
Сегодня налил кофе и вот что вышло: Ваш код ругается на то что в фаиле posted.php (строка 7) не определён ключ ‘field1’ в массиве $_SESSION. Из-за чего это может произойти? Тут вариантов несколько:
— Юзер не заполнил одно из полей
— При нажатии на кнопку «pushme» посылается аякс запрос, но так же идет сабмит всей формы так как никто его не отменил.
— Событие «onchange» срабатывает только после того, как элемент был изменен и потерял фокус. Таким образом, если никто не менял значение выпадающего списка, то оно и не сохраниться в сессии.Я бы посоветовал отказаться от сессий и использовать проверку ввода пользовательских данных перед отправкой:
form.php
HTML:
<?php session_start(); ?> <form> <input type=«number» name=«field1» inputmode=«numeric» /> <input type=«number» name=«field2» inputmode=«numeric» /> <select name=«field3» > </select> </form> <script> function validate(data) { // Фильтруем пустые поля let empty = data.filter((input) => { return input.value.trim() === »; }); // Отправляем true/false если есть пустые поля return empty.length === 0; } $(document).ready(() => { $(«form»).submit(function(event) { event.preventDefault(); // Блокируем дефолтное выполнение кнопки let form = $(this); let data = form.serializeArray(); if( validate(data) === true) { $.ajax({ type: «POST», url: «posted.php», success: function(response) { alert(‘Данные сохранены’); form.trigger(‘reset’); // Очищаем форму от старых данных } }); } else { alert(‘Заполните все поля’); } }); }) </script>1. функция checkme() не существует.
2. Обязательно добавляйте аттрибут «name» к полям формы, везде.
3. Проверяйте абсолютно всё: свой код и пользовательский ввод
4. Писать JS в HTML (например «onclick=…») — это фу!
elena180607
Я сколько не пью — не получается, может дел не в кофе)) По сути — благодарю вас, что нашли время вникнуть. Касательно «Юзер не заполнил одно из полей» и «если никто не менял значение выпадающего списка, то оно и не сохраниться» — врядли, поскольку юзер не может нажать кнопку ДО заполнения ВСЕХ полей (кнопка неактивна), используется функция checkParams(), я ее не внесла в код, чтобы код легче воспринимался. Прошу прощения, видно надо было…
На счет «посылается аякс запрос, но так же идет сабмит всей формы» — Здесь нужно от чего-то отказаться/что-то исключить? Возможно, здесь конфликт.Все еще не могу понять, почему первое поле игнорируется, а остальные записываются. Повторюсь, когда сама проверяю — записываются все поля. Смотрела в сторону прав на папки-файлы, но если бы были проблемы с правами, не записывалось бы ничего…
Свои <input name=»…»/> и <select name=»…» > ко всем полям и селектам добавила.