2013-03-22 5 views
0

Название настолько общее, что главным образом потому, что я не знаю, какой должен быть соответствующий заголовок для него. Позвольте мне просто объяснить ситуацию:Использование цикла for для получения значений нескольких элементов в PHP

Скажите, что у меня есть два текстовых поля с именем LastName0 и FirstName0 и кнопка под названием addMore. Когда я нажму addMore, через JavaScript будут созданы еще два текстовых поля. Эти текстовые поля будут называться LastName1 и FirstName1. Когда я снова нажму кнопку addMore, будут созданы еще две кнопки текстовых полей и названы соответственно LastName2 и FirstName2 соответственно. Это будет продолжаться до тех пор, пока нажимается кнопка addMore. Кроме того, рядом с текстовыми полями будет создана кнопка с именем deleteThis. Это просто удаляет созданные текстовые поля при нажатии.

Я также инициализировал переменную, называемую counter. Каждый раз, когда нажимается кнопка addMore, counter поднимается на 1, и всякий раз, когда нажимается кнопка deleteThis, counter уменьшается на 1. Значение counter хранится в скрытом типе ввода.

Когда пользователь отправляет форму, я получаю значение counter и создаю цикл For, чтобы получить все значения текстовых полей в форме. Ниже приведен пример кода:

//Suppose that the user decides to add 2 more textboxes. Now we have the following: 
    // LastName0 FirstName0 
    // LastName1 FirstName1 
// LastName2 FirstName2 

$ctr = $_POST['counter']; //the counter == 3 
for ($x = 0; $x < $ctr; $ctr++) 
{ 
    $lastname = $_POST["LastName$x"]; 
    $firstname = $_POST["FirstName$x"]; 

    //This will get the values of LastName0,1,2 and FirstName0,1,2 

    //code to save to database… 
} 

На приведенном выше коде, если значение counter равно 3, то будут сохранены значения текстовых LastName0,1,2 и FirstName0,1,2. Теперь вот проблема: если пользователь решил удалить LastName1 и FirstName1, для цикла не сможет итерацию правильно:

$ctr = $_POST['counter']; //the counter == 2 
for ($x = 0; $x < $ctr; $ctr++) 
{ 
    //Only LastName0 and FirstName0 will be saved. 

    $lastname = $_POST["LastName$x"]; 
    $firstname = $_POST["FirstName$x"]; 

    //code to save to database… 
} 

Кто-то сказал мне, чтобы использовать «толчок и поп-музыки» концепцию, чтобы решить эту проблему , но я не совсем уверен, как его применять здесь. Поэтому, если кто-нибудь скажет мне, как его применять, это будет грандиозно.

+0

$ _POST [''] ВОЗВРАТ ТОЛЬКО ЗАПОЛНЕННЫЕ ПОЛЯ ФОРМЫ –

+0

Не связано с проблемой, но вы должны изучить массивы полей ввода. –

+0

У вас есть некоторые проблемы с логикой здесь, если люди удаляют и добавляют текстовые поля, когда более поздние значения уже установлены. Если бы я должен был создать 3 текстовых поля, заполнить их, а затем удалить первый набор. Когда я добавлю новый набор, у меня будет два набора текстовых полей, называемых LastName2 и FirstName2, так как мой счетчик будет деинкрементным, а затем увеличен. – Marryat

ответ

2
  1. Добавьте входные текстовые поля с именем массива т.е. <input type="text" name="FirstName[]" />
  2. В PHP вы можете получить их в виде массива. т.е.

    foreach($_POST["FirstName"] as $k=>$val){ 
        echo $val; // give you first name 
        echo $_POST["LastName"][$k]; // will give you last ame 
    } 
    

В этом случае, даже если один набор поле удаляется в HTML не повлияет на код PHP.

+0

Я не знал, что вы можете назвать элемент с массивом. Спасибо за подсказку! Я попробую и посмотрю, сработает ли это. –

1

Одно решение было бы использовать функцию IsSet так:

$ctr = $_POST['counter']; 
for ($x = 0; $x < $ctr; $ctr++) 
{ 

isset($_POST["LastName$x"])?$lastname = $_POST["LastName$x"]:; 
isset($_POST["FirstName$x"])?$firstname = $_POST["FirstName$x"]:; 

} 
1

Если это возможно, вместо того, чтобы использовать LastNameN и имена FirstNameN пытаются использовать LastName [N] и FirstName [N], таким образом результатом является массив, и вы можете перемещаться по нему с Еогеасп, то есть вам не нужно будет счетчик и индекс стоимости не будет иметь важное значение:

foreach ($_POST["LastName"] as $i=>$lastname) { 
    if (!isset($_POST["FirstName"][$i])) { 
     // This should only happen if someone messes with the client side before posting 
     throw new Exception("Last name input does not have a related First name input"); 
    } 

    $firstname = $_POST["FirstName"][$i]; 
} 

Если нет, то вы, возможно, придется использовать $ счетчик иным способом

$current = 0; 
while ($counter) { // Stop only when i found all 
    if (isset($_POST["LastName$current"]) { 
     $counter--; // Found one 
     $lastname = $_POST["LastName$current"]; 
     $firstname = $_POST["FirstName$current"]; 
    } 
    $current++; 
} 
0

Внутри ваш цикл, может быть, вы могли бы попробовать ...

if ((isset($_POST["LastName$x"])) && (isset($_POST["FirstName$x"]))){ 
    $lastname = $_POST["LastName$x"]; 
    $firstname = $_POST["FirstName$x"]; 

    //code to save to database… 

}

Это будет проверять, если переменные существует, прежде чем пытаться сделать что-нибудь с ними.

1

Лучший способ решить эту задачу - использовать массивы для имени и фамилии. Вместо того, чтобы называть их Lastname0 и Firstname0, затем Lastname1 и Firstname1, вызывать их все Lastname [] и Firstname []. Дайте им идентификаторы Lastname0 и Firstname0 и т. Д. Для функции удаления, но сохраните имена как массивы.

Когда форма представляется использование следующее:

foreach($_POST['Lastname'] as $i => $lastname) { 
    $firstname = $_POST['Firstname'][$i] 

    //... code to save into the database here 
} 

Имейте в виду, однако, что в IE, если у вас есть пустое поле не будет представлено, поэтому если Lastname0 имеет значение, но Firstname0 не делает, то $ _POST ['Firstname'] [0] фактически будет содержать значение Firstname1 (при условии, что в нем есть значение). Чтобы обойти это, вы можете использовать javascript, чтобы проверить, пустое поле при отправке формы, и, если это так, введите в нее слово EMPTY.

1

Не используйте счетчик, если не требуется
гораздо более простой способ это добавить имя массива при admore щелкнул.
Дайте имя как first_name [] в текстовом поле

если вы создаете форму, как, что вы можете использовать Еогеасп через $_POST['first_name']
попробовать var_dump($_POST) в вас PHP код, чтобы увидеть, как все происходит.

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