как хранить значения переменных при загрузке нескольких страниц

#php

#php

Вопрос:

Я создаю php-скрипт, который хранит 3 массива: $images , $urls , $titles на основе входных данных формы в файле php.

Я хочу напечатать значения этих массивов в первой части страницы, а затем предварительно заполнить поля ввода формы значением массивов. Также, когда пользователь изменяет поле ввода и нажимает «Сохранить», страница должна перезагрузиться с измененной версией.

Моя проблема в том, что при каждом вызове php-файла в браузере значение переменных удаляется. Есть ли способ сохранить значения массива, чтобы форма всегда предварительно заполнялась последними сохраненными значениями?

 <?php
//save the arrays with the form data
$images = array($_POST["i0"],$_POST["i1"],$_POST["i2"],$_POST["i3"]);
$urls = array($_POST["u0"],$_POST["u1"],$_POST["u2"],$_POST["u3"]);
$titles = array($_POST["t0"],$_POST["t1"],$_POST["t2"],$_POST["t3"]);
//print the arrays
print_r($images);
print_r($urls);
print_r($titles);
//create the form and populate it
echo "<p><form method='post' action='".$_SERVER['PHP_SELF']."';";
$x = 0;
while ($x <= 3) {
   echo"<div>
            <input name='i".$x."' type='text' value='".$images[$x]."'>
            <input name='u".$x."' type='text' value='".$urls[$x]."'>
            <input name='t".$x."' type='text' value='".$titles[$x]."'>";
       $x  ;
}
?>
<br>
<input type="submit" name="sumbit" value="Save"><br>
</form>
 

Комментарии:

1. этот скрипт не связан ни с какой базой данных, он не отправляет данные и не изменяет другие страницы. Что самое худшее, что может произойти в случае атаки XSS?

2. Пользователь крадет файлы cookie с вашего домена?

Ответ №1:

Сохраняйте переменные в сеансе PHP.

 session_start();
$_SESSION['images'] = $images;
 

Затем на следующей (или любой другой) странице вы можете получить значения в виде:

 session_start();
$images = $_SESSION['images'];
 

Комментарии:

1. применимо ли это, если я извлекаю значения на той же странице в //print the arrays разделе моего кода?

2. ДА. После установки переменных в сеансе вы также можете получить к ним доступ на той же странице

3. в моем случае это не сработало. Я добавил session_start();$_SESSION['images'] = $images; после шага: //save the arrays with the form data А затем добавил session_start();$images = $_SESSION['images']; до //create the form and populate it

4. Что не сработало? Сеанс должен работать нормально. Пожалуйста, проверьте свои значения. Например, запустите этот код: $name = "Vikk"; session_start(); $_SESSION['name'] = $name; echo $_SESSION['name']; он выведет Vikk

5. когда я сказал, что это не сработало, я имел в виду, что после того, как я заполнил свою форму и нажал «Сохранить», я скопировал и вставил URL-адрес в свой PHP-файл в браузере, а значения переменных были нулевыми. PS= может $_SESSION['name'] хранить массив? и если да, то какой синтаксис? это похоже $_SESSION['name'][0] на etc?

Ответ №2:

Изменение области видимости переменных на большую область может помочь. Кроме того, проверьте, есть ли у вас post-запрос, прежде чем обновлять значения.

 <?php
    if(sizeof($_POST) >0)
    {
      //UPDATE VALUES
    }
?>
 

Ответ №3:

Если вы хотите постоянное хранение состояния между разными страницами, вам следует использовать сеансы, указав session_start(); начало вашего скрипта. После этого каждая переменная $_SESSION[$ x] будет сохранена и будет доступна вашим скриптам.

Однако в данном конкретном случае, отвечая на ваш вопрос: «Есть ли способ сохранить значения массива, чтобы форма всегда заполнялась последними сохраненными значениями?», Проще просто использовать переменную $ _POST, если она уже существует:

 <?php
if(!$_POST){
    $_POST = array();
    foreach(array("i0","i1","i2","i3") as $i) $_POST[$i]="";
    foreach(array("u0","u1","u2","u3") as $i) $_POST[$i]="";
    foreach(array("t0","t1","t2","t3") as $i) $_POST[$i]="";
}
foreach($_POST as $k=>$v)  filter_input(INPUT_POST,$k,FILTER_SANITIZE_SPECIAL_CHARS);

//save the arrays with the form data
$images = array($_POST["i0"], $_POST["i1"], $_POST["i2"], $_POST["i3"]);
$urls   = array($_POST["u0"], $_POST["u1"], $_POST["u2"], $_POST["u3"]);
$titles = array($_POST["t0"], $_POST["t1"], $_POST["t2"], $_POST["t3"]);


//print the arrays
print_r($images);
print_r($urls);
print_r($titles);
//create the form and populate it
echo "<p><form method='post' action='".$_SERVER['PHP_SELF']."';";
$x = 0;
while ($x <= 3) {
   echo"<div>
            <input name='i".$x."' type='text' value='".$images[$x]."'>
            <input name='u".$x."' type='text' value='".$urls[$x]."'>
            <input name='t".$x."' type='text' value='".$titles[$x]."'>";
       $x  ;
}
?>
<br>
<input type="submit" name="sumbit" value="Save"><br>
</form>
 

Примечание: эта строка foreach($_POST as $k=>$v) filter_input(INPUT_POST,$k,FILTER_SANITIZE_SPECIAL_CHARS);
должно быть достаточно, чтобы защитить вас от основных атак XSS.
Обратите внимание также, что в целом лучше всего следовать шаблону перезагрузки страниц с помощью GET after POST, что делает вас менее восприимчивыми к повторным отправкам формы, и в этом случае использование сеансов для хранения является лучшим решением.

Комментарии:

1. для ввода фильтра требуется, чтобы версия интерпретатора PHP была> = 5.2.0 (см. php.net/manual/en/function . filter-input.php ) Вы можете безопасно удалить строку, которая его содержит, если используете другие способы очистки ваших входных данных.

Ответ №4:

То, что привело меня сюда, было несколько другим видом зверя. У меня возникла проблема с последующим запросом post от AXIS IP camera, и мне нужно было сохранить последнее имя файла в запросах. В случае, если кто-то наткнется здесь, ища какой-то способ кэширования переменных, а СЕАНС не подходит, возможно, стоит взглянуть на альтернативный кэш PHP:

Примечание: В отличие от многих других механизмов в PHP, переменные, сохраненные с помощью apc_store(), будут сохраняться между запросами (до тех пор, пока значение не будет удалено из кэша).

http://php.net/manual/en/book.apc.php

Ответ №5:

Используйте сеансы: http://php.net/manual/en/function.session-start.php

Ответ №6:

Вы можете использовать сеансы для хранения значений и написания правил для заполнения полей формы после проверок при отправке данных. Также функция isset() очень полезна, чтобы избежать ошибок «не определено».

Ответ №7:

Решение, которое вы ищете, — это сессия. Используется $_SESSION для хранения значений ваших переменных. Например, в конце скрипта:

 $_SESSION['images'] = $images;
 

и во вводе формы:

 <input name='i".$x."' type='text' value='".(isset($_SESSION['images']) ? 
$_SESSION['images'] : '')."'>