【问题标题】:Only sending content to a variable if _POST is filled in如果 _POST 已填写,则仅将内容发送到变量
【发布时间】:2011-04-06 11:07:41
【问题描述】:

帮助!我在将一些条件语句放入表单的 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) ;

我已经对“address1”和“postcode”进行了一些 jQuery 验证,因此它们不是问题,因为它们总是会返回一个值。如果没有填写“address2”和“city”(也许填表人的地址没有第二行,或者没有按照他们的想法填写城市——正确——邮政编码就足够了在找到他们的地址时)他们仍然会在电子邮件中返回一个值(“无”)。

我希望发生的事情是让留空的表单输入根本不发送任何电子邮件。换句话说,如果 $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 函数,但没有任何运气。我也尝试了一个基本的“if”语句,但似乎也无法获得任何结果。我必须承认,php 不是我的强项,我在这方面花了很多时间但没有成功。非常感谢您的帮助!

非常感谢,

马丁。

【问题讨论】:

  • 您的代码似乎容易受到电子邮件标头注入的影响。另外:"I've got some jQuery validation on 'address1' and 'postcode' so they're not an issue as they'll always return a value." 您不能相信客户端验证会按照您的意愿工作 - 用户可以绕过它或根据需要制作自己的表单。
  • 如果您首先使用客户端显示表单,您可以绕过它。

标签: php variables if-statement conditional isset


【解决方案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. 打印与 a 连接的值 逗号(implode 函数)。

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

【讨论】:

  • 感谢 Guillaume - 效果很好!是否可以仅使用 1 个变量来执行此操作? IE。如果我有一个不属于组的框,例如地址,它可能会或可能不会填写。如果是,我需要查看电子邮件中的内容,如果不是,我不'不想在电子邮件中显示任何内容。
【解决方案2】:

在导入到 db 之前定义一个新的 php 变量

$address=$_REQUEST["address1"];

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

【讨论】:

    【解决方案3】:

    isset() 如果变量 已设置 则返回 true - 即已被 声明 并且具有 非 NULL 值.除了关于 NULL 的那一点,isset() 没有说明该变量的 contents

    要测试变量是否真的为空(空字符串、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,strip 任何散乱的空白(与 修剪())。
    3. 如果参数不为空, 将其附加到 $address。
    4. 如果为空,则追加一个空 字符串。

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

    有点清洁,IMO。运行的 if/else 语句更少。

    【讨论】:

    • 正如 Hammerite 上面提到的,在将其注入 mail() 调用(或将其放入数据库,或将其打印回屏幕等)之前清理此输入。始终假设来自客户端的任何和所有输入都是邪恶的。
    • 您替代船长的代码似乎可以解决问题。唯一的问题是分隔数组项的逗号出现在每个项之前,这意味着“address1”之前有一个逗号。内爆函数会改变这种情况吗?
    • 或者可能从数组中取出 'address1' 并将其与 'address' 连接起来?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 2012-04-27
    相关资源
    最近更新 更多