【问题标题】:Extract values from a set of checkboxes从一组复选框中提取值
【发布时间】:2021-04-09 17:00:16
【问题描述】:

我一直在努力解决这个问题。我有一个脚本,它从我的网站获取表单帖子,并将数据以格式精美的电子邮件发送到我的电子邮件地址。我遇到的问题是表单必须在用户填写时计算运行总计,其中一部分来自选择框的值作为一个变量,复选框的值作为另一个变量,加在一起形成总计。为了使这项工作,我必须在我的表单中有一个隐藏的复选框,其值为“0”,标记为已选中。因此,我发送到 phpmailer 的数组的索引计数始终至少为 1。当没有选中其他选项并且仅选中隐藏的复选框时,它会在电子邮件中完美返回“未选择选项”。当我选中另一个选项或多个选项时,它会将它们正确发送到带有
标签的表单,以便它们按行顺序显示。问题是,无论我做什么,最后一个 $optiontype 都会重复并在我的电子邮件表单中显示两次。

screenshot of email form

我认为问题在于我的代码中的最后一个条件语句。

if (isset($_POST['optiontype'])) { $arraycount = count($_POST['optiontype']);

    for ($index = 0; $index < count($_POST['optiontype']); $index++) {
        $value = $_POST['optiontype'][$index];
        
        if ($value == '0' && $arraycount == 1) {
            $value_text = 'No Options Selected';
        }  
        if ($value == '70') {
            $value_text = '$70 Green Plus';
        }
        if ($value == '75') {
            $value_text = '$75 Subterranean Termite Treatment';
        }
        if ($value == '50') {
            $value_text = '$50 Freezer-Standalone';
        }
        if ($value == '25') {
            $value_text = '$25 Wet Bar Refrigerator/2nd Refrigerator';
        }
        if ($value == '150') {
            $value_text = '$150 Pool/Spa Combo';
        }
        if ($value == '150+0') {
            $value_text = '$150 Additional Pool or Spa';
        }
        if ($value == '300') {
            $value_text = '$300 Salt Water Pool (Includes Pool/Spa Combo)';
        }
        if ($value == '100') {
            $value_text = '$100 Well Pump';
        }
        if ($value == '75+0') {
            $value_text = '$75 Septic System/Sewage Ejector Pump & Septic Tank Pumping';}
        if ($value == '90') {
            $value_text = '$90 External Water Line Repair';
        }
        if ($value == '195') {
            $value_text = '$195 External Water Line + Sewer & Septic Line Repair';
        }  
        
        if ($index < $arraycount) {
            $optiontype .= $value_text . "<br>";
        } else {
            $optiontype .= $value_text;
        }
        
    }

【问题讨论】:

  • 好的,因此展望未来,此代码将非常难以维护,尤其是在您更改价格时。相反,我会将您所有的产品放入一个数组中(或者 DB 会更好)并做这样的事情。 $products = ['50' =&gt; '$50 Freezer-Standalone', '75' =&gt; '$75 Subterranean Termite Treatment']; $value_text = $products[$value];
  • 您甚至可以检查产品是否首先存在于数组中,基本上 if/else 代码将被证明难以维护
  • 这里有一个很好的教程,展示了如何在 PHP 中使用多个选择框 - geeksforgeeks.org/…
  • @hppycoder 说了什么!这个问题真的和 PHPMailer 一点关系都没有,所以我删掉了对它的引用。您可以通过使用foreach 进行循环和match 进行比较来简化您的脚本,但是所有这些价格和名称无论如何都应该在数据库中。
  • 我感谢所有 cmets 并同意...但我们大约每 4 年更改一次价格,我们的整个产品目录只有大约 50 件商品。这应该只是为我的客户和我的客户提供简单的便利,以确保我获得输入订单所需的信息。在这个时候,我真的只想知道为什么最后一个选项一直重复......它伤害了我的大脑,我已经尝试了我能想到的每一个条件。

标签: php forms


【解决方案1】:

与上面的 cmets 一起工作,我在一个小示例中工作,该示例将有一个名为 $options 的变量,它是来自 $_POST['optiontype'] 中的数组选项的字符串

<?php
$products = [
    '70' => '$70 Green Plus',
    '75' => '$75 Subterranean Termite Treatment',
    '50' => '$50 Freezer-Standalone',
    '25' => '$25 Wet Bar Refrigerator/2nd Refrigerator',
    '150' => '$150 Pool/Spa Combo',
    '150+0' => '$150 Additional Pool or Spa',
    '300' => '$300 Salt Water Pool (Includes Pool/Spa Combo)',
    '100' => '$100 Well Pump',
    '75+0' => '$75 Septic System/Sewage Ejector Pump & Septic Tank Pumping',
    '90' => '$90 External Water Line Repair',
    '195' => '$195 External Water Line + Sewer & Septic Line Repair'
];

$values = [];

// this should come from your real $_POST but I just made it up
// showing an element named notFound as it will be ignored
$_POST = ['optiontype' => ['70', '300', '75+0', 'notFound']];

if (isset($_POST['optiontype'])) {
    foreach ($_POST['optiontype'] as $option) {
        if(!empty($products[$option])) {
            $values[] = $products[$option];
        }
    }
}

$options = implode("<br>", $values);

var_dump($options);

输出:

string(127) "$70 Green Plus<br>$300 Salt Water Pool (Includes Pool/Spa Combo)<br>$75 Septic System/Sewage Ejector Pump & Septic Tank Pumping"

【讨论】:

  • 那是令人惊叹且非常简洁的代码!非常感谢,我现在就试试看。
  • 关于我的代码已经说了很多,可能是第一次被称为“惊人”或“整洁”。它应该对你有用,只要确保你取出我的$_POST 设置。我想让你看看如果你的表格是正确的,它应该做什么
  • 哦,您还可以在显示复选框时使用$products 数组。这样,您只需在应用程序中更新一次,它就会无处不在。
猜你喜欢
  • 2019-08-30
  • 2019-05-28
  • 1970-01-01
  • 2020-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
相关资源
最近更新 更多