Я делаю список дел, и у меня все работает, кроме одной. Мне нужно перебрать входы, которые были отправлены через форму, эти входы имеют одно и то же имя, поэтому то, что я сделал, хранит их как массив. Теперь мне нужно зациклиться на них, чтобы я мог отправлять их в базу данных один за другим. Вот что я пробовал:
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, входы отмечены красным:
Но, похоже, это не работает, это не дает мне никаких ошибок, поэтому мне нечего делать дальше. Где я здесь не так?
Ваш $_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[]']
В вашем случае будет доступен только последний элемент ввода.
Если вы хотите, чтобы несколько входов с одинаковым именем использовали 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>
Не уверен, но насколько я помню, это должно быть $ labelValues = $ _POST ['labelValue']. Я думаю, что ваши $ labelValues равны нулю, и вы даже не вводите свой цикл. Вы должны сделать var_dump ($ _POST), чтобы проверить, с чем работаете.
Вы должны заменить
$labelValues = $_POST['labelValue[]'];
От
$labelValues = $_POST['labelValue'];
$labelValues = $_POST['labelValue']
. Я думаю, что ваше$labelValues
равноnull
и вы даже не входите в свой цикл. Вы должны сделатьvar_dump( $_POST )
чтобы проверить, с чем вы работаете.