Доброго времени суток, форумчане!
Помогите разобраться.
Есть скрипт (часть проекта) который делает выборку пользователей из базы по условию и вставляет значения в табличную форму, предполагается что пользователь заполнит ФИО и отправит форму на обработчик который обновит запись в базе и добавит определенному пользователю ФИО, обращение к нужной записи в базе происходит по Id который AUTO_INCREMENT. Все приводить не буду, только то что не работает, ниже распишу, что не работает.PHP:
…………….. include_once «sql/db.php»; $region = $_SESSION[‘region’]; $id_user = R::findAll ( ‘user’, ‘WHERE `mregion` = ? AND `status` = ?’, [$region, 0] ); ?> <form action=»update_user.php» target=»_blank» method=»post» id=»form_valid_user»></form> <table style=»width: 80%; border-collapse: collapse; border: 1px solid grey» align=»center» cellspacing=»0″ cellpadding=»0″> <tbody> <tr> <td style=»text-align: center; border: 1px solid grey; background: rgba(72,255,5,0.39); font-weight: 999″>Логин:</td> <td style=»text-align: center; border: 1px solid grey; background: rgba(72,255,5,0.39); font-weight: 999″>ФИО:</td> <td style=»text-align: center; border: 1px solid grey; background: rgba(72,255,5,0.39); font-weight: 999″>email:</td> <td style=»text-align: center; border: 1px solid grey; background: rgba(72,255,5,0.39); font-weight: 999″>Территория:</td> <td style=»text-align: center; border: 1px solid grey; background: rgba(72,255,5,0.39); font-weight: 999″>Авторизация:</td> </tr> <?php foreach ($id_user as $item){ ?> <tr> <td style=»text-align: center; border: 1px solid grey»><?=$item[«login»] ?></td> <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» name=»fio» placeholder=»ФИО» required></td> <td style=»text-align: center; border: 1px solid grey»><?=$item[«mail»] ?></td> <td style=»text-align: center; border: 1px solid grey»><?=$item[«mregion»] ?></td> <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; text-shadow: 1px 1px 2px black; font-size: 16px;» type=»submit» form=»form_valid_user» name=»send» value=»Авторизовать»></a> <input name=»id_avtor» type=»hidden» form=»form_valid_user» value=»<?=$item[«id»] ?>«></td> </tr> <?php } ?> </tbody> </table> ………….Вот эту ссылку <a href=»user_legit.php?id=<?=$item[«id»] ?>»> я добавил только для того, что бы посмотреть при наведении правильные ли id подставляются в $item[«id»] и они правильные.
Скрипт обработчик пока не писал, а решил в print_r($_POST) посмотреть какие значения прилетают в массиве POST.
PHP:А теперь проблема: всегда в массив POST попадает один и тот же id причем самый большой по значению, а по идее должен прилетать уникальный, ведь ссылка то перед кнопкой name=»send» value=»Авторизовать» показывает правильный id из базы, но вот после отправки формы id как я и писал всегда одинаковый и самый большой по значению (например есть 1,2,3 прилетит 3).
Скорее всего я не понимаю как в данном случае работает цикл foreach.
Помогите мне пожалуйста разобраться.
То есть, у вас в форме несколько элементов с одинаковым значением <input name=…?
@Drunkenmunky, я понимаю к чему вы ведете, эти имена должны быть разные, например я сделаю так: input name=»id_avtor_<?=$item[«id»]?>», в этом случае я получу:
Код (Text):
Array ( [fio] => 3 [id_avtor_1] => 1 [id_avtor_4] => 4 [id_avtor_6] => 6 [send] => Авторизовать )А мне нужно только один Id.
Скорее всего ты должен получить несколько скрытых полей с разными именами.
@antoniii, так я и получаю, а мне нужен только одно значение с id из скрытого поля.
Что будет если сделать на странице с формой print_r($id_user); после запроса к базе
@antoniii, я уже делал такую проверку, выборка из базы происходит правильно.
Код (Text):
Array ( [3] => RedBeanPHP\OODBBean Object ( [properties:protected] => Array ( [id] => 3 [login] => test [fio] => Тест [pass] => 0987654321qwerty [pass_md5] => 6033a4884b99654373c17210b58080b0 [mail] => test@x5.ru [mregion] => nord_zapad [status] => 0 [adm] => ) [__info:protected] => Array ( [type] => user [sys.id] => id [sys.orig] => Array ( [id] => 3 [login] => test [fio] => Тест [pass] => 0987654321qwerty [pass_md5] => 6033a4884b99654373c17210b58080b0 [mail] => test@x5.ru [mregion] => nord_zapad [status] => 0 [adm] => ) [tainted] => [changed] => [changelist] => Array ( ) [model] => [data.bundle] => Array ( ) ) [beanHelper:protected] => RedBeanPHP\BeanHelper\SimpleFacadeBeanHelper Object ( ) [fetchType:protected] => [withSql:protected] => [withParams:protected] => Array ( ) [aliasName:protected] => [via:protected] => [noLoad:protected] => [all:protected] => [castProperty:protected] => ) [5] => RedBeanPHP\OODBBean Object ( [properties:protected] => Array ( [id] => 5 [login] => user1 [fio] => [pass] => 123321 [pass_md5] => 10f85426ddc538775bbcca23e3a17531 [mail] => user1@x5.ru [mregion] => nord_zapad [status] => 0 [adm] => ) [__info:protected] => Array ( [type] => user [sys.id] => id [sys.orig] => Array ( [id] => 5 [login] => user1 [fio] => [pass] => 123321 [pass_md5] => 10f85426ddc538775bbcca23e3a17531 [mail] => user1@x5.ru [mregion] => nord_zapad [status] => 0 [adm] => ) [tainted] => [changed] => [changelist] => Array ( ) [model] => [data.bundle] => Array ( ) ) [beanHelper:protected] => RedBeanPHP\BeanHelper\SimpleFacadeBeanHelper Object ( ) [fetchType:protected] => [withSql:protected] => [withParams:protected] => Array ( ) [aliasName:protected] => [via:protected] => [noLoad:protected] => [all:protected] => [castProperty:protected] => ) [6] => RedBeanPHP\OODBBean Object ( [properties:protected] => Array ( [id] => 6 [login] => user2 [fio] => [pass] => 123321 [pass_md5] => 10f85426ddc538775bbcca23e3a17531 [mail] => user2@x5.ru [mregion] => nord_zapad [status] => 0 [adm] => ) [__info:protected] => Array ( [type] => user [sys.id] => id [sys.orig] => Array ( [id] => 6 [login] => user2 [fio] => [pass] => 123321 [pass_md5] => 10f85426ddc538775bbcca23e3a17531 [mail] => user2@x5.ru [mregion] => nord_zapad [status] => 0 [adm] => ) [tainted] => [changed] => [changelist] => Array ( ) [model] => [data.bundle] => Array ( ) ) [beanHelper:protected] => RedBeanPHP\BeanHelper\SimpleFacadeBeanHelper Object ( ) [fetchType:protected] => [withSql:protected] => [withParams:protected] => Array ( ) [aliasName:protected] => [via:protected] => [noLoad:protected] => [all:protected] => [castProperty:protected] => ) )
В базе должен быть только один человек с заданными параметрами или несколько?
ID пользователя уникально, так как поле AUTO_INCREMENT
У тебя запрос по каким параметрам происходит?
выбор по полю mregion и status = 0, мне не нужно искать по id пользователя, мне потом это id нужно передавать в форме
При поиске по этим полям возможно будет несколько результатов. Поэтому и несколько id
Все верно, так и должно быть, но передать то мне в форме нужен только один, тот который пользователь выберет заполнит ФИО и нажмет кнопку Авторизовать
Зачем ты заполняешь форму результатами такого запроса, при котором может получиться несколько id? Тогда пользователь должен сам выбирать, какую запись ему редактировать. А поскольку форма одна, у скрытых полей должны быть разные имена, а выбрать из них верное наша задача. Как ты определишь, какой id нужно передать? Возьмешь его из таблицы или сам назначишь?
Я попробую объяснить это на картинках.
Скрипт с циклом формирует таблицу, а поля формы заполняются значениями из базы с выборкой по полям mregion и status который равен 0если подносить курсор к кнопкам Авторизовать, то можно видеть в ссылке которую я сделал для проверки подстановки id все работает корректно
первая ссылка где логин test
вторая ссылка где логин user1
третья ссылка где логин user2
т.е. логика такая, что пользователь заполняет поле ФИО в форме и нажимает напротив кнопку авторизовать, на страницу с обработчиком попадает в POST номер id в $_POST[«id_avtor»] и потом буду обновлять запись в базе по id для поля где ФИО.
Но я не получаю желаемого, на какую кнопку Авторизовать я бы не нажал, я получаю в $_POST[«id_avtor»] один и тот же номер id в данном случае 6.
Значит вам нужны несколько форм, При нажатии на кнопку с типом submit отправляется всё, что есть в форме.
Если, при этом, какие-то элементы, имеют одинаковые имена, то отправляется только последний.Это происходит еще на стороне браузера.Примерно, для браузера, ваша форма выглядит так:
Код (Text):
var id_user = 1 var id_user = 2 var id_user = 3 echo id_user //3
Точно, мне циклом нужно будет формировать столько форм сколько итераций цикл проводит извлекая данные, при этом id формы делать уникальным например подставляя в id сам идешник пользователя из базы <form action=»update_user.php» target=»_blank» method=»post» id=»form_valid_user_<?=$item[«id»]?>»></form>
Не обязательно. Это может быть нужным, если хотите отправить сразу несколько форм, вложив их в одну общую , или для обработки javascript’ом например и тд
Если вам нужно обновить одного пользователя, то надо делать много форм. Или брать жабаскриптом нужные. В вашей форме инпуты, которые идут ниже, перезапишут те, что выше. Так работает браузер, когда одинаковые name у полей формы
Спасибо всем большое, вот так все работает:
PHP:
<?php foreach ($id_user as $item){ ?> <tr> <form action=»update_user.php» target=»_blank» method=»post» id=»form_valid_user_<?=$item[«id»] ?>«></form> <td style=»text-align: center; border: 1px solid grey»><?=$item[«login»] ?></td> <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»] ?>« name=»fio» placeholder=»ФИО» required></td> <td style=»text-align: center; border: 1px solid grey»><?=$item[«mail»] ?></td> <td style=»text-align: center; border: 1px solid grey»><?=$item[«mregion»] ?></td> <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; text-shadow: 1px 1px 2px black; font-size: 16px;» type=»submit» form=»form_valid_user_<?=$item[«id»] ?>» name=»send» value=»Авторизовать»></a> <input name=»id_avtor» type=»hidden» form=»form_valid_user_<?=$item[«id»] ?>» value=»<?=$item[«id»] ?>«></td> </tr> <?php } ?>