Цикл по массиву входов с тем же именем

0

Я делаю список дел, и у меня все работает, кроме одной. Мне нужно перебрать входы, которые были отправлены через форму, эти входы имеют одно и то же имя, поэтому то, что я сделал, хранит их как массив. Теперь мне нужно зациклиться на них, чтобы я мог отправлять их в базу данных один за другим. Вот что я пробовал:

if (isset($_POST['submit'])) {
    $labelValues = $_POST['labelValue[]'];

    $i = 0;

    while($i < sizeof($labelValues)) {

        $stmt = $db->prepare("INSERT INTO tenta_table (text) VALUES (:text)");
        $stmt->bindParam(':text', $labelValues[$i]);
        $stmt->execute();
        $i++;
    }
}

HTML, входы отмечены красным:

Изображение 174551

Но, похоже, это не работает, это не дает мне никаких ошибок, поэтому мне нечего делать дальше. Где я здесь не так?

  • 0
    Можете ли вы опубликовать свою HTML-часть, откуда пришло это значение?
  • 3
    Не уверен, но насколько я помню, это должно быть $labelValues = $_POST['labelValue'] . Я думаю, что ваше $labelValues равно null и вы даже не входите в свой цикл. Вы должны сделать var_dump( $_POST ) чтобы проверить, с чем вы работаете.
Показать ещё 3 комментария
Теги:
arrays

4 ответа

3
Лучший ответ

Ваш $_POST['labelValue'] уже будет массивом, если вы правильно назвали свои входы, что-то вроде <input type="text" name="labelValue[]"/> создало бы и массив, называемый labelValue, в вашем POST.

Оттуда вы сможете использовать свой текущий код с одним незначительным изменением

if (isset($_POST['submit'])) {
    $labelValues = $_POST['labelValue'];

    $i = 0;

    while($i < sizeof($labelValues)) {

        $stmt = $db->prepare("INSERT INTO tenta_table (text) VALUES (:text)");
        $stmt->bindParam(':text', $labelValues[$i]);
        $stmt->execute();
        $i++;
    }
}

Выше меняю значение $labelValues равным $_POST['lableValue'] а не $_POST['labelValue[]']

1

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

Если вы хотите, чтобы несколько входов с одинаковым именем использовали name="foo[]" для атрибута имени ввода. $_POST будет содержать массив для foo со всеми значениями из входных элементов.

<form method="post">
    <input name="a[]" value="foo"/>
    <input name="a[]" value="bar"/>
    <input name="a[]" value="baz"/>
    <input type="submit" />
</form>

Причина, по которой $_POST будет содержать только последнее значение, если вы не используете [] заключается в том, что PHP будет просто просто взорваться и запросить строку необработанного запроса для заполнения $_POST. Когда он встречает пару имен/значений, которая уже существует, она перезапишет предыдущую.

Тем не менее, вы все равно можете получить доступ к строке необработанного запроса следующим образом:

$rawQueryString = file_get_contents('php://input'))

Предполагая, что у вас есть такая форма:

<form method="post">
    <input type="hidden" name="a" value="foo"/>
    <input type="hidden" name="a" value="bar"/>
    <input type="hidden" name="a" value="baz"/>
    <input type="submit" />
</form>

$ rawQueryString будет тогда содержать a=foo&a=bar&a=baz.

Затем вы можете использовать свою собственную логику для синтаксического анализа этого массива. Наивный подход

$post = array();
foreach (explode('&', file_get_contents('php://input')) as $keyValuePair) {
    list($key, $value) = explode('=', $keyValuePair);
    $post[$key][] = $value;
}

который затем предоставит вам массив массивов для каждого имени в строке запроса.

или лучший и простой подход для этого

<form method="post">
    <input name="a[0]" value="foo"/>
    <input name="a[1]" value="bar"/>
    <input name="a[2]" value="baz"/>
    <input type="submit" />
</form>
0

Не уверен, но насколько я помню, это должно быть $ labelValues = $ _POST ['labelValue']. Я думаю, что ваши $ labelValues равны нулю, и вы даже не вводите свой цикл. Вы должны сделать var_dump ($ _POST), чтобы проверить, с чем работаете.

0

Вы должны заменить

$labelValues = $_POST['labelValue[]'];

От

$labelValues = $_POST['labelValue'];

Ещё вопросы

Сообщество Overcoder
Наверх
Меню