【问题标题】:Compare Strings given in $_POST with php将 $_POST 中给出的字符串与 php 进行比较
【发布时间】:2008-10-08 20:22:03
【问题描述】:

我有一个发送大小东西的表单,我需要查看字符串的大小,以便我可以相应地设置价格。当我尝试这样做时,它说它们不相等,并且我没有得到任何价格。这是我正在使用的代码:

if ($_POST['sizes'] == "Small ($30)"){$total = "30";}
if ($_POST['sizes'] == "Medium ($40)"){$total = "40";}
if ($_POST['sizes'] == "Large ($50)"){$total = "50";}
else {$total = $_POST['price'];}

我在这里做错了什么?我可以回显 $_POST['sizes'],它正好给了我这些东西之一。

【问题讨论】:

    标签: php post compare


    【解决方案1】:

    Paul Dixon said 是正确的。我是否还建议使用 switch 语句而不是笨重的 if 语句块(实际上其中有一个逻辑错误,我可能会添加 - $total 将始终等于 $_POST['price'] 而不是 'Large ($50)'

    <?php
    
    switch ( $_POST['sizes'] )
    {
        case 'Small ($30)' :
            $total = 30;
            break;
        case 'Medium ($40)' :
            $total = 40;
            break;
        case 'Large ($50)' :
            $total = 50;
            break;
        default:
            $total = $_POST['price'];
            break;
    }
    
    ?>
    

    【讨论】:

    • @strager:这两个都不是错误,第二个甚至违反了 Zend 的编码标准。
    • 好吧,将默认情况放在底部是最佳实践,但不是绝对的。所以是的,从技术上讲,这里可能存在错误,但通常我认为默认情况下的 break 语句是多余的。
    【解决方案2】:

    这是 switch/case 语句的一个很好的候选,你的 'else' 是默认值。

    此外,如果您的 $_POST['sizes'] 不是 Large,则在 Medium 和 Large 不使用 elseif 的情况下,您的 $total 将始终为 $_POST['price']。这也可能让你失望。

    【讨论】:

      【解决方案3】:

      所以你知道,你的 if/else 的问题是最后一个 else 总是在发生。开关仍然更好,但您的代码应该是这样的:

      if ($_POST['sizes'] == "Small ($30)") { $total = "30";
      } else if ($_POST['sizes'] == "Medium ($40)") { $total = "40";
      } else if ($_POST['sizes'] == "Large ($50)") { $total = "50";
      } else { $total = $_POST['price']; }
      

      对于每个说问题在于 30 美元、40 美元等的人来说,事实并非如此。变量不能以数字开头,因此 PHP 将忽略 $40 等。

      【讨论】:

      • 你可能是对的。仍然一般的建议是在不需要插值/转义序列时使用单引号,以避免解释器的额外工作。
      • 你是对的,但是解释器的速度差异是毫秒超过数百万次。最大的区别是在编写带有 HTML 的字符串并且必须转义所有双引号时。
      【解决方案4】:

      或者,甚至比笨重的开关更好,您可以利用这个简单的逻辑并练习“数据驱动编程”:

      $vals = array(
          'Small ($30)' => 30,
          'Medium ($40)' => 40,
          'Large ($50)' => 50
      );
      
      $total = array_key_exists($_POST['sizes'], $vals)
          ? $vals[$_POST['sizes']]
          : $_POST['price'];
      

      【讨论】:

      • 看起来非常漂亮和整洁,但我不确定它是如何工作的,所以我会坚持使用我知道的 switch 语句
      • 嘿,这没什么错 - 任何适合你的。不过,如果您确实需要解释,请询问 - 我很乐意提供帮助。
      【解决方案5】:

      除了这个错误的实际原因之外,如果你使用了标签以外的其他值,它是可以避免的,例如:

      <select name="sizes">
          <option value="small">Small ($30)</option>
          <option value="meduim">Medium ($40)</option>
          <option value="large">Large ($50)</option>
      </select>
      

      【讨论】:

      • +1 来自我,但总有可能Small ($30) 价值;)
      • 如果省略VALUE属性,则元素内容实际上就是值。 ;)
      • 我意识到,我开玩笑说有机会 是标记,因此价值标签上的 OP 意识.
      • 是的,我需要专门用于处理订单的值。
      【解决方案6】:

      尝试使用单引号

      if ($_POST['sizes'] == 'Small ($30)'){$total = "30";}
      elseif ($_POST['sizes'] == 'Medium ($40)'){$total = "40";}
      elseif ($_POST['sizes'] == 'Large ($50)'){$total = "50";}
      else {$total = $_POST['price'];}
      

      双引号字符串使用变量插值,因此 $ 符号变得有意义!请参阅this manual page,了解如何在 PHP 中声明字符串文字的不同之处。

      (已编辑以纠正逻辑错误 - 正如其他人指出的那样,此处的开关会更清晰)

      【讨论】:

        【解决方案7】:

        $total 是一个字符串吗?

        $total = "30";是字符串的语法。 $总计 = 30;对于数字是正确的。

        【讨论】:

        • 好吧,当它来自 POST 时,它会是一个字符串。
        【解决方案8】:

        这里没有安全漏洞吗?如果有人只是为默认条款提交他们想要的任何价格怎么办?

        【讨论】:

          【解决方案9】:
          // remove any non-decimal characters from the front, then extract your value,
          // then remove any trailing characters and cast to an integer
          $total = (integer)preg_replace("/^\D*(\d+)\D.*/", "$1", $_POST['sizes']);
          if (!$total) $total = $_POST['price'];
          

          【讨论】:

          • 总挑剔:第二个 \D 不需要。这假设 xxx(40) 应该是 40,而不是默认值,虽然这不是一个挑剔。
          • 好吧,问题是我需要 Small (30) 等来实际处理该项目,所以剥离它并没有真正的用处……否则我只需要输入 30。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-28
          • 1970-01-01
          • 2020-04-15
          • 1970-01-01
          • 2012-10-06
          • 2019-01-22
          相关资源
          最近更新 更多