Я пытаюсь установить массив сеанса с некоторыми предопределенными значениями, которые пользователь затем может добавить к использованию с помощью простой HTML-формы. Моя проблема в том, что на странице, где установлен массив, любое обновление или повторное посещение страницы просто дублирует предварительно определенные значения в массиве. Мало того, это также перезаписывает значение, полученное из формы каждый раз в конце.
Итак, в этом базовом примере у меня есть список животных, и пользователь может добавить другое животное в список. Но это выводит предварительно определенных животных снова каждый раз, то есть, если я отправляю форму дважды (например, добавляя курицу, а затем собаку), я получаю вывод:
Array ( [0] => pig[1] => cow[2] => sheep[3] => chicken[4] => pig[5] => cow[6] => sheep[7] => dog)
Что я хочу это:
Array ( [0] => pig[1] => cow[2] => sheep[3] => chicken[4] => dog[5])
Что я делаю неправильно?
index.php
<?php
session_start();
//pre-defined list of animals
$_SESSION['animals'][] = 'pig';
$_SESSION['animals'][] = 'cow';
$_SESSION['animals'][] = 'sheep';
?>
<!--form to add another animal-->
<form action="go.php" method="POST">
<p><input type="text" name="entry1"></p>
<p><input type="submit" name="submit"></p>
</form>
go.php
<?php
session_start();
//add form entry1 to the session array
$_SESSION['animals'][] = $_POST['entry1'];
//print session array
print_r($_SESSION['animals']);
?>
Инициализируйте переменную сеанса, только если она еще не установлена:
if (!isset($_SESSION['animals'])) {
$_SESSION['animals'] = array('pig', 'cow', 'sheep');
}
Проверьте
in_array ( ‘YOUR_VALUE’, $ _ SESSION [ ‘животные’])
перед повторной вставкой, чтобы избежать дублирования.
Ссылка: in_array
Я бы предложил не вставлять данные в сеанс напрямую, а добавлять скрытые входные значения, такие как:
<input type=hidden name=extraValue[] value="pig">
<input type=hidden name=extraValue[] value="cow">
etc
На вашей странице PHP отмените предыдущую сессию, поскольку вам нужен «свежий» набор данных, основанный на вводе, а не на старых значениях.
unset($_SESSION['animals']);
Вы можете получить доступ к вашим дополнительным значениям в $ _POST [‘extraValue’]. Затем вы можете объединить оба массива, как
$postValues = array_merge($_POST['extraValue'], $_POST['entry1']);
Я еще не тестировал этот код, но я бы использовал этот «путь», а не устанавливал значения SESSION перед вводом.