Php 有没有办法缩短这个switch语句?

Php 有没有办法缩短这个switch语句?,php,mysqli,Php,Mysqli,我怎样才能把这整件事缩短?我的意思是,我尝试使用for循环,但我在这方面遇到了很多问题,因为我对这一切都很陌生。我希望这里有人能帮我。另外,您是否认为有更好的valadation形式,我想检查用户提供的数据是否与表单提供的选项相同,因此他不能提交表单中不包含的内容,以防止mysqli注入。所有这些对我来说都很不安全,也不是很安全。是的,你可以把它写得更短,因为除了默认值,你所有的动作对每个集合都是一样的 考虑以下内容,我重构了您的第一个switch语句,它的工作方式与以前完全相同 switc

我怎样才能把这整件事缩短?我的意思是,我尝试使用for循环,但我在这方面遇到了很多问题,因为我对这一切都很陌生。我希望这里有人能帮我。另外,您是否认为有更好的valadation形式,我想检查用户提供的数据是否与表单提供的选项相同,因此他不能提交表单中不包含的内容,以防止mysqli注入。所有这些对我来说都很不安全,也不是很安全。

是的,你可以把它写得更短,因为除了默认值,你所有的动作对每个集合都是一样的

考虑以下内容,我重构了您的第一个switch语句,它的工作方式与以前完全相同

  switch($act1){
     case "SUBSCRIBE":
     $error = "false";
     break;
     case "SUB & LIKE":
     $error = "false";
     break;      
     case "LIKE & COMMENT":
     $error = "false";
     break;      
     case "DISLIKE":
     $error = "false";
     break;      
     case "COMMENT":
     $error = "false";
     break;      
     case "LIKE":
     $error = "false";
     break;      
     default:
    $error = "true";
    $error_01 = "true";
    break;  
 }
 switch($act2){
     case "SUBSCRIBE":
     $error = "false";
     break;
     case "SUB & LIKE":
     $error = "false";
     break;      
     case "LIKE & COMMENT":
     $error = "false";
     break;      
     case "DISLIKE":
     $error = "false";
     break;      
     case "COMMENT":
     $error = "false";
     break;      
     case "LIKE":
     $error = "false";
     break;      
     default:
    $error = "true";
    $error_02 = "true";
    break;      
 }

switch($act3){
     case "SUBSCRIBE":
     $error = "false";
     break;
     case "SUB & LIKE":
     $error = "false";
     break;      
     case "LIKE & COMMENT":
     $error = "false";
     break;      
     case "DISLIKE":
     $error = "false";
     break;      
     case "COMMENT":
     $error = "false";
     break;      
     case "LIKE":
     $error = "false";
     break;      
     default:
    $error = "true";
    $error_03 = "true";
    break;      
 }

 switch($act4){
     case "SUBSCRIBE":
     $error = "false";
     break;
     case "SUB & LIKE":
     $error = "false";
     break;      
     case "LIKE & COMMENT":
     $error = "false";
     break;      
     case "DISLIKE":
     $error = "false";
     break;      
     case "COMMENT":
     $error = "false";
     break;      
     case "LIKE":
     $error = "false";
     break;      
     default:
    $error = "true";
    $error_04 = "true";
    break;  
 }
变得更有活力 一种更动态的方式来看待这个问题,有点基于Andrew Andrew发布的内容,就是你可以使用一个循环来循环所有的动作,并检查它们是否有错误

PHP是一个很好的工具,可以生成动态脚本,使您不必手动重复那么多代码,并且可以自动处理您所处的情况,可能无需将来编辑代码。以下是我将如何处理你的情况

switch($act1){
    case "SUBSCRIBE":
    case "SUB & LIKE":     
    case "LIKE & COMMENT":   
    case "DISLIKE":  
    case "COMMENT": 
    case "LIKE":
        $error = "false";
        break;      
    default:
        $error = "true";
        $error_01 = "true";
        break;  
}

是的,您可以将其写得更短,因为除了默认值之外,您的所有操作对于每个集合都是相同的

考虑以下内容,我重构了您的第一个switch语句,它的工作方式与以前完全相同

  switch($act1){
     case "SUBSCRIBE":
     $error = "false";
     break;
     case "SUB & LIKE":
     $error = "false";
     break;      
     case "LIKE & COMMENT":
     $error = "false";
     break;      
     case "DISLIKE":
     $error = "false";
     break;      
     case "COMMENT":
     $error = "false";
     break;      
     case "LIKE":
     $error = "false";
     break;      
     default:
    $error = "true";
    $error_01 = "true";
    break;  
 }
 switch($act2){
     case "SUBSCRIBE":
     $error = "false";
     break;
     case "SUB & LIKE":
     $error = "false";
     break;      
     case "LIKE & COMMENT":
     $error = "false";
     break;      
     case "DISLIKE":
     $error = "false";
     break;      
     case "COMMENT":
     $error = "false";
     break;      
     case "LIKE":
     $error = "false";
     break;      
     default:
    $error = "true";
    $error_02 = "true";
    break;      
 }

switch($act3){
     case "SUBSCRIBE":
     $error = "false";
     break;
     case "SUB & LIKE":
     $error = "false";
     break;      
     case "LIKE & COMMENT":
     $error = "false";
     break;      
     case "DISLIKE":
     $error = "false";
     break;      
     case "COMMENT":
     $error = "false";
     break;      
     case "LIKE":
     $error = "false";
     break;      
     default:
    $error = "true";
    $error_03 = "true";
    break;      
 }

 switch($act4){
     case "SUBSCRIBE":
     $error = "false";
     break;
     case "SUB & LIKE":
     $error = "false";
     break;      
     case "LIKE & COMMENT":
     $error = "false";
     break;      
     case "DISLIKE":
     $error = "false";
     break;      
     case "COMMENT":
     $error = "false";
     break;      
     case "LIKE":
     $error = "false";
     break;      
     default:
    $error = "true";
    $error_04 = "true";
    break;  
 }
变得更有活力 一种更动态的方式来看待这个问题,有点基于Andrew Andrew发布的内容,就是你可以使用一个循环来循环所有的动作,并检查它们是否有错误

PHP是一个很好的工具,可以生成动态脚本,使您不必手动重复那么多代码,并且可以自动处理您所处的情况,可能无需将来编辑代码。以下是我将如何处理你的情况

switch($act1){
    case "SUBSCRIBE":
    case "SUB & LIKE":     
    case "LIKE & COMMENT":   
    case "DISLIKE":  
    case "COMMENT": 
    case "LIKE":
        $error = "false";
        break;      
    default:
        $error = "true";
        $error_01 = "true";
        break;  
}
另一种方法

//declare a whitelist of things that should not produce an error
$whiteList = [
    'SUBSCRIBE',
    'SUB & LIKE',
    'LIKE & COMMENT',
    'DISLIKE',
    'COMMENT',
    'LIKE',
];

//add all of the acts to an array to loop over
$acts = [$act1, $act2, $act3, $act4];

//by default error is set to false
$error = "false";

foreach($acts as $key => $act) {
    //check if value from act is in the whitelist declared above, if its not, set `$error` to true and set `$error_*` (with key) to "true" as well.
    if(!in_array($act, $whiteList)) {
        $error = "true";
    }
}
另一种方法

//declare a whitelist of things that should not produce an error
$whiteList = [
    'SUBSCRIBE',
    'SUB & LIKE',
    'LIKE & COMMENT',
    'DISLIKE',
    'COMMENT',
    'LIKE',
];

//add all of the acts to an array to loop over
$acts = [$act1, $act2, $act3, $act4];

//by default error is set to false
$error = "false";

foreach($acts as $key => $act) {
    //check if value from act is in the whitelist declared above, if its not, set `$error` to true and set `$error_*` (with key) to "true" as well.
    if(!in_array($act, $whiteList)) {
        $error = "true";
    }
}

创建一个函数来处理相同的逻辑,并在那里应用
开关
语句。您可以只调用一个公共函数,而不是使用相同的逻辑重复相同的
switch
语句

<?php
// allowable keywords
$whiteList = [
    'SUBSCRIBE',
    'SUB & LIKE',
    'LIKE & COMMENT',
    'DISLIKE',
    'COMMENT',
    'LIKE',
];

// if $act1 is in the list of allowable keywords then set $error = "false"
if (in_array($act1, $whiteList)) {
    $error = "false";
} else {
    $error = "true";
    $error_01 = "true";
}

if (in_array($act2, $whiteList)) {
    $error = "false";
} else {
    $error = "true";
    $error_02 = "true";
}

...

创建一个函数来处理相同的逻辑,并在那里应用
switch
语句。您可以只调用一个公共函数,而不是使用相同的逻辑重复相同的
switch
语句

<?php
// allowable keywords
$whiteList = [
    'SUBSCRIBE',
    'SUB & LIKE',
    'LIKE & COMMENT',
    'DISLIKE',
    'COMMENT',
    'LIKE',
];

// if $act1 is in the list of allowable keywords then set $error = "false"
if (in_array($act1, $whiteList)) {
    $error = "false";
} else {
    $error = "true";
    $error_01 = "true";
}

if (in_array($act2, $whiteList)) {
    $error = "false";
} else {
    $error = "true";
    $error_02 = "true";
}

...
是的, 在这种情况下,您可以允许真正的切换和生成条件

function getError($act_in) {
    $error = "";
    switch($act_in) {
        case "SUBSCRIBE":
        case "SUB & LIKE":     
        case "LIKE & COMMENT":   
        case "DISLIKE":  
        case "COMMENT": 
        case "LIKE":
            $error = "false";
            break;      
        default:
            $error = "true";
            break;  
    }

    return $error;
}
是的, 在这种情况下,您可以允许真正的切换和生成条件

function getError($act_in) {
    $error = "";
    switch($act_in) {
        case "SUBSCRIBE":
        case "SUB & LIKE":     
        case "LIKE & COMMENT":   
        case "DISLIKE":  
        case "COMMENT": 
        case "LIKE":
            $error = "false";
            break;      
        default:
            $error = "true";
            break;  
    }

    return $error;
}
有几种方法:

  • 简洁的开关盒

    switch(true){
         case ($act1=='SUBSCRIBE' and $act2=='SUBSCRIBE' and .....):
         $error = "false";
         break;
         case ($act1=='SUB & LIKE' and $act2=='SUB & LIKE' and .....):
         $error = "false";
         break;      
         case ($act1=='LIKE & COMMENT' and $act2=='LIKE & COMMENT' and .....):
         $error = "false";
         break;      
         case ($act1=='DISLIKE' and $act2=='DISLIKE' and .....):
         $error = "false";
         break;      
         case ($act1=='COMMENT' and $act2=='COMMENT' and .....):
         $error = "false";
         break;      
         case ($act1=='LIKE' and $act2=='LIKE' and .....):
         $error = "false";
         break;      
         default:
        $error = "true";
        $error_01 = "true";
        break;  
     }
    
  • 如上所述的For循环

  • 创建这些字符串的TRIE并在此TRIE中搜索。若word存在,则将error设置为false,否则将其设置为true

  • 在SqlInjection上,始终使用参数并避免动态查询。这将解决SqlInjection问题有几种方法:

  • 简洁的开关盒

    switch(true){
         case ($act1=='SUBSCRIBE' and $act2=='SUBSCRIBE' and .....):
         $error = "false";
         break;
         case ($act1=='SUB & LIKE' and $act2=='SUB & LIKE' and .....):
         $error = "false";
         break;      
         case ($act1=='LIKE & COMMENT' and $act2=='LIKE & COMMENT' and .....):
         $error = "false";
         break;      
         case ($act1=='DISLIKE' and $act2=='DISLIKE' and .....):
         $error = "false";
         break;      
         case ($act1=='COMMENT' and $act2=='COMMENT' and .....):
         $error = "false";
         break;      
         case ($act1=='LIKE' and $act2=='LIKE' and .....):
         $error = "false";
         break;      
         default:
        $error = "true";
        $error_01 = "true";
        break;  
     }
    
  • 如上所述的For循环

  • 创建这些字符串的TRIE并在此TRIE中搜索。若word存在,则将error设置为false,否则将其设置为true


  • 在SqlInjection上,始终使用参数并避免动态查询。这将解决SqlInjection问题,下面是我的简短尝试

    switch($act1){
        case "SUBSCRIBE":
        case "SUB & LIKE":     
        case "LIKE & COMMENT":   
        case "DISLIKE":  
        case "COMMENT": 
        case "LIKE":
            $error = "false";
            break;      
        default:
            $error = "true";
            $error_01 = "true";
            break;  
        }
    
    $validvals=array('SUBSCRIBE','SUB&LIKE','LIKE&COMMENT','DISLIKE','COMMENT','LIKE');
    $error='false';
    
    对于($i=0;$i这是我缩短的尝试

    switch($act1){
        case "SUBSCRIBE":
        case "SUB & LIKE":     
        case "LIKE & COMMENT":   
        case "DISLIKE":  
        case "COMMENT": 
        case "LIKE":
            $error = "false";
            break;      
        default:
            $error = "true";
            $error_01 = "true";
            break;  
        }
    
    $validvals=array('SUBSCRIBE','SUB&LIKE','LIKE&COMMENT','DISLIKE','COMMENT','LIKE');
    $error='false';
    
    对于($i=0;$i)我将值放入一个数组中。类似于
    $response=array(“SUBSCRIBE”=>“false”,…);
    然后
    $error=$response[$act1];
    或在_array()中使用
    ;我对I.Dynin的另一篇帖子发表了评论。我基本上是说:代码有很多问题,但问题中提出的问题不是其中之一。我把他介绍给他。然后我离开了。当我回来时,问题不见了,他评论道:“我才20岁。”.很明显,我的评论被视为欺凌。这从来不是我的本意。我道歉。因为没有私人消息系统,我不得不公开道歉,就像这样。我只是想讨论一下代码。我会从中吸取教训,下次会变得更好。嗯,不,我从来没有把你的评论视为坏事,我只是不喜欢别人说有太多的错误,请不要给出一些原因,因为我已经在那里提到我不擅长php,我甚至在设置Cookie时遇到问题。将值放入数组。类似于
    $response=array(“SUBSCRIBE”=>“false”,…);
    然后
    $error=$response[$act1];
    或者在_array()中使用
    ;我对I.Dynin的另一篇帖子发表了评论。我基本上是说:代码有很多问题,但问题中提出的问题不是其中之一。我把他介绍给他。然后我离开了。当我回来时,问题不见了,他评论道:“我才20岁。”.很明显,我的评论被视为欺凌。这从来不是我的本意。我道歉。因为没有私人消息系统,我不得不公开道歉,就像这样。我只是想讨论一下代码。我会从中吸取教训,下次会变得更好。嗯,不,我从来没有把你的评论视为坏事,我只是不喜欢别人说这里有太多的错误,请不要给出一些原因,因为是的,我已经在那里提到过,我不擅长php,我甚至在设置Cookiet时遇到问题。只有在所有行为都相同的情况下,这才有效,否则将返回错误。这不是一个处理此问题的好方法。更不用说它看起来有多混乱了。在需要使用常量表达式的情况下d和设置错误不需要所有$ACT上的
    。这只在所有ACT都相同的情况下有效,否则将返回错误。这不是一个处理此问题的好方法。更不用说它看起来有多凌乱。在需要的情况下,不需要使用常量表达式,并且设置错误不需要