2011-04-06 58 views
0

帮助!我有一些麻烦,获取一些条件语句到我的PHP脚本的表单。只有在_POST填入时才将内容发送到变量

这是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) ; 

我已经有了 '地址1' 和 '邮政编码',所以一些jQuery验证他们不是一个问题,因为他们总是会返回一个值。如果“地址2”和“城市”未填写(也许填表人没有第二行到他们的地址,或者没有按照他们的想法放入城市 - 正确 - 邮政编码是足够的在找到他们的地址时),他们仍然在电子邮件上返回一个值('没有')。

我想要发生的是对于留空的表单输入,根本没有电子邮件。换句话说,如果$ address2变量是空的,不要给我发送“空格”。例如,如果这一切都完成我得到这个,这是伟大的:

地址:1测试大街,伦敦西区,测试城市,AB1 23C

如果有一个领域缺少我会得到这一点,这是一个有点乱:

地址:1测试街,试验城市,AB1 23C

,但我想这一点,因为它的漂亮整洁:

地址:1测试街,测试城,AB1 23C

我一直试图让我的头围绕isset函数,但没有任何运气。我也尝试了一个基本的'如果'的声明,但似乎无法得到任何地方。我必须承认,php不是我的强项,我花了很多时间在这方面没有成功。非常感激你的帮助!

非常感谢,

马丁。

+2

您的代码似乎易受电子邮件标头注入的影响。另外:''我在'address1'和'postcode'上有一些jQuery验证,所以它们不是问题,因为它们总是会返回一个值。“”你不能相信客户端验证按照你的意愿工作如果他们愿意,用户可以绕过它或制作自己的表格。 – Hammerite 2011-04-06 12:13:09

+0

如果您使用客户端来首先显示表单,则可以绕过它。 – 2011-04-06 13:10:43

回答

1

对于这种“参数过滤”有问题,我喜欢使用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功能)级联的值删除空值 。

使用此方法,即使您有很多参数,代码仍然易于阅读。

+0

感谢Guillaume--完美的作品!有没有可能只用一个变量来做到这一点?即。如果我有一个不属于组的组成部分的盒子,就像地址一样,它可能会也可能不会被填充。如果是,我需要查看电子邮件中的内容,如果不是,我不要不想在邮件中显示任何内容。 – Martin 2011-04-06 15:30:12

0

定义导入之前一个新的PHP变量DB

$address=$_REQUEST["address1"]; 

if (trim($_REQUEST["address2"]!='')) 
$address.=','.$_REQUEST["address2"] 
0

isset()函数,如果变量已经设置返回true - 即,是已经宣布并具有非NULL值为。除了那个关于NULL的位之外,isset()没有提及该变量的内容

要测试变量是否真正空的(一个空字符串,NULL,FALSE,0,空数组等)中,使用适当命名空():)

实施例:

$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. 如果该参数不为空,则将 附加到$地址。
  4. 如果它为空,则附加一个空的 字符串。

如果你以前没有见过它,condition ? expr_if_true : expr_if_false语法被称为三元运算符

一点点清洁,国际海事组织。更少if/else语句运行。

+0

正如Hammerite上面提到的那样,在将其注入到mail()调用(或将其放入数据库或将其打印回屏幕等)之前,先对此输入进行消毒。始终认为来自客户的任何和所有输入都是邪恶的。 – Adam 2011-04-06 12:17:43

+0

你可以选择上尉的代码,这似乎是个诀窍。唯一的问题是分隔数组项的逗号出现在每个项目之前,这意味着在'address1'之前有一个逗号。内爆功能会改变吗? – Martin 2011-04-06 15:11:30

+0

或者将'address1'从数组中取出并将其与'address'连接起来? – Martin 2011-04-06 15:15:29