#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(), будут сохраняться между запросами (до тех пор, пока значение не будет удалено из кэша).
Ответ №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'] : '')."'>