За последние 24 часа нас посетили 16252 программиста и 1579 роботов. Сейчас ищут 1607 программистов ...

проблема с массивом $_POST

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

  1. oleha

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

    С нами с:
    21 окт 2009
    Сообщения:
    39
    Симпатии:
    0
    Адрес:
    Ростов-на-Дону
    Доброй ночи!
    Замучался с отладкой...
    Есть форма:


    HTML:
    1.  
    2. <form action="script.php" method="post">
    3. <input name="NAME" type="hidden" value="не указан" />
    4. <input name="REG" type="hidden" value="не указан" />
    5. ...
    6. <div>
    7.             <label for="org-name">Название организации: </label>
    8.             <input type="text" name="NAME" id="org-name"/>
    9. </div>
    10.  
    11. <div>
    12.             <label for="reg-numb">Регистрационный номер в УФПР: </label>
    13.             <input type="text" name="REG" id="reg-numb"/>
    14. </div>
    15. ...
    16.  
    Предполагается, что если поле не заполнено, передается значение hidden,но получаю следующее:
    Array
    (
    ...
    [NAME] =>
    [REG] =>
    ...
    )

    В чем может быть промах?
     
  2. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Промах в том, что последняя форма "перекрывает" предыдущую, вне зависимости от значения. Это как:
    $var = 'php';
    $var = null;
    var_dump($var); // NULL
     
  3. oleha

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

    С нами с:
    21 окт 2009
    Сообщения:
    39
    Симпатии:
    0
    Адрес:
    Ростов-на-Дону
    в случае $var = null мы переменную создаем, а если <input type="text" name="NAME" id="org-name"/> не заполнить, переменная $_POST['NAME'] не создастся.
    Или я ошибаюсь?
     
  4. oleha

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

    С нами с:
    21 окт 2009
    Сообщения:
    39
    Симпатии:
    0
    Адрес:
    Ростов-на-Дону
    по крайней мере print_r ($_POST) ее не показывает
     
  5. Апельсин

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

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    oleha
    Создастся, но пустая. И не нужно тут этих скрытых полей, делай так:

    $name = isset($_POST['name'])?$_POST['name']:null';

    if(!empty($name))
    {
    ...
    }
    else
    {
    $name = 'не указано';
    }
     
  6. oleha

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

    С нами с:
    21 окт 2009
    Сообщения:
    39
    Симпатии:
    0
    Адрес:
    Ростов-на-Дону
    Спасибо
     
  7. reddyy

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

    С нами с:
    18 апр 2010
    Сообщения:
    5
    Симпатии:
    0
    Добрый вечер!
    У меня немного другая проблема:
    имеется форма. В форме есть элементы "input" типа "text", при загрузке страницы из базы данных в эти поля я загружаю данные, и помещаю их в значение величины "value". Если по-русски выражаться задаю полям предопределенное значение.
    Пользователь может внести изменения в эти поля или оставить значения по умолчанию.
    После внесения данных пользователь сабмитит форму методом Post.
    Проблема заключается в следующем:
    таким способом я пытаюсь записать введенные данные в базу, но в итоге записываются только те данные, которые были внесены вручную пользователем. При просмотре содержания массива $_POST функцией print_r() я вижу, что все данные, даже те которые не были изменены содержатся в массиве. Не могу понять в чем проблема...
    Помогите, пожалуйста.
    Заранее благодарен за помощь.
     
  8. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Вот и я не могу понять :)

    Если в $_POST находятся все нужные вам данные. Но записываются в БД не все.
    Видимо что-то происходит на этом промежутке кода?
    Вот только что? И кто может это знать? :)
     
  9. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    только автор и ктулху, ну еше может быть кто нибудь узнает если тут код появится xD
     
  10. reddyy

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

    С нами с:
    18 апр 2010
    Сообщения:
    5
    Симпатии:
    0
    В моем случае это происходит еще до записи в базу данных.
    Здесь кусок кода, в котором, собственно, и творятся все чудеса:

    $k=0;
    while(current($_POST))
    {
    if (key($_POST) <> "submit")
    {
    $data_to_record[$k] = current($_POST);
    if ($k == 2)
    {
    record_results(date("Y-m-d"), $data_to_record, key($_POST), $_SESSION['pointid'], $conn);
    $k = -1;
    }
    }
    $k++;
    next($_POST);
    }
     
  11. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    PHP:
    1. <?php
    2. $k=0;
    3. while(current($_POST)) {
    4.   if (key($_POST) <> "submit") {
    5.     $data_to_record[$k] = current($_POST);
    6.     if ($k == 2) {
    7.       record_results(date("Y-m-d"), $data_to_record, key($_POST), $_SESSION['pointid'], $conn);
    8.       $k = -1; 
    9.     }
    10.   }
    11. $k++;
    12. next($_POST);
    13. }
    перепишу ато ппц неприятно читать
    я бы сделал просто key in aray зачем тут k?можно же просто конкретную ячейку массива указывать, или нет?
    k==2 что то мы делаем потом k-1 делается .... получаем 1 потом внизу снова k++ снова получаем 2 и все повторяется
    что то странная схема...а не проще сделать if (key($_POST) == "submit")
     
  12. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    код малость суровый.

    дамп $_POST можно привести? И комментариями пометить какие из данных были внесены пользователем..
     
  13. reddyy

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

    С нами с:
    18 апр 2010
    Сообщения:
    5
    Симпатии:
    0
    Значит, поясню:
    идея в том, чтобы брать данные из массива $_POST группами по 3. Для этого я и использую эту замысловатую конструкцию с переменной $k. На каждом шаге я заношу величину из POST в массив data_to_record и потом передаю его процедуру record_results через каждые 3 итерации. Возможно это не самый правильный подход, но я пока только учусь. Буду рад, если вы посоветуете иное решение.

    С радостью сделаю это, если подскажете как:)
     
  14. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    print_r($_POST);
    или
    var_dump($_POST);

    зачем именно по 3?
     
  15. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Я как понимаю, у него что-то типа:
    Значение1
    параметр1 параметр2 параметр2
    Значение2
    ...

    reddyy
    В именах полей можно использовать массивы.
    <input type="text" name="value1[]"><input type="text" name="value1[]"><input type="text" name="value1[]">
    <input type="text" name="value2[]"><input type="text" name="value2[]"><input type="text" name="value2[]">

    Тогда в php получится вложенный цикл.
     
  16. reddyy

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

    С нами с:
    18 апр 2010
    Сообщения:
    5
    Симпатии:
    0
    Array ( [pr2693] => 0 [per2693] => 0 [2693] => 0 // поля для заполнения в форме представлены в виде таблице
    [pr66] => 0 [per66] => 0 [66] => 0 // по 3 столбца, в каждом столбце по 3 тега <input>
    [pr9] => 0 [per9] => 0 [9] => 0 // данный дамп получается, если пользователь не меняет
    [submit] => Сохранить ) // величин по умолчанию ( в данном случае, это все нули)
    // [submit] => Сохранить - это соответственно кнопка, при нажатии на которую сабмитится форма. В таком варианте программа даже не входит в цикл while (3 строка кода)
     
  17. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Да меня собственно не интересовало, что у него там.
    Вопрос был направлен на то, чтобы человек подумал - почему именно по 3.

    reddyy
    во-первых, поля в форме обзывать следующим образом -
    HTML:
    1. <input name="pr[2693]">
    2. <input name="per[2693]">
    3.  
    и т.д.
    или, что удобнее на мой взгляд,
    HTML:
    1. <input name="data[2693][pr]">
    2. <input name="data[2693][per]">
    3. <input name="data[2693][id]">
    4.  
    Потому что цифры - это номер строки/записи.
    А ключи дальше - это имена полей.

    Дальше элементарный цикл
    PHP:
    1. <?php
    2. $data = $_POST['data'];
    3. foreach($data as $key => $row) {
    4.     var_dump($key, $row);
    5. }
    думаю, что делать с $key, $row - догадаетесь.
     
  18. reddyy

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

    С нами с:
    18 апр 2010
    Сообщения:
    5
    Симпатии:
    0
    Simpliest, спасибо большое! Все заработало. Данные теперь сохраняются, и ваш способ явно красивее.
    Kreker, спасибо также за ваше замечание.