2012-04-13 3 views
0

Это скорее вопрос техники, а не код. У меня есть php-форма со многими полями (элементы для выбора). Естественно, некоторые элементы могут быть выбраны, а некоторые нет. Как узнать, какие из них выбраны, когда я отправляю данные со страницы 1 на страницу 2? Я думал о тестировании каждого из них, если он пуст или нет, но слишком много полей, и это не совсем эффективно использовать или кодировать. Спасибо,PHP, избегающий длительного POST

UPDATE EDIT: Я попробовал следующее и, возможно, он получит меня где-то прежде, чем я продолжаю испытывать repliers решения ...

<html> 
<body> 
    <form name="test" id="name" action="testprocess.php" method="POST"> 
     <input type="text" name="choices[shirt]"> 
     <input type="text" name="choices[pants]"> 
     <input type="text" name="choices[tie]"> 
     <input type="text" name="choices[socks]"> 

     <input type="submit" value="submit data" /> 

    </form> 
</body> 
</html> 

, а затем вторую страницу:

<?php 
$names = $_POST['choices']; 
echo "Names are: <br>"; 
print_r($names); 

?> 

Это выдает следующее:

Имена: Array ([ши к.т.] => sdjalskdjlk [брюки] => lkjlkjlk [связь] => JLK [носки] => lkjlkjl)

Теперь то, что я собираюсь попытаться сделать это итерация по массиву, и так как значения в моем случае это числа, я просто проверю, какое из полей> 0, если значение по умолчанию равно 0. Надеюсь, это сработает ... если нет, то я дам вам знать :)

+0

вы имеете в виду избежать многих 'Исеть ($ _ POST [ 'и т.д.']))'? – Michelle

+0

цикл через массив. если вы создаете форму с помощью массива, упрощается проверка того, что размещено. –

+0

yes @JackSpairow Я хочу избежать этого для каждого опубликованного товара. Если я использую массив, поэтому мне нужно будет прочитать каждый элемент в нем и выполнить строку сравнения, чтобы я мог решить, что там есть, и называть их ценную базу данных froom. Снова не кажется эффективным из-за strcmp. Просто выражаю свою мысль здесь. –

ответ

0

Я думаю то, что вы ищете это:

<form action="submit.php" method="POST"> 
    <input type="checkbox" name="checkboxes[]" value="this" /> This 
    <input type="checkbox" name="checkboxes[]" value="might" /> might 
    <input type="checkbox" name="checkboxes[]" value="work" /> work 
    <input type="submit" /> 
</form> 

А потом в submit.php, вы просто пишете:

<?php 
foreach($_POST['checkboxes'] as $value) { 
    echo "{$value} was checked!"; 
} 
?> 

квадратные скобки в названии флажка элементов скажите PHP, чтобы все элементы с этим именем попадали в один и тот же массив, в данном случае $_POST['checkboxes'], хотя вы могли бы, по-видимому, называть флажки чем угодно.

+0

hmmm Я не получаю одну вещь ... так что этот массив отправлен .... Я проверяю значения внутри него. но все поля в форме будут в массиве, который я думаю ... это не решает. Или будут включены только поля с вводом ... –

+0

Не уверен, что вы имеете в виду, но если это не то, что вы хотите, вы можете рассмотреть: 'foreach ($ _ POST ['checkboxes'] as $ key => $ value) { echo "{$ key} установлен в {$ value}"; } ' – Daan

+1

с небольшими изменениями, это действительно сработало для меня. Я использовал для размещения массива из html-формы, затем начал играть с контентом в цикле foreach, чтобы я получил ключ и значение. Спасибо, сестра связки :) –

0

Вы должны опубликовать свой код так мы лучше поймем, что вы хотите сделать.

Но из того, что я понял, вы делаете форму с флажками. Если вы хотите увидеть, если выбраны флажки, вы можете идти, как это:

if(!$_POST['checkbox1'] && !$_POST['checkbox2'] && !$_POST['checkbox3']) 

Это выглядит, если все три флажка пусты.

+0

Это именно то, чего я пытаюсь избежать ... со 100 полями, становится проблемой –

0

Попробуйте .....

<?php 
function checkvalue($val) { 
    if($val != "") return true; 
    else return false; 
} 
if(isset($_POST['submit'])) { 
    $values = array_filter(($_POST), "checkvalue"); 
    $set_values = array_keys($values);   
} 
?> 

Таким образом, вы можете получить все значения, которые были установлены в массиве ..

+0

Хммм вы могли бы подумать над этим дальше? выглядит интересно ... спасибо btw –

+1

На самом деле я думаю, что может быть некоторая ошибка .. я вижу сначала – Codeeater

+0

Я отредактировал мое сообщение ... проверьте это .. – Codeeater

0

Просто идея:

Создать скрытое поле ввода в вашей форме без значения. Всякий раз, когда какое-либо из полей форм заполняется/выбирается, вы добавляете атрибут name этого поля в это скрытое поле (имена полей сохраняются с разделителем запятой).

При выполнении POST вы можете прочитать эту переменную, и только те поля, которые присутствуют в этом, были выбраны/заполнены в форме.

Надеюсь, это поможет.

+0

есть иллюстрация к тому, что говорится здесь? снова это кажется очень хорошей техникой ... но намек на то, как это было сделано, тоже помогло бы. –

+1

дай мне немного времени, сделаю демоверсию и вернусь к тебе. –

+1

Он полагается на Javascript - некоторые пользователи могут быть отключены. –

0

Я не совсем уверен, что понимаю ваши намерения. Я предполагаю, что у вас есть несколько полей форм, которые вы хотели бы разделить на разные веб-страницы (например, типичная форма опроса).

Если в этом случае используются сеансы для хранения разных данных ваших форм до тех пор, пока не будет нажата кнопка «окончательного отправки» (например, на последней странице).

0

Как узнать, какие из них выбраны, когда я отправляю данные со страницы 1 на страницу 2?

- это другой вопрос, как избежать большого POST для PHP.

Предполагая, что это таблица данных ...

Просто обновить все, независимо (если у вас есть первичные/уникальные ключи, установленные правильно)

Использование Ajax для обновления отдельных строк, как они изменяются на переднем конце

Использование Javascript для установки флага в каждой строке, когда данные в этой строке изменяется

Или хранить представление существующих данных для каждой строки в скрытом поле для строки, по представлению например

print "<form....><table>\n"; 
foreach ($row as $id=>$r) { 
    print "<tr><td><input type='hidden' name='prev[$id]' value='" 
    . md5(serialize($r)) . "'>... 
} 

... на приемном конце ...

foreach ($_POST['prev'] as $id=>$prev) { 
    $sent_back=array(/* the field values in the row */); 
    if (md5(serialize($sent_back)) != $prev) { 
      // data has changed 
      update_record($id, $sent_back); 
    } 
} 
+0

Я думаю, что это очень сложный способ справиться с этим ... Я даже не понимаю решение, которое я имею в виду :( –

Смежные вопросы