Отправка содержимого в переменную только в том случае, если _POST заполнен

Помощь! У меня возникли проблемы с вводом некоторых условных операторов в мой php-скрипт для формы.

Это суть HTML:

<input type="text" name="address1" id="address1" class="required" />
<input type="text" name="address2" id="address2" />
<input type="text" name="city" id="city" />
<input type="text" name="postcode" id="postcode" class="required" />

И php выглядит примерно так:

$address1 = $_REQUEST["address1"] ;
$address2 = $_REQUEST["address2"] ;
$city = $_REQUEST["city"] ;
$postcode = $_REQUEST["postcode"] ;

$message = 
"address: $address1, " .
"$address2, " .
"$city, " .
"$postcode" .

$sent = mail($to, $subject, $message, 'From:' . $email_address) ;

У меня есть некоторая проверка jQuery на «адрес1» и «почтовый индекс», поэтому они не являются проблемой, поскольку они всегда будут возвращать значение. Если «адрес2» и «город» не заполнены (возможно, у заполнителя формы нет второй строки для своего адреса или он не вводит город, как они думают — правильно — что почтовый индекс будет достаточным при поиске своего адреса) они по-прежнему возвращают значение («ничего») в электронном письме.

То, что я хотел бы сделать, это то, что входы формы, которые оставлены пустыми, ничего не отправляют по электронной почте. Другими словами, если переменная $address2 пуста, не присылайте мне «пустое место». Например, если все будет готово, я получу это, и это здорово:

адрес: 1 Test Street, West End, Test City, AB1 23C

Если бы поле отсутствовало, я бы получил это, что немного беспорядочно:

адрес: 1 Test Street, , Test City, AB1 23C

Но я хотел бы это, потому что это красиво и аккуратно:

адрес: 1 Test Street, Test City, AB1 23C

Я пытался разобраться с функцией isset, но мне не повезло. Я также пробовал базовый оператор «если», но, похоже, тоже ничего не могу с этим сделать. Я должен признать, что php не является моей сильной стороной, и я потратил много времени на это безуспешно. Ваша помощь очень ценится!

Большое спасибо,

Мартин.


person Martin    schedule 06.04.2011    source источник
comment
Ваш код уязвим для внедрения заголовков электронной почты. Кроме того: "I've got some jQuery validation on 'address1' and 'postcode' so they're not an issue as they'll always return a value." Вы не можете доверять проверке на стороне клиента, чтобы она работала так, как вы этого хотите - пользователь может обойти ее или создать свою собственную форму, если они того пожелают.   -  person Hammerite    schedule 06.04.2011
comment
Вы можете обойти это, если вы используете клиентскую сторону для отображения формы в первую очередь.   -  person Explosion Pills    schedule 06.04.2011


Ответы (3)


Для такого рода проблем с «фильтрацией параметров» мне нравится использовать функции массива PHP.

Например:

<?php
$aMessage = array();

$aMessage[] = $_REQUEST["address1"] ;
$aMessage[] = $_REQUEST["address2"] ;
$aMessage[] = $_REQUEST["city"]     ;
$aMessage[] = $_REQUEST["postcode"] ;

$aMessage = array_filter($aMessage);

$message = (implode(', ', $aMessage));

echo $message;
?>

Что оно делает:

  1. заполнить массив разными параметрами.
  2. удалите пустые значения с помощью функции array_filter
  3. вывести значения, объединенные запятой (функция implode).

С этим методом код остается легко читаемым, даже если у вас много параметров.

person Guillaume Boschini    schedule 06.04.2011
comment
Спасибо, Гийом, это работает отлично! Можно ли сделать это только с 1 переменной? т.е. если у меня есть поле, которое не является частью группы, например, адрес, и оно может быть заполнено или не заполнено. Если это так, мне нужно увидеть содержимое в электронном письме, если это не так, я не не хочу ничего показывать в электронной почте. - person Martin; 06.04.2011

определить новую переменную php перед импортом в БД

$address=$_REQUEST["address1"];

if (trim($_REQUEST["address2"]!=''))
$address.=','.$_REQUEST["address2"]
person Capitaine    schedule 06.04.2011

isset() возвращает значение true, если переменная была установлена, т. е. была объявлена и имеет не NULL значение. Помимо этого фрагмента о NULL, isset() ничего не говорит о содержимом этой переменной.

Чтобы проверить, действительно ли переменная пуста (пустая строка, NULL, FALSE, 0, пустой массив и т. д.), используйте метод с метким названием empty() :)

Пример:

$a = NULL;
$b = '';
// $c we won't declare
echo isset($a); // False - $a has a NULL value
echo isset($b); // True - $b is set to a non-NULL Value. empty() will return True too.
echo isset($c); // False - $c is not set.

Другой способ сделать то, что капитан упомянул выше:

$address = "";
foreach( array( "address1", "address2", "address3" ) as $param )
{
    $param = trim($_REQUEST[$param]);
    $address .= !empty( $param ) ? ', '.$param : "";
}

Как это работает:

  1. Определите имена элементов в массиве $_REQUEST, который вы хотите.
  2. Вы перебираете каждый элемент, извлекаете его значение из $_REQUEST, удаляете все лишние пробелы (с помощью функции trim()).
  3. Если параметр не пустой, добавьте его к $address.
  4. Если он пуст, вы добавляете пустую строку.

Если вы еще не видели, этот синтаксис condition ? expr_if_true : expr_if_false называется тернарным оператором.

Немного чище, имхо. Меньше операторов if/else.

person Adam    schedule 06.04.2011
comment
И, как упоминалось выше Hammerite, дезинфицируйте этот ввод, прежде чем вводить его в вызов mail() (или помещать его в БД, или печатать обратно на экран и т. д.). Всегда предполагайте, что любой ввод, поступающий от клиента, является злом. - person Adam; 06.04.2011
comment
Ваша альтернатива кодексу капитана, кажется, помогает. Единственная проблема заключается в том, что запятая, разделяющая элементы массива, появляется перед каждым элементом, что означает наличие запятой перед «address1». Изменит ли это функция implode? - person Martin; 06.04.2011
comment
или, может быть, взять «адрес1» из массива и объединить его с «адресом»? - person Martin; 06.04.2011