Undefined index (не записывается поле)

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:
  1. <?php
  2. session_start();
  3. ?>
  4.  
  5. <script src=«https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js»></script>
  6.  
  7.     <input type=«text» onchange=«Saveme(‘field1’, this.value); checkme()» inputmode=«numeric» />
  8.     <input type=«text» onchange=«Saveme(‘field2’, this.value); checkme()» inputmode=«numeric» />
  9.  
  10.     <select onchange=«Saveme(‘field3’, this.value);»>
  11.         <option value=«test1»>опция1</option>
  12.         <option value=«test2»>опция2</option>
  13.      </select>
  14.  
  15.     <button id=«pushme»>сохранить</button>
  16. </form>
  17.  
  18.     function Saveme(name, value) {
  19.         $.ajax({ type: «POST», url: «/saver.php»,
  20.             data: { ‘GO-Function’: «Saveme», ‘name’: name, ‘value’: value }
  21.         });
  22.     }
  23.     $(«#pushme»).click(function() {
  24.         $.ajax({ type: «POST», url: «/posted.php»
  25.         });
  26.     });

posted.php

PHP:
  1. <?php
  2. ?>
  3.  
  4. <?php
  5. $list = array (
  6.     array($_SESSION[«field1»], $_SESSION[«field2»], $_SESSION[«field3»])
  7. );
  8. $fp = fopen(‘data.csv’, ‘a+’);
  9. foreach ($list as $fields) {
  10.     fputcsv($fp, $fields, ‘-‘, ‘—’);
  11. }
  12. fclose($fp);
  13. ?>

saver.php

PHP:
  1. <?php
  2. header(‘Content-type: text/html; charset=UTF-8’);
  3. if($_SERVER[‘HTTP_X_REQUESTED_WITH’] != «XMLHttpRequest») {exit;}
  4. if(!isset($_POST[‘GO-Function’])) {exit;}
  5.  
  6. if($_POST[‘GO-Function’] == «Saveme») {
  7.     $_SESSION[$_POST[«name»]] = $_POST[«value»];
  8.     exit;
  9. }
  10. ?>
 

twim32

Возможно стоят неправильные события на кнопках. Не ‘onchange’, a ‘onclick’.
И заблокируйте основной триггер клика по кнопке через event.preventDefault()

 

elena180607

‘onchange’ указаны на полях ввода данных (это не кнопки). Так или иначе, вы имееете ввиду попробовать вот так:

PHP:
  1. <input type=«text» onclick=«Saveme(‘field1’, this.value); checkme()» inputmode=«numeric» />

+

Так?

PHP:
  1. <button id=«pushme» onClick={e => e.preventDefault()}>сохранить</button>
 

twim32

Простите, с текстовыми полями я написал какую-то ахинею.

Сегодня налил кофе и вот что вышло: Ваш код ругается на то что в фаиле posted.php (строка 7) не определён ключ ‘field1’ в массиве $_SESSION. Из-за чего это может произойти? Тут вариантов несколько:
— Юзер не заполнил одно из полей
— При нажатии на кнопку «pushme» посылается аякс запрос, но так же идет сабмит всей формы так как никто его не отменил.
— Событие «onchange» срабатывает только после того, как элемент был изменен и потерял фокус. Таким образом, если никто не менял значение выпадающего списка, то оно и не сохраниться в сессии.

Я бы посоветовал отказаться от сессий и использовать проверку ввода пользовательских данных перед отправкой:

form.php

HTML:
  1. <?php
  2. session_start();
  3. ?>
  4. <script src=«https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js»></script>
  5.     <input type=«number» name=«field1» inputmode=«numeric» />
  6.     <input type=«number» name=«field2» inputmode=«numeric» />
  7.     <select name=«field3» >
  8.         <option value=«test1»>опция1</option>
  9.         <option value=«test2»>опция2</option>
  10.      </select>
  11.     <button id=«pushme»>сохранить</button>
  12. </form>
  13.     function validate(data)
  14.     {
  15.         // Фильтруем пустые поля
  16.         let empty = data.filter((input) => {
  17.             return input.value.trim() === »;
  18.         });
  19.  
  20.         // Отправляем true/false если есть пустые поля
  21.         return empty.length === 0;
  22.     }
  23.  
  24.     $(document).ready(() => {
  25.         $(«form»).submit(function(event) {
  26.             event.preventDefault(); // Блокируем дефолтное выполнение кнопки
  27.            
  28.             let form = $(this);
  29.             let data = form.serializeArray();
  30.            
  31.             if( validate(data) === true) {
  32.                 $.ajax({
  33.                     type: «POST»,
  34.                     url: «posted.php»,
  35.                     success: function(response) {
  36.                         alert(‘Данные сохранены’);
  37.                         form.trigger(‘reset’); // Очищаем форму от старых данных
  38.                     }
  39.                 });
  40.             } else {
  41.                 alert(‘Заполните все поля’);
  42.             }
  43.         });  
  44.     })

1. функция checkme() не существует.
2. Обязательно добавляйте аттрибут «name» к полям формы, везде.
3. Проверяйте абсолютно всё: свой код и пользовательский ввод
4. Писать JS в HTML (например «onclick=…») — это фу!

 

elena180607

Я сколько не пью — не получается, может дел не в кофе)) По сути — благодарю вас, что нашли время вникнуть. Касательно «Юзер не заполнил одно из полей» и «если никто не менял значение выпадающего списка, то оно и не сохраниться» — врядли, поскольку юзер не может нажать кнопку ДО заполнения ВСЕХ полей (кнопка неактивна), используется функция checkParams(), я ее не внесла в код, чтобы код легче воспринимался. Прошу прощения, видно надо было…
На счет «посылается аякс запрос, но так же идет сабмит всей формы» — Здесь нужно от чего-то отказаться/что-то исключить? Возможно, здесь конфликт.

Все еще не могу понять, почему первое поле игнорируется, а остальные записываются. Повторюсь, когда сама проверяю — записываются все поля. Смотрела в сторону прав на папки-файлы, но если бы были проблемы с правами, не записывалось бы ничего…
Свои <input name=»…»/> и <select name=»…» > ко всем полям и селектам добавила.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *