PHP возвращает очень странные результаты $ _POST при использовании массивов форм - PullRequest
1 голос
/ 19 июля 2011

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

Данные $_POST, отправленные в мой скрипт (найдены через print_r), выглядят следующим образом:

Array
(
    [name_first] => Charles
    [name_last] => Broughton
    [company] => 
    [address1] => 
    [address2] => 
    [city] => Bristol
    [region] => England
    [postal] => 
    [country] => 1
    [email] => *******************
    [phones_types] => Array
        (
            [0] => Cell
        )

    [phones_numbers] => Array
        (
            [0] => ************
        )

    [phone_types] => Array
        (
            [1] => Home
        )

    [phone_numbers] => Array
        (
            [1] => ************
        )

    [pass] => **********
    [id] => 
)

Форма, создающая этот нечетный вывод, выглядит следующим образом:

<form action="URL" method="POST">
  <table class="data" align="center" border="0" cellpadding="10" cellspacing="0" width="100%"><tbody>
    <tr>
      <th colspan="3">Edit Contact</th>
    </tr>
    <tr>
      <td>First Name:</td>
      <td><input type="text" name="name_first" value="Charles"/> (required)</td>
    </tr>
    <tr>
      <td>Last Name:</td>
      <td><input type="text" name="name_last" value="Broughton"/></td>
    </tr>
    <tr>
      <td>Company:</td>
      <td><input type="text" name="company" value=""/></td>
    </tr>
    <tr>
      <td>Address Line 1:</td>
      <td><input type="text" name="address1" value=""/></td>
    </tr>
    <tr>
      <td>Address Line 2:</td>
      <td><input type="text" name="address2" value=""/></td>
    </tr>
    <tr>
      <td>City:</td>
      <td><input type="text" name="city" value="Bristol"/> (required)</td>
    </tr>
    <tr>
      <td>Region:</td>
      <td><input type="text" name="region" value="England"/> (required)</td>
    </tr>
    <tr>
      <td>Postal:</td>
      <td><input type="text" name="postal" value=""/></td>
    </tr>
    <tr>
      <td>Country:</td>
      <td><select name="country">
        <option value="1" selected="selected">United Kingdom</option>
        <option value="2">United States</option>
      </select> (required)</td>
    </tr>
    <tr>
      <td>Email:</td>
      <td><input type="text" name="email" value="*******************"/> (required)</td>
    </tr>
    <tr>
      <td>Phones(s):</td>
      <td><input type="text" name="phones_types[0]" value="Cell"/>: <input type="text" name="phones_numbers[0]" value="************"/><br/><input type="text" name="phone_types[1]"/>: <input type="text" name="phone_numbers[1]"/></td>
    </tr>
    <tr>
      <td>Current Password:</td>
      <td><input type="password" name="pass"/> (required)</td>
    </tr>
    <tr align="center">
      <td colspan="2"><input type="submit" value="Save Changed"/></td>
    </tr>
    <input type="hidden" name="id" value=""/>
  </tbody></table>
</form>

Кто-нибудь знает, как я могу это исправить или правильно разобрать его с помощью PHP? Я пробовал цикл for, чтобы проанализировать оба массива как один, но ни один из них не является массивом из-за разделения ... пример которого приведен в выводе print_r выше.

-

РЕДАКТИРОВАТЬ Я пытался проанализировать данные формы, используя следующий бит PHP, с выводом продолжающегося сообщения об ошибке.

if (count($_POST['phone_types'])!=0 && count($_POST['phone_numbers'])!=0)
{
  for ($i = 0; $i < count($_POST['phone_types']); $i++)
  {
    if (!empty($_POST['phone_types'][$i]) && !empty($_POST['phone_numbers'][$i]))
      $phones[$_POST['phone_types'][$i]] = $_POST['phone_numbers'][$i];
  }
  $ph = "";
  foreach ($phones as $k => $v)
  {
    $ph.= "$k:$v;";
  }
  $phones = $ph;
}
else
  $phones = "";

Ошибка:

Warning: Invalid argument supplied for `foreach()` in `FILE` on line 35

Ответы [ 4 ]

2 голосов
/ 19 июля 2011

Вы используете обозначение массива в полях ввода: phones_types[0] указывает PHP, что он должен создать массив phones_types, и это конкретное поле должно быть элементом 0 в нем.

Любое поле формыс [] в конце его имени PHP обрабатывается как директива для обработки его как массива, поэтому вы можете передать несколько значений одному и тому же «имени».

1 голос
/ 19 июля 2011
<input type="text" name="phones_types[0]" value="Cell"/>: 
<input type="text" name="phones_numbers[0]" value="************"/><br/>
<input type="text" name="phone_types[1]"/>: 
<input type="text" name="phone_numbers[1]"/>

должно быть:

<input type="text" name="phones_types[0]" value="Cell"/>: 
<input type="text" name="phones_numbers[0]" value="************"/><br/>
<input type="text" name="phones_types[1]"/>: 
<input type="text" name="phones_numbers[1]"/>    

для того, чтобы иметь возможность циклически связывать телефонные_телефонные_телефонные номера с использованием foreach

1 голос
/ 19 июля 2011

Имена полей с квадратными скобками автоматически преобразуются в массивы PHP. Если у вас есть проблемы с отсутствующими записями массива, попробуйте изменить [0] на [] в именах полей.

См. http://www.php.net/manual/en/faq.html.php#faq.html.arrays.

0 голосов
/ 19 июля 2011

Один из ваших постов предназначен для phones_numbers, а другой - для phone_numbers

Те не совпадают , поэтому они будут отдельными _POST значениями

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...