1

私はこれを書きました:

$a[] = "guy";
$b[] = "g";

function login($a1, $b1)
{
  if( user($a1) == true and pass1($b1) == true)
  {
    login2($a1, $b1);
  }
  else
  { 
    echo "error!!!!";
  }
}

function login2($a1, $b1)
{
  if (array_search($_REQUEST["user"],$a1) == array_search($_REQUEST["pass"],$b1))
  {
    echo "you are logged in";
  }
  else
  {
    echo "erorr";
  }
}

function user($user1)
{   
  if(in_array($_REQUEST["user"],$user1))
  {
    echo "gooooooood?";
  }
}

function pass1($pas)
{
  if(in_array($_REQUEST["pass"],$pas))
  {
    echo "goooooooood!!!!!!!!";
  }
  else
  {
    echo "bad";
  }
}

login($a, $b);      

関数の位置を変更し、これを行うたびに最初の引数が true として返され、2 番目の引数をチェックしなかったため、 pass()andが true であることを知っています。なぜこれが起こるのか誰か知っていますか?user()login()

4

3 に答える 3

3

userおよびpass1関数は、エコーアウトではなく、trueまたはを返す必要があります。false

于 2013-06-29T12:48:31.170 に答える
0

ユーザー関数と pass1 関数は明示的な値を返していないため、暗黙的に NULL 値を返しています。PHPマニュアルのこのページで説明されているように、型はブール値が期待されるときにNULL変換されます。falseしたがって、 user 関数と pass1 関数の両方がfalse毎回返されます。

PHPの&&andand論理演算子は、効率のためにショートサーキットを使用します ( PHP マニュアルのこのページの最初のコード例を参照)。そのため、and最初のオペランドがに評価されるステートメントでは、ステートメントfalse全体が に評価されることは決してありません。 2 番目のオペランド (上記のコードの場合、2 番目のオペランドは への呼び出し) は評価されません。これを行うのは時間の無駄になるからです。andtruepass1($b1)

これは、ユーザー関数が呼び出されていることを意味しますが、pass1 関数は呼び出されていません。

于 2013-06-29T12:58:35.033 に答える
0

代わりにこれを使用してみてください:

$a[] = "guy";
$b[] = "g";

function login($a1, $b1)
{
    if( user($a1) == true && pass1($b1) == true)
        login2($a1, $b1);
    else 
    echo "error!!!!";
}

function login2($a1, $b1)
{
    if (array_search($_REQUEST["user"],$a1) == array_search($_REQUEST["pass"],$b1))
        echo "you are logged in";
    else
        echo "erorr";
}

function user($user1)
{

    if(in_array($_REQUEST["user"],$user1))
        echo "gooooooood?";
}


function pass1($pas)
{
    if(in_array($_REQUEST["pass"],$pas))
        echo"goooooooood!!!!!!!!";
    else
        echo "bad";
}
login($a, $b);
于 2013-06-29T12:51:17.807 に答える