За последние 24 часа нас посетили 36980 программистов и 7800 роботов. Сейчас ищут 1870 программистов ...

Форма отправляет не верный ID пользователя из базы MySQL

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

  1. roman_php

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

    С нами с:
    20 сен 2009
    Сообщения:
    39
    Симпатии:
    1
    Доброго времени суток, форумчане!
    Помогите разобраться.
    Есть скрипт (часть проекта) который делает выборку пользователей из базы по условию и вставляет значения в табличную форму, предполагается что пользователь заполнит ФИО и отправит форму на обработчик который обновит запись в базе и добавит определенному пользователю ФИО, обращение к нужной записи в базе происходит по Id который AUTO_INCREMENT. Все приводить не буду, только то что не работает, ниже распишу, что не работает.

    PHP:
    1. .................
    2. include_once "sql/db.php";
    3. $region = $_SESSION['region'];
    4.  
    5. $id_user = R::findAll ( 'user', 'WHERE `mregion` = ? AND `status` = ?', [$region, 0] );
    6. ?>
    7.         <form action="update_user.php" target="_blank" method="post" id="form_valid_user"></form>
    8.         <table style="width: 80%; border-collapse: collapse; border: 1px solid grey"  align="center" cellspacing="0" cellpadding="0">
    9.         <tbody>
    10.         <tr>
    11.             <td style="text-align: center; border: 1px solid grey; background: rgba(72,255,5,0.39); font-weight: 999">Логин:</td>
    12.             <td style="text-align: center; border: 1px solid grey; background: rgba(72,255,5,0.39); font-weight: 999">ФИО:</td>
    13.             <td style="text-align: center; border: 1px solid grey; background: rgba(72,255,5,0.39); font-weight: 999">email:</td>
    14.             <td style="text-align: center; border: 1px solid grey; background: rgba(72,255,5,0.39); font-weight: 999">Территория:</td>
    15.             <td style="text-align: center; border: 1px solid grey; background: rgba(72,255,5,0.39); font-weight: 999">Авторизация:</td>
    16.         </tr>
    17.  
    18. <?php
    19. foreach ($id_user as $item){
    20.     ?>
    21.         <tr>
    22.             <td style="text-align: center; border: 1px solid grey"><?=$item["login"] ?></td>
    23.             <td style="text-align: center; border: 1px solid grey"><input style="width: 100%; text-align: center; font-size: 14px" type="text" form="form_valid_user"
    24.             name="fio" placeholder="ФИО" required></td>
    25.             <td style="text-align: center; border: 1px solid grey"><?=$item["mail"] ?></td>
    26.             <td style="text-align: center; border: 1px solid grey"><?=$item["mregion"] ?></td>
    27.             <td style="text-align: center; border: 1px solid grey"><a href="user_legit.php?id=<?=$item["id"] ?>"><input style="color: white; background-color: #765900; border: none; cursor: pointer;
    28.             text-shadow: 1px 1px 2px black; font-size: 16px;" type="submit" form="form_valid_user" name="send" value="Авторизовать"></a>
    29.             <input name="id_avtor" type="hidden" form="form_valid_user" value="<?=$item["id"] ?>"></td>
    30.         </tr>
    31. <?php }
    32. ?>
    33.                 </tbody>
    34.         </table>
    35. .............
    Вот эту ссылку <a href="user_legit.php?id=<?=$item["id"] ?>"> я добавил только для того, что бы посмотреть при наведении правильные ли id подставляются в $item["id"] и они правильные.

    Скрипт обработчик пока не писал, а решил в print_r($_POST) посмотреть какие значения прилетают в массиве POST.

    PHP:
    1. <?php
    2. if(isset($_POST["send"]) AND $_POST["send"]=='Авторизовать') {
    3.     echo '<pre>';
    4.     print_r($_POST);
    5.     echo '</pre>';}
    6. ?>
    А теперь проблема: всегда в массив POST попадает один и тот же id причем самый большой по значению, а по идее должен прилетать уникальный, ведь ссылка то перед кнопкой name="send" value="Авторизовать" показывает правильный id из базы, но вот после отправки формы id как я и писал всегда одинаковый и самый большой по значению (например есть 1,2,3 прилетит 3).
    Скорее всего я не понимаю как в данном случае работает цикл foreach.
    Помогите мне пожалуйста разобраться.
     
  2. Drunkenmunky

    Drunkenmunky Старожил

    С нами с:
    12 авг 2020
    Сообщения:
    1.511
    Симпатии:
    284
    То есть, у вас в форме несколько элементов с одинаковым значением <input name=...?
     
  3. roman_php

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

    С нами с:
    20 сен 2009
    Сообщения:
    39
    Симпатии:
    1
    @Drunkenmunky, я понимаю к чему вы ведете, эти имена должны быть разные, например я сделаю так: input name="id_avtor_<?=$item["id"]?>", в этом случае я получу:
    Код (Text):
    1. Array
    2. (
    3.     [fio] => 3
    4.     [id_avtor_1] => 1
    5.     [id_avtor_4] => 4
    6.     [id_avtor_6] => 6
    7.     [send] => Авторизовать
    8. )
    А мне нужно только один Id.
     
  4. antoniii

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

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Скорее всего ты должен получить несколько скрытых полей с разными именами.
     
  5. roman_php

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

    С нами с:
    20 сен 2009
    Сообщения:
    39
    Симпатии:
    1
    @antoniii, так я и получаю, а мне нужен только одно значение с id из скрытого поля.
     
  6. antoniii

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

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Что будет если сделать на странице с формой print_r($id_user); после запроса к базе
     
  7. roman_php

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

    С нами с:
    20 сен 2009
    Сообщения:
    39
    Симпатии:
    1
    @antoniii, я уже делал такую проверку, выборка из базы происходит правильно.
    Код (Text):
    1. Array
    2. (
    3.     [3] => RedBeanPHP\OODBBean Object
    4.         (
    5.             [properties:protected] => Array
    6.                 (
    7.                     [id] => 3
    8.                     [login] => test
    9.                     [fio] => Тест
    10.                     [pass] => 0987654321qwerty
    11.                     [pass_md5] => 6033a4884b99654373c17210b58080b0
    12.                     [mail] => test@x5.ru
    13.                     [mregion] => nord_zapad
    14.                     [status] => 0
    15.                     [adm] =>
    16.                 )
    17.  
    18.             [__info:protected] => Array
    19.                 (
    20.                     [type] => user
    21.                     [sys.id] => id
    22.                     [sys.orig] => Array
    23.                         (
    24.                             [id] => 3
    25.                             [login] => test
    26.                             [fio] => Тест
    27.                             [pass] => 0987654321qwerty
    28.                             [pass_md5] => 6033a4884b99654373c17210b58080b0
    29.                             [mail] => test@x5.ru
    30.                             [mregion] => nord_zapad
    31.                             [status] => 0
    32.                             [adm] =>
    33.                         )
    34.  
    35.                     [tainted] =>
    36.                     [changed] =>
    37.                     [changelist] => Array
    38.                         (
    39.                         )
    40.  
    41.                     [model] =>
    42.                     [data.bundle] => Array
    43.                         (
    44.                         )
    45.  
    46.                 )
    47.  
    48.             [beanHelper:protected] => RedBeanPHP\BeanHelper\SimpleFacadeBeanHelper Object
    49.                 (
    50.                 )
    51.  
    52.             [fetchType:protected] =>
    53.             [withSql:protected] =>
    54.             [withParams:protected] => Array
    55.                 (
    56.                 )
    57.  
    58.             [aliasName:protected] =>
    59.             [via:protected] =>
    60.             [noLoad:protected] =>
    61.             [all:protected] =>
    62.             [castProperty:protected] =>
    63.         )
    64.  
    65.     [5] => RedBeanPHP\OODBBean Object
    66.         (
    67.             [properties:protected] => Array
    68.                 (
    69.                     [id] => 5
    70.                     [login] => user1
    71.                     [fio] =>
    72.                     [pass] => 123321
    73.                     [pass_md5] => 10f85426ddc538775bbcca23e3a17531
    74.                     [mail] => user1@x5.ru
    75.                     [mregion] => nord_zapad
    76.                     [status] => 0
    77.                     [adm] =>
    78.                 )
    79.  
    80.             [__info:protected] => Array
    81.                 (
    82.                     [type] => user
    83.                     [sys.id] => id
    84.                     [sys.orig] => Array
    85.                         (
    86.                             [id] => 5
    87.                             [login] => user1
    88.                             [fio] =>
    89.                             [pass] => 123321
    90.                             [pass_md5] => 10f85426ddc538775bbcca23e3a17531
    91.                             [mail] => user1@x5.ru
    92.                             [mregion] => nord_zapad
    93.                             [status] => 0
    94.                             [adm] =>
    95.                         )
    96.  
    97.                     [tainted] =>
    98.                     [changed] =>
    99.                     [changelist] => Array
    100.                         (
    101.                         )
    102.  
    103.                     [model] =>
    104.                     [data.bundle] => Array
    105.                         (
    106.                         )
    107.  
    108.                 )
    109.  
    110.             [beanHelper:protected] => RedBeanPHP\BeanHelper\SimpleFacadeBeanHelper Object
    111.                 (
    112.                 )
    113.  
    114.             [fetchType:protected] =>
    115.             [withSql:protected] =>
    116.             [withParams:protected] => Array
    117.                 (
    118.                 )
    119.  
    120.             [aliasName:protected] =>
    121.             [via:protected] =>
    122.             [noLoad:protected] =>
    123.             [all:protected] =>
    124.             [castProperty:protected] =>
    125.         )
    126.  
    127.     [6] => RedBeanPHP\OODBBean Object
    128.         (
    129.             [properties:protected] => Array
    130.                 (
    131.                     [id] => 6
    132.                     [login] => user2
    133.                     [fio] =>
    134.                     [pass] => 123321
    135.                     [pass_md5] => 10f85426ddc538775bbcca23e3a17531
    136.                     [mail] => user2@x5.ru
    137.                     [mregion] => nord_zapad
    138.                     [status] => 0
    139.                     [adm] =>
    140.                 )
    141.  
    142.             [__info:protected] => Array
    143.                 (
    144.                     [type] => user
    145.                     [sys.id] => id
    146.                     [sys.orig] => Array
    147.                         (
    148.                             [id] => 6
    149.                             [login] => user2
    150.                             [fio] =>
    151.                             [pass] => 123321
    152.                             [pass_md5] => 10f85426ddc538775bbcca23e3a17531
    153.                             [mail] => user2@x5.ru
    154.                             [mregion] => nord_zapad
    155.                             [status] => 0
    156.                             [adm] =>
    157.                         )
    158.  
    159.                     [tainted] =>
    160.                     [changed] =>
    161.                     [changelist] => Array
    162.                         (
    163.                         )
    164.  
    165.                     [model] =>
    166.                     [data.bundle] => Array
    167.                         (
    168.                         )
    169.  
    170.                 )
    171.  
    172.             [beanHelper:protected] => RedBeanPHP\BeanHelper\SimpleFacadeBeanHelper Object
    173.                 (
    174.                 )
    175.  
    176.             [fetchType:protected] =>
    177.             [withSql:protected] =>
    178.             [withParams:protected] => Array
    179.                 (
    180.                 )
    181.  
    182.             [aliasName:protected] =>
    183.             [via:protected] =>
    184.             [noLoad:protected] =>
    185.             [all:protected] =>
    186.             [castProperty:protected] =>
    187.         )
    188.  
    189. )
     
  8. antoniii

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

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    В базе должен быть только один человек с заданными параметрами или несколько?
     
  9. roman_php

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

    С нами с:
    20 сен 2009
    Сообщения:
    39
    Симпатии:
    1
    ID пользователя уникально, так как поле AUTO_INCREMENT
     
  10. antoniii

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

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    У тебя запрос по каким параметрам происходит?
     
  11. roman_php

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

    С нами с:
    20 сен 2009
    Сообщения:
    39
    Симпатии:
    1
    выбор по полю mregion и status = 0, мне не нужно искать по id пользователя, мне потом это id нужно передавать в форме
     
  12. antoniii

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

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    При поиске по этим полям возможно будет несколько результатов. Поэтому и несколько id
     
  13. roman_php

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

    С нами с:
    20 сен 2009
    Сообщения:
    39
    Симпатии:
    1
    Все верно, так и должно быть, но передать то мне в форме нужен только один, тот который пользователь выберет заполнит ФИО и нажмет кнопку Авторизовать
     
  14. antoniii

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

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Зачем ты заполняешь форму результатами такого запроса, при котором может получиться несколько id? Тогда пользователь должен сам выбирать, какую запись ему редактировать. А поскольку форма одна, у скрытых полей должны быть разные имена, а выбрать из них верное наша задача. Как ты определишь, какой id нужно передать? Возьмешь его из таблицы или сам назначишь?
     
  15. roman_php

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

    С нами с:
    20 сен 2009
    Сообщения:
    39
    Симпатии:
    1
    Я попробую объяснить это на картинках.
    Скрипт с циклом формирует таблицу, а поля формы заполняются значениями из базы с выборкой по полям mregion и status который равен 0
    upload_2023-2-18_23-28-47.png
    если подносить курсор к кнопкам Авторизовать, то можно видеть в ссылке которую я сделал для проверки подстановки id все работает корректно
    upload_2023-2-18_23-31-2.png
    первая ссылка где логин test
    upload_2023-2-18_23-31-46.png
    вторая ссылка где логин user1
    upload_2023-2-18_23-32-56.png
    третья ссылка где логин user2
    т.е. логика такая, что пользователь заполняет поле ФИО в форме и нажимает напротив кнопку авторизовать, на страницу с обработчиком попадает в POST номер id в $_POST["id_avtor"] и потом буду обновлять запись в базе по id для поля где ФИО.
    Но я не получаю желаемого, на какую кнопку Авторизовать я бы не нажал, я получаю в $_POST["id_avtor"] один и тот же номер id в данном случае 6.
     
  16. Drunkenmunky

    Drunkenmunky Старожил

    С нами с:
    12 авг 2020
    Сообщения:
    1.511
    Симпатии:
    284
    Значит вам нужны несколько форм, При нажатии на кнопку с типом submit отправляется всё, что есть в форме.
    Если, при этом, какие-то элементы, имеют одинаковые имена, то отправляется только последний.Это происходит еще на стороне браузера.

    Примерно, для браузера, ваша форма выглядит так:
    Код (Text):
    1.  
    2. var id_user = 1
    3. var id_user = 2
    4. var id_user = 3
    5.  
    6. echo id_user  //3
     
  17. roman_php

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

    С нами с:
    20 сен 2009
    Сообщения:
    39
    Симпатии:
    1
    Точно, мне циклом нужно будет формировать столько форм сколько итераций цикл проводит извлекая данные, при этом id формы делать уникальным например подставляя в id сам идешник пользователя из базы <form action="update_user.php" target="_blank" method="post" id="form_valid_user_<?=$item["id"]?>"></form>
     
  18. Drunkenmunky

    Drunkenmunky Старожил

    С нами с:
    12 авг 2020
    Сообщения:
    1.511
    Симпатии:
    284
    Не обязательно. Это может быть нужным, если хотите отправить сразу несколько форм, вложив их в одну общую , или для обработки javascript'ом например и тд
     
  19. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
    Если вам нужно обновить одного пользователя, то надо делать много форм. Или брать жабаскриптом нужные. В вашей форме инпуты, которые идут ниже, перезапишут те, что выше. Так работает браузер, когда одинаковые name у полей формы
     
  20. roman_php

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

    С нами с:
    20 сен 2009
    Сообщения:
    39
    Симпатии:
    1
    Спасибо всем большое, вот так все работает:
    PHP:
    1. <?php
    2. foreach ($id_user as $item){
    3.     ?>
    4.         <tr>
    5.             <form action="update_user.php" target="_blank" method="post" id="form_valid_user_<?=$item["id"] ?>"></form>
    6.             <td style="text-align: center; border: 1px solid grey"><?=$item["login"] ?></td>
    7.             <td style="text-align: center; border: 1px solid grey"><input style="width: 100%; text-align: center; font-size: 14px" type="text" form="form_valid_user_<?=$item["id"] ?>"
    8.             name="fio" placeholder="ФИО" required></td>
    9.             <td style="text-align: center; border: 1px solid grey"><?=$item["mail"] ?></td>
    10.             <td style="text-align: center; border: 1px solid grey"><?=$item["mregion"] ?></td>
    11.             <td style="text-align: center; border: 1px solid grey"><a href="user_legit.php?id=<?=$item["id"] ?>"><input style="color: white; background-color: #765900; border: none; cursor: pointer;
    12.             text-shadow: 1px 1px 2px black; font-size: 16px;" type="submit" form="form_valid_user_<?=$item["id"] ?>" name="send" value="Авторизовать"></a>
    13.             <input name="id_avtor" type="hidden" form="form_valid_user_<?=$item["id"] ?>" value="<?=$item["id"] ?>"></td>
    14.         </tr>
    15. <?php }
    16. ?>
     
    ilya45 нравится это.