【问题标题】:PHP - conditional statement not working properlyPHP - 条件语句无法正常工作
【发布时间】:2013-07-18 16:50:13
【问题描述】:

我正在为我的移动应用程序在 API 中使用 PHP 和 JSON。我尝试编写一个注册模块,但我的部分条件语句没有按预期工作。

如果语句 1:

if(!isset($_GET['username']) || !isset($_GET['password']) || !isset($_GET['imei']) || !isset($_GET['imie']) || !isset($_GET['nazwisko']) || !isset($_GET['email']) || !isset($_GET['zgoda']) || !isset($_GET['telefon']) || !isset($_GET['zgoda2']) || !isset($_GET['kraj']));
 {
  $returning = array('error' => 'Invalid query');
  echo json_encode($returning);
  break;
 }

当缺少参数时它应该给出错误,但它总是给出错误。

我的查询:

username=konrad12&password=xxx&imei=000000000000000&nazwisko=Potter&imie=Ronald&email=xxx@xxx.pl&zgoda=1&telefon=000&zgoda2=1&kraj=Poland

如果语句 2:

 if(strlen($c) != 15 || !validEmail($f) || strlen($g) != 1 || strlen($i) != 1 || wez_id_kraju($j) == 0)
 {
  $returning = array('error' => 'Invalid query');
  echo json_encode($returning);
  break;
 } 

当 var 值不正确时它应该会出错,但它总是会出错。

我的变量:

 $z = mysql_real_escape_string($_GET['username']);
 $b = mysql_real_escape_string($_GET['password']);
 $c = mysql_real_escape_string($_GET['imei']);
 $d = mysql_real_escape_string($_GET['nazwisko']);
 $e = mysql_real_escape_string($_GET['imie']);
 $f = mysql_real_escape_string($_GET['email']);
 $g = mysql_real_escape_string($_GET['zgoda']);
 $h = mysql_real_escape_string($_GET['telefon']);
 $i = mysql_real_escape_string($_GET['zgoda2']);
 $j = mysql_real_escape_string($_GET['kraj']);

如果语句 3:

 if($g != 0 or 1 || $i != 0 or 1)
 {
  $returning = array('error' => 'Invalid query');
  echo json_encode($returning);
  break;
 } 

当 $g 或 $i 的值不是 1 或 0 时,它应该报错,但它总是报错。

请帮助我,我尝试了很多东西,但我找不到解决方案

@编辑:

我的有效邮箱功能:

    function validEmail($email)
    {
       $isValid = true;
       $atIndex = strrpos($email, "@");
       if (is_bool($atIndex) && !$atIndex)
       {
          $isValid = false;
       }
       else
       {
          $domain = substr($email, $atIndex+1);
          $local = substr($email, 0, $atIndex);
          $localLen = strlen($local);
          $domainLen = strlen($domain);
          if ($localLen < 1 || $localLen > 64)
          {
             // local part length exceeded
             $isValid = false;
          }
          else if ($domainLen < 1 || $domainLen > 255)
          {
             // domain part length exceeded
             $isValid = false;
          }
          else if ($local[0] == '.' || $local[$localLen-1] == '.')
          {
             // local part starts or ends with '.'
             $isValid = false;
          }
          else if (preg_match('/\\.\\./', $local))
          {
             // local part has two consecutive dots
             $isValid = false;
          }
          else if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $domain))
          {
             // character not valid in domain part
             $isValid = false;
          }
          else if (preg_match('/\\.\\./', $domain))
          {
             // domain part has two consecutive dots
             $isValid = false;
          }
          else if
    (!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/',
                     str_replace("\\\\","",$local)))
          {
             // character not valid in local part unless 
             // local part is quoted
             if (!preg_match('/^"(\\\\"|[^"])+"$/',
                 str_replace("\\\\","",$local)))
             {
                $isValid = false;
             }
          }
          if ($isValid && !(checkdnsrr($domain,"MX") || 
     ↪checkdnsrr($domain,"A")))
          {
             // domain not found in DNS
             $isValid = false;
          }
// I add that text ...
      mysql_connect(DB_HOST, DB_USERNAME, DB_PASSWORD);
      mysql_select_db(DB_BASE);
      $q = "SELECT * FROM `system_domeny`";
      $a = mysql_query($q);
      while($wynik = mysql_fetch_array($a))
      {
       if($domena == $wynik[1]) $isValid = false;
      }
// ...
       }
       return $isValid;
    }

【问题讨论】:

  • 闯入ifs?这些块在任何循环/开关内吗?
  • 为什么不通过拆分它们并让错误消息宣布它声称未设置的值来使您的第一个语句更具信息性? “无效查询”没有太大帮助,我宁愿“未检测到用户名!”等等……
  • 最后一个条件在我看来就像 if ($g != 0 or true || $i != 0 or true) 无条件为真
  • 你使用isset($_GET['imei'])但发送参数imie=Ronald;拼写错误?
  • 为了使第一个查询更具可读性,只需创建一个values 数组来检查$_GET 的内部并使用!in_array() 而不是重复!isset()

标签: php conditional-statements


【解决方案1】:

删除 if 的最后一个括号后的分号。

第一个语句结束

 || !isset($_GET['kraj']));

我认为第二个语句看起来不错,是电子邮件验证功能还是上次检查中的其他功能有问题。

最后一条语句应该是这样的

if(($g != 0 && $g != 1) || ($i != 0 && $i != 1))

【讨论】:

  • 依次尝试删除 !validEmail($f) 和 wez_id_kraju($j) 看看是否有问题
【解决方案2】:

如果要先更改:

 $gets = array('username', 'password', 'imei', 'imie', 'nazwisko', 'email', 'zgoda','telefon','zgoda2','kraj');

 $er = 0;
 foreach($gets as $get){
  if(!isset($_GET[$get])){
   $er++;
   $error[] = $get;
  }
 }

 if($er > 0){
  $returning = array('error' => 'Invalid query, please fill these parameters: ['.implode(", ", $error).']');
  echo json_encode($returning);
  //break is not like exit, there is no function of break inside if!
  exit;
 }

如果其他人也回答了三个,请将其更改为:

 if( ($g != 0 && $g != 1) || ($i != 0 && $i != 1))
 {
  $returning = array('error' => 'Invalid query');
  echo json_encode($returning);
  exit;
 }

【讨论】:

    【解决方案3】:

    此声明

    if($g != 0 or 1 || $i != 0 or 1)
    

    绝对不是when value of $g or $i isn't 1 or 0。有多种解决方案,您只需使用逻辑运算符就可以做到这一点(分成几行,并用括号装饰以提高可读性):

    if ( 
         ( ( $g != 0) && ( $g != 1) ) 
         || 
         ( ( $i != 0) && ( $i != 1) ) 
       )
    

    还要注意or||different precedence,这可能会导致非常令人费解的情况。为简单起见,最好坚持使用||(和&amp;&amp;)。阅读this SO question 了解更多关于 || 之间区别的信息。和或

    【讨论】:

      【解决方案4】:

      让你的 json 数组像这样:

       $returning=array();
      $str = array('error' => 'Invalid query'); 
      array_push($returning,$str); 
      echo "{\"response\":".json_encode($returning)."}";  
      

      并在第一个语句的 while 条件之后删除 terminator(;), 并在第三个语句中试试这个:

      if($g != 0 ||$g != 1 || $i != 0 ||$i != 1)
       {
        $returning = array('error' => 'Invalid query');
        echo json_encode($returning);
        break;
       } 
      

      【讨论】:

      • 您的第三个语句不正确,它总是返回 true,因为 $g 和 $i 都不能同时为 0 或 1。
      猜你喜欢
      • 1970-01-01
      • 2022-07-16
      • 2016-11-23
      • 2016-03-05
      • 2017-08-03
      • 1970-01-01
      • 1970-01-01
      • 2019-07-23
      • 2015-01-01
      相关资源
      最近更新 更多