2013-07-19 31 views
0

我正在为我的移动应用程序使用PHP和JSON API。我试图写一个注册模块,但是我的条件语句的一部分不能按预期工作。PHP - 条件语句不能正常工作

如果声明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 protected]&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值或$我是不是1或0,但它总是给出一个错误。

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

@Edit:

我有效的电子邮件功能:

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; 
    } 
+1

打破ifs?是任何回路/开关内的那些块? –

+0

为什么不把你的第一条语句分解出来,让错误消息宣布它声称哪个值没有设置? '无效查询'不是太有用,我宁愿'没有检测到用户名!'等等... – Tro

+0

最后一个条件对我来说似乎是if($ g!= 0或true || $ i!= 0或true)这是无条件的真 –

回答

4

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

第一语句结束

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

我觉得第二个语句看起来不错,是它与电子邮件验证功能,或在上次检查其他功能的问题。

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

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

我添加了我的有效函数代码 – TN888

+0

尝试删除!validEmail($ f)then wez_id_kraju $ j)轮流查看它们中的任何一个是否是问题 –

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这可导致相当令人费解的情况。为了简单起见,最好坚持||(和&&)。有关||之间的区别的更多信息,请阅读this SO question和或

2

让你的JSON数组是这样的:

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

,并删除终止;从第一条语句, 而条件后尝试一下本作第三条语句():

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

您的第三个陈述不正确,它将始终返回true,因为$ g和$ i都不能同时为0或1。 – fvu

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

如果三个人一样被他人回答也是chang电子邮件到:

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