#php #html #forms
#php #HTML #формы
Вопрос:
Итак, я новичок в PHP и пытаюсь создать форму. Я принимаю кучу параметров и хочу обработать их на той же странице. Я не уверен, как это сделать без гигантского if-else, содержащего всю страницу как if($_POST)
. Это не кажется идеальным.
Кроме того, я обнаружил, что часто делаю следующее. Есть ли какой-нибудь способ сократить это? Все имена остаются прежними.
$name = $_REQUEST["name"];
$gender = $_REQUEST["gender"];
$age = $_REQUEST["age"];
И у меня есть много строк, которые как раз это и делают, и это кажется ужасно неэффективным
Комментарии:
1. Почему вы хотите выполнить переименование переменных? Вы можете получить доступ к значению, просто используя массив.
<?php echo $_REQUEST['foo']; ?>
для меня выглядит просто отлично. Для формы: я использую следующую структуру: <?php if(isset($_POST[‘submit’])) { … // выполнить код здесь } ?><html><!— вот форма … —>….2. GeneSys намекает на то, что полезно знать, исходит ли ваша переменная от вас или от пользователя. С переименованием становится трудно сказать. Возможно, вы захотите принять некоторые меры предосторожности наряду с переименованием. «Правила современного мира: предполагайте злой умысел».
Ответ №1:
Для этого вы можете использовать функцию extract(). Но у этого есть недостаток безопасности: существующие переменные могут быть перезаписаны, если кто-то добавит переменные в заголовок публикации.
Редактировать: решение hsz лучше
Ответ №2:
Какой процесс вы выполняете с if ..else .. если вам нужно опубликовать код, чтобы мы могли сообщить вам, как это можно сократить.
вы можете избежать назначения для каждой переменной, используя функцию extract.
extract($_POST);
Но имейте в виду, что это может перезаписать вашу существующую переменную, если они названы так же, как ваши элементы управления вводом.
Комментарии:
1. Опасный ход! Это приводит к перезаписи ваших переменных пользователем, если пользователь установит некоторые значения в address (GET) !
2. Вы действительно не должны. Есть причина, по которой
register_globals
в эти дни по умолчанию отключено. Это вызывает больше проблем, чем того стоит.
Ответ №3:
Прекратите использовать $_REQUEST, потому что это комбинация $ _COOKIE , $ _POST и $_GET. Это становится угрозой безопасности.
Комментарии:
1. Это не так. «Угроза безопасности» — это неправильное присвоение. Проблема, которую это создает, заключается в «фиксации cookie», которая в зависимости от варианта использования становится неудобством для удобства использования, а не проблемой безопасности; особенно в примере OPs. (Я знаю, что на SO это описано лишь бегло, но все же.)
Ответ №4:
Вместо использования $_REQUEST
вам следует использовать $_POST
здесь.
$keys = array('name', 'gender', 'age');
foreach ( $keys as $key ) {
if ( isset($_POST[$key]) ) {
$$key = $_POST[$key];
}
// optional:
else {
$$key = ''; // default value
}
}
Комментарии:
1. Хотя это почти то же самое, что extract ().
2. С
extract
у вас нет контроля над передаваемыми данными.3. Вы и здесь ничего не контролируете.
isset()
нет функции безопасности. С extract проще применить префикс к входящим переменным или array_map к экранирующей функции.4. Я имею в виду, что если пользователь разместит дополнительные переменные, подобные
$_POST['password']
then usingextract
function , она будет перезаписана иrapidash
не будет иметь об этом ни малейшего представления — это доставит гораздо больше проблем, чем того стоит.5. Ладно, ты прав. Вы фильтруете по именам переменных. Но так и есть
EXTR_SKIP
. ИEXTR_PREFIX_ALL
мне кажется лучшим вариантом относительно того, чего хочет OP. (Меньше кода для извлечения его переменных.)
Ответ №5:
Волшебные кавычки? http://php.net/manual/en/security.magicquotes.php
Ответ №6:
Для начала: переверните это. Не делайте
if ($_POST) {
// Your handling code
} else {
echo "No data!";
}
сделать
if (!$_POST) {
die("No data!");
}
// Your handling code
Ответ №7:
Вы можете использовать extract(), однако это означает, что вы вводите множество переменных, о которых вы (возможно, не знаете), в свою текущую область.
Мое предложение состояло бы в том, чтобы перебрать ваш массив и что-то сделать с переменными там (например, — проверка)
foreach ($_POST as $key => $valu) {
//do something with the variables
}
Также не используйте $_REQUEST
, если вы действительно не хотите проверить $ _GET, $ _POST и $ _COOKIE. Используйте правильный массив при доступе к переменным, иначе люди могут отправлять данные, которых вы не ожидаете.