【问题标题】:PHP - Taking Option Values With Switch Statements - Not Working As Expected?PHP - 使用 Switch 语句获取选项值 - 未按预期工作?
【发布时间】:2015-04-29 18:47:53
【问题描述】:

我正在处理一种目录。一个选择部分有一个用户可以选择他们的状态的地方。下一个选择部分包含 4 个列表值。

当他们选择适当的状态和列表类型时,它应该撤回该状态的列表。

很遗憾,我遇到了 2 个问题。

  1. 前 4 种列表类型运行良好。如果您选择加利福尼亚并且前 2 个列表类型之一,所有数据都会返回。但是,如果您选择一个州和清单类型 3 - 4,它会引发我创建的错误“请选择一个州和一个清单类型”。这没有意义,因为第 3 和第 4 个列表类型的代码与第 2 个相同。

  2. 我正在使用 switch 命令来触发每个状态的类 >> 功能。我已经提供了这个样子的精简版本,但是我有 600 多行 switch/case 语句,这似乎太过分了。但是不要使用 if/elseif 命令会更多产。

HTML

<form action="" method="post">
        <select name="state">
            <option>Choose State</option>           
            <option value="AL">AL</option>
            <option value="AK">AK</option>
            <option value="AZ">AZ</option>
            <option value="AR">AR</option>
        </select>

        <select name="type">
            <option>Type</option>
            <option value="location">Location</option>  
            <option value="hotels">Hotels</option>              
            <option value="cars">Cents</option>     
            <option value="trucks">Trucks</option>      
        </select>
        <p><input type="submit" name="submit" value="Search For" /></p>
    </form>

PHP

if($_SERVER['REQUEST_METHOD'] == 'POST') {

$state              = $_POST['state']; 
$accommodation_type = $_POST['accommodation-type'];             

if( isset($state) && (isset($accommodation_type)) ) {       


            if($accommodation_type == 'location') {
                require('includes/location.php');
                    switch($state) {
                        case $state == 'AL':
                            $location = new Location();
                            $location->Alabama_Location();
                            break;                                 
                        case $state == 'AK':
                            $location = new Location();
                            $location->Alaska_Location();
                            break;                                     
                        case $state == 'AZ':
                            $location = new Location();
                            $location->Arizona_Location();
                break;                                                 
                    }   
                }


            elseif($accommodation_type == 'hotels') {
                require('includes/hotels.php');
                switch($state) {
                    case $state == 'AL':
                        $hotel = new Hotels();
                        $hotel->Alabama_Hotels();
                        break;                                     
                    case $state == 'AK':
                        $hotel = new Hotels();
                        $hotel->Alaska_Hotels();
                        break;                                     
                    case $state == 'AZ':
                        $hotel = new Hotels();
                        $hotel->Arizona_Hotels();
                 break;                                                
                }   

            } else { 
                echo "Please choose a state and an accommodation type"; 
            }


} else { 

} } else {}

所以我需要一种方法来简化这一点,因为我已经浓缩了这一点,当你统计 50 个州 x 4 个类别时,你会得到 200 个案例陈述。显得过分了。

此外,我仍然不明白为什么它会为前 2 个选项加载正确的数据,而不是最后 2 个,因为我所做的只是复制工作代码并使用不同的数据重复它。

另外,它不会检查是否同时选择了状态和类型。它仅在未选择状态时向用户显示警告。

有什么想法吗?感谢您的帮助。

【问题讨论】:

  • 为什么每个类别的每个状态都有一个对象?为什么不是$hotel = new Hotels($state);,然后是$hotel-&gt;Hotels();?或者直接修改为$hotel-&gt;Hotels($state);。而且您的if 语句缺少"cars""trucks" 的选择器。
  • 我认为你需要在你的帖子中获得$_POST['type'] 而不是$_POST['accommodation-type']

标签: php forms switch-statement


【解决方案1】:

您的switch 语句语法错误。通过使用case $state == 'AL':,您实质上定义了case true: / case false:。只保留值本身。

switch($state) {
    case 'AL':
        $location = new Location();
        $location->Alabama_Location();
        break;                                 
    case 'AK':
        $location = new Location();
        $location->Alaska_Location();
        break;                                     
    case 'AZ':
        $location = new Location();
        $location->Arizona_Location();
        break;                                                 
}

此外,您不会发送任何将name 属性设置为accommodation-type 的表单字段,因此当您使用$accommodation_type = $_POST['accommodation-type']; 访问它时,您将收到nullE_NOTICE 级别错误,请改用您拥有的字段,该字段仅称为type

我也建议你看看How do I make a placeholder for a 'select' box?。另外,require 是关键字,而不是函数,因此不需要括号。

最后,对于你的许多 switch 案例,我建议如下:制作一个这样的关联数组:

$statemap = array(
    'AL' => 'Alabama',
    'AK' => 'Alaska',
    'AZ' => 'Arizona',
);

然后,为用户选择的状态调用函数:

if (isset($statemap[$state])){
    $location = new Location();
    $func = $statemap[$state].'_Location';
    $location->{$func}();
}

这将为您节省几百个cases。更动态的是,一个可以处理两个(可能更多)switch语句的函数,并定义了适当的关联数组:

function shortSwitch($map, $key, $type){
    if (isset($map[$key])){
        $class = new $type();
        $func = "{$map[$key]}_$type";
        $class->{$func}();
    }
}

这样称呼它:

shortSwitch($statemap, $state, 'Location');
shortSwitch($statemap, $state, 'Hotels');

【讨论】:

  • 谢谢!我会试一试!是的..我使用这些案例陈述的方式多么愚蠢。我应该知道的更好。也感谢您提供简化它的建议。问题是 Type 是一个类,类中的每个函数都表示一个状态,该状态具有该状态的唯一数据。我不知道有其他方法可以做到这一点。所以我有 4 个类,每个类有 50 个函数,每个函数都调用一个特定的状态页面,该页面与列表相呼应。
猜你喜欢
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
  • 2017-10-27
  • 1970-01-01
  • 2012-08-16
相关资源
最近更新 更多