За последние 24 часа нас посетили 61979 программистов и 1594 робота. Сейчас ищут 970 программистов ...

навигация по странице PHP

Тема в разделе "PHP для новичков", создана пользователем Reken, 3 фев 2021.

Метки:
  1. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    ID должен быть уникальным для каждой обновляемой строки.
    В базе у вас колонка ID, в ней значения. 1, 2, 3, 4, 5...
    Вот их и надо передавать обработчику.
     
  2. Reken

    Reken Активный пользователь

    С нами с:
    4 июл 2019
    Сообщения:
    200
    Симпатии:
    5
    Так он у меня уникальный для каждой строки...
    У меня с названиями ID беда. Я же вам говорю...

    У меня как получается, запускается цикл for
    Далее рисуется строка №1 из таблицы, заполняется нужными значениями. И допустим значению "1" из колонки ID присваивается input id='ID'. Следующей строке, где значение из колонки ID равно "2", присваивается так же input id='ID'
    В итоге получается что для ста значений одно название, которое и принимает JS. Поэтому у меня не получается...
    Вот пока что не знаю как исправить.
     
  3. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Так делайте массив названий.
    В HTML для input типа text это решается двумя способами.
    Либо к названию, через разделитель например, добавляется значение ID. Например name=ID_25, а обработчик уже извлекает из полученных ключей пару ключ=значение(ID=25).
    Либо же добавлением к названию квадратных скобок.
    Например ID[]
    Или же, что более конкретно ID[25]
     
  4. Reken

    Reken Активный пользователь

    С нами с:
    4 июл 2019
    Сообщения:
    200
    Симпатии:
    5
    Спасибо. Наверное идея с массивами подойдет мне.
    Скажите, допустим я сделаю массивы ID,ZN1,ZN2 через квадратные скобки вот так:
    Код (Text):
    1. echo "<tr><td><input type='text' value=$row[0] input id='ID[]'></td><td><input type='text' value=$row[1] input id='ZN1[]'></td><td><input type='text' value=$row[2] input id='ZN2[]'></td><td><input type=button id='btn' value='Изменить'></td></tr>";
    Для начала мне же нужно будет передать массив в JS, а потом в обработчик...
    Передавать массив в JS нужно как то иначе, нежели переменную?
     
  5. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Нет.
    По-другому нужно обрабатывать.
    Допустим, так:
    PHP:
    1. echo $_POST['key'];
    вы обрабатываете строчное значение.
    А вот так:
    PHP:
    1. print_r ($_POST['key']);
    массив.
    Потренируйтесь на простой форме. Без JS.
     
  6. Reken

    Reken Активный пользователь

    С нами с:
    4 июл 2019
    Сообщения:
    200
    Симпатии:
    5
    С обработкой переменной и массива понятно.
    Не получается собрать массив...Я что то неправильно делаю. Вот часть кода
    Код (Text):
    1. input id='ID[]'
    Этот фрагмент кода не собирает массив.
    Допустим если бы было так:
    Код (Text):
    1.  
    2. for($i=1;$i<=100;$i++)
    3. {
    4. echo <<<HTML
    5. <form action='обработчик.php' method='post'>
    6. <input type='hidden' name=info[] value='$i'>
    7. <button type="submit" class="btn">Отправить в обработчик</button>
    8. </form>
    9. HTML;
    Тогда бы в обработчик отправился бы массив info содержащий в себе значения от 0 до 100.

    А как собрать массив для передачи в JS, пока что непонятно...
     
  7. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    На запрос в гугле "ajax отправить форму" 200K результатов
     
  8. Reken

    Reken Активный пользователь

    С нами с:
    4 июл 2019
    Сообщения:
    200
    Симпатии:
    5
    Я разобрался и с формами и с переменными. И с тем как их отправлять в JS
    Теперь только вот в чем застрял:
    Код (Text):
    1. $R = array("php", "html", "css");
    2. echo <<<HTML
    3. <input type='hidden' id='R' name='R' value='$R'>
    4. HTML;
    Таким образом в JS из PHP передается пустой массив...Подскажите мне пожалуйста, как массив через JS передать в обработчик...
     
  9. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Упаковать в строку. В json например.
     
  10. Reken

    Reken Активный пользователь

    С нами с:
    4 июл 2019
    Сообщения:
    200
    Симпатии:
    5
    Не подошел мне к сожалению метод с массивами...
    Похоже всё из-за цикла for... У меня же таблица из БД выводится построчно через цикл for.
    Вытягиваю из БД первую строчку, запихиваю её в массив. Далее из этого массива формирую строчку
    И так прогоняю эту строчку через цикл for, что бы вся таблица вышла...

    Если допустим я в 50 строчке нажимаю изменить значения
    То если отправлять через PHP (POST) сразу в обработчик, то всё нормально, значения из строк берутся нужные
    А если отправлять через AJAX, то почему то при изменение данных в любой строке, в обработчик отправляются значения первой строки...

    Код (Text):
    1. for($i=1;$i<=100;$i++)
    2. {
    3. # Записываем строчку в массив
    4. $query ="SELECT * FROM `ajax` WHERE ID = '$i'";
    5. $result = mysqli_query($mysqli, $query) or die("ERORRRR " . mysqli_error($mysqli));
    6. $row = mysqli_fetch_row($result);
    7.  
    8. echo <<<HTML
    9. <tr><td><input type='text' value=$row[0] input id='ID'></td><td><input type='text' value=$row[1] id=ZN1 name ="ZN1[]"></td><td><input type='text' value=$row[2] input id='ZN2'></td><td><input type=button id='btn' value='Изменить'></td></tr>
    10. HTML;
    11.  
    12. }
     
  11. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Еще раз.
    Вы не передаете ID записи в базе обработчику.
    В атрибуте name он должен быть задан явно.
    Указывая его вот так attrname[] и отправляя один элемент, там будет задан ключ 0
     
  12. Reken

    Reken Активный пользователь

    С нами с:
    4 июл 2019
    Сообщения:
    200
    Симпатии:
    5
    Спасибо за помощь, но я пока что не понимаю...Попробую обмозговать...И у меня же нет атрибута name...

    Меня вводит в замешательство следующее, вот код:
    Код (Text):
    1. for($i=1;$i<=100;$i++)
    2. {
    3.  
    4. # Записываем строчку в массив
    5. $query ="SELECT * FROM `ajax` WHERE ID = '$i'";
    6. $result = mysqli_query($mysqli, $query) or die("ERORRRR " . mysqli_error($mysqli));
    7. $row = mysqli_fetch_row($result);
    8.  
    9. echo <<<HTML
    10. <input type='hidden' id='R' name='R' value='$i'>
    11. <tr><td><input type='text' value=$row[0] input id='ID'></td><td><input type='text' value=$row[1] id=ZN1 name ="ZN1[]"></td><td><input type='text' value=$row[2] input id='ZN2'></td><td><input type=button id='btn' value='Изменить'></td></tr>
    12. HTML;
    13.  
    14. }
    Как такое возможно, что в этом скрипте в части запроса к БД "WHERE ID = '$i" переменная $i согласно циклу for меняет своё значение от 0 до 100. Так же в части скрипта name='R' value='$i' переменная $i меняет своё значение от 0 до 100.
    Но при этом в JS значение id='R' всегда равно 1...
    Я думал если я нажимаю кнопку в 50-ой строчке, то и в JS должен id='R' уйти со значением 50...

    Во всяком случае спасибо, что объясняли мне, попробую разобраться...
     
  13. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    В примере на чистом html вы отправляете всю форму целиком. Ключи массива имен полей ввода задаются от нуля до ста автоматически.
    В примере с js вы отправляете одно имя в массиве. Там задается ключ 0. Задайте ключ явно.
    name='atrrname[25]'
     
  14. Reken

    Reken Активный пользователь

    С нами с:
    4 июл 2019
    Сообщения:
    200
    Симпатии:
    5
    Скажите, я правильно понял. Что в моем примере, из html формы отправляются ID, ZN1, ZN2, которые уже являются массивами с автоматически проставленными ключами от 0 до 100.
    В JS скрипте, эти массивы отправляются в обработчик с ключом 0 по умолчанию (а это значения первой строки).

    А atrr(name) метод который позволяет задать ключ, и вытащить нужное значение из массива? (В моем случае из массивов ID,ZN1,ZN2)
     
  15. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Нет, не правильно.
    Атрибуты name в [] в конце имени будут преобразованы в массив. То есть ключи будут проставлены уже после нажатия кнопки. Если в [] будет что-то указано, то оно ключом и будет назначено.
    Не важно что это будет - число или строка.
    Например
    Код (Text):
    1. <input type=text name="text[key]" value="">
    Для понимания механизма замените тип текст на чекбокс.
    Они отправляются только если активированы.
     
    #40 Drunkenmunky, 15 апр 2021
    Последнее редактирование: 15 апр 2021
  16. Reken

    Reken Активный пользователь

    С нами с:
    4 июл 2019
    Сообщения:
    200
    Симпатии:
    5
    Давайте пожалуйста ещё раз пошагово посмотрим мой пример:
    1) Я запускаю цикл for, после которого все ниже приведенные действия должны выполнится сто раз поодряд. И для каждого выполнения переменная $i будет увеличиваться на 1

    2) При помощи PHP я вытаскиваю из БД строчку следующего типа:
    1#это ID | 34#это первое значение ZN1 | 48#это второе значение ZN2
    Эти параметры будут разные для каждой строчки

    3) Рисую все эти строчки при помощи HTML

    4 Подготавливаю форму HTML для обработки в JS
    Фрагмент кода где я обрабатываю значение строки ZN1 для JS (что бы JS смог взять нужную цифру)
    <td><input type='text' value=$row[1] input data-id1='$row[1]' name=ZN1>
    Как я понимаю в этой строке data-id1 из массива $row берет нужную мне цифру

    5) Закрываю цикл for


    Теперь в JS я пытаюсь прочитать значение data-id1
    var ZN1 = $(this).data("id1");

    Так у меня ничего не получается, JS не видит значения...

    К сожалению я всё ещё не могу понять, правильно ли я делаю в пункте 4 и правильно ли я обрабатываю значение в JS.

    P.S. Если бы допустим моя таблица состояла бы из одной строки:
    Я бы сделал так:
    <td><input type='text' value=$row[1] input id='ZN1' name=ZN1>

    А в JS вот так:
    var ZN1 = $('#ZN1').val();
    И всё бы работала...
    Но в моем случае есть цикл for который усложняет процесс...
     
  17. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    У вас изначально неправильный подход к написанию сценария.
    Он основывается на том, что php и html его части заведомо рабочие.
    А сейчас вы говорите, что в этом не уверены.
    Сделайте форму на чистом html - проверьте валидатором.
    Извлеките из БД необходимые данные, проверьте, что они именно те, что нужны для формы.
    Отладьте сгенерированную из этих данных форму и обработчик.
    И только потом уже переходите к js.
     
  18. Reken

    Reken Активный пользователь

    С нами с:
    4 июл 2019
    Сообщения:
    200
    Симпатии:
    5
    Я разобрался с PHP и HTML
    У меня была ошибка в том, что когда я запускал цикл for, я закрывал открытую в цикле форму, после цикла...А нужно для каждого цикла делать свою форму...
    Теперь у меня через PHP при нажатии кнопки отправить, в обработчик попадает то что нужно...Для каждой строчки свои значения

    Теперь я так понимаю нужно полностью форму в JS передать?
     
  19. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Не обязательно. Но можно.
    Можно отдельными элементами.
    А можно вместо одной формы сделать сто. Так, кстати, будет правильней, для noscript
    http://htmlbook.ru/html/noscript
     
  20. Reken

    Reken Активный пользователь

    С нами с:
    4 июл 2019
    Сообщения:
    200
    Симпатии:
    5
    Я сделал так:
    Код (Text):
    1. for($i=1;$i<=100;$i++)
    2. {
    3. # Записываем строчку в массив
    4. $query ="SELECT * FROM `ajax` WHERE ID = '$i'";
    5. $result = mysqli_query($mysqli, $query) or die("ERORRRR " . mysqli_error($mysqli));
    6. $row = mysqli_fetch_row($result);
    7.  
    8. echo "<form method='POST' id='form'>";
    9. echo "<table>";
    10. echo <<<HTML
    11. <tr><td><input type='text' value=$row[0] id=ID name=ID></td><td><input type='text' value=$row[1] id=ZN1 name=ZN1></td><td><input type='text' value=$row[2] ID=ZN2 name=ZN2></td><td><input type=button id='btn' value='Изменить'></td></tr>
    12. HTML;
    13. echo "</form>";
    14. }
    15. echo "</table>";
    В JS так:
    Код (Text):
    1.       fetch_data();
    2.       $(document).on('click', '#btn', function(){
    3.          
    4. var serializeFormData = $('#form').serialize();
    5.            
    6. $.ajax({
    7.                 url:"update.php",
    8.                 method:"POST",
    9.                 data:serializeFormData,
    10.                 dataType:"html",
    11.                 success:function(data)
    12.                 {
    13.                      alert(data);
    14.                      fetch_data();
    15.                 }
    16.            })
    17.       });  
    В обработчике update.php просто написал var_dump($_POST);

    В итоге у меня при нажатии на кнопку изменить на любой строчке, в обработчик всегда приходят значения последней строки...

    Странно, без JS всё нормально работает, если из PHP через POST передавать значения в обработчик, то для каждой строчки свои значения уходят. Как только передаю форму в JS, опять только для одной строчки уходят значения (последняя строка...)
     
  21. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Это говорит о том, что атрибут name для всех отправляемых значений одинаков.
     
  22. Reken

    Reken Активный пользователь

    С нами с:
    4 июл 2019
    Сообщения:
    200
    Симпатии:
    5
    Понятно.
    Или если по другому говоря, скрипт PHP запускается, выполняется от начала до конца файла, и в конце файла как раз в последнем цикле (100-ом), записывает в name последние значения...
    Скажите пожалуйста, именно мой метод (цикл for), возможно подкорректировать что бы атрибуты name были разные, и то чего я добиваюсь заработало..Или лучше выводить таблицу как то подругому, без цикла for...
     
  23. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Возможно, да.
    Например
    PHP:
    1. echo "....name='myname[$i]'";
     
  24. Reken

    Reken Активный пользователь

    С нами с:
    4 июл 2019
    Сообщения:
    200
    Симпатии:
    5
    Я так уже пробовал так делать.
    При нажатии кнопки, получаю ошибку
    ERROR: Truncated incorrect DOUBLE value: 'Array'
     
  25. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Тогда через разделитель - myname_$i
    Придется слегка доработать php обработчик.