1

モバイル アプリケーションの API で PHP と JSON を使用しています。登録モジュールを作成しようとしましたが、条件ステートメントの一部が期待どおりに機能しません。

If ステートメント 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

If ステートメント 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;
    }
4

4 に答える 4

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また、と に||異なる優先順位があり、非常に不可解な状況につながる可能性があることに注意してください。簡単にするために、||(および&&) に固執することをお勧めします。|| の違いの詳細については、この SO の質問をお読みください。または

于 2013-07-19T12:09:16.157 に答える
3

最初に変更する場合:

 $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;
 }

他の人も答えたように、3つの場合は、次のように変更します。

 if( ($g != 0 && $g != 1) || ($i != 0 && $i != 1))
 {
  $returning = array('error' => 'Invalid query');
  echo json_encode($returning);
  exit;
 }
于 2013-07-19T12:22:23.883 に答える
2

json 配列を次のようにします。

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

最初のステートメントから while 条件の後のターミネーター(;) を削除し、3 番目のステートメントでこれを試します。

if($g != 0 ||$g != 1 || $i != 0 ||$i != 1)
 {
  $returning = array('error' => 'Invalid query');
  echo json_encode($returning);
  break;
 } 
于 2013-07-19T12:11:13.840 に答える