2

PHP の if ステートメントの 2 つの条件のうちの 1 つが真ではないことに気付きました。正しくないステートメントについて、未定義のインデックス通知が表示されます。私の場合の結果は、歪んだ Web ページです。たとえば、次のコード:

<?php
session_start();

if (!isset($_SESSION['loginAdmin']) && ($_SESSION['loginAdmin'] != '')) {
    header ("Location: loginam.php");
} else {
    include('head2.php');
}



if (!isset($_SESSION['login']) && ($_SESSION['login'] != '')) {
    header ("Location: login.php");
} else {
    include('head3.php'); 
}
?>    

if ステートメントの 1 つが true でない場合。真でないものは、未定義であることが通知されます。私の場合、セッション「ログイン」が定義されていないと表示されます。セッション「LoginAdmin」が使用されている場合。これらの未定義のインデックス通知を回避するために、何をすることをお勧めしますか?

EDIT ここは、入力された情報が正しいかどうかを確認する場所です。ログイン情報が正しい場合でも、常にログイン ページにリダイレクトされます。

$uname = mysql_real_escape_string($_POST['ausername']);
        $pword = mysql_real_escape_string($_POST['apassword']);
        $idnam= mysql_real_escape_string($_POST['aydi']);

        $SQL = "SELECT * FROM admin WHERE  ID= '$idnam' AND admin = '$uname' AND admin_password = '$pword'";
        $result = mysql_query($SQL);
        $num_rows = mysql_num_rows($result);



        if ($result) {
            if ($num_rows > 0) {
                session_start();
                $_SESSION['loginAdmin'] = "1";
                header ("Location: ampage.php");
            }
            else {
                session_start();
                $_SESSION['loginAdmin'] = "";
                header ("Location: loginam.php");
            }   
        }
        else {
            $errorMessage = "Error logging on, please try again.";
        }
4

8 に答える 8

4

あなたの状態は間違っています。

if (!isset($_SESSION['loginAdmin']) || ($_SESSION['loginAdmin'] == '')) {
    header ("Location: loginam.php");
} else {
    include('head2.php');
}

と:

if (!isset($_SESSION['login']) || ($_SESSION['login'] == '')) {
    header ("Location: login.php");
} else {
    include('head3.php'); 
}

&&とで置換||_!===

正しくないステートメントについて、未定義のインデックス通知が表示されます。

そうではありません。未定義の変数があると、通知メッセージが表示されます。抑制演算子を使用することでこれを回避できますが@、パフォーマンスが低下するため、これを使用することはお勧めできません。

また、これをスクリプトの上に置くことで、通知メッセージを非表示にすることもできます:

error_reporting(E_ALL ^ E_NOTICE);

しかし、開発中は、すべてのエラーと通知に注意する必要があるため、自分が何をしているのか確信がない限り、これは良い考えではありません。

于 2010-05-25T10:44:32.190 に答える
3

私はあなたがこれを意味したと思います:

if (isset($_SESSION['loginAdmin']) && $_SESSION['loginAdmin'] != '') {
    //variable exists and is not empty
    include('head2.php');
} else {
    //variable does not exist or is empty
    header ("Location: loginam.php");
}
于 2010-05-25T10:48:28.283 に答える
1

あなたの条件は奇妙です。
例:!isset($_SESSION['login']) && ($_SESSION['login'] != '')
最初に、「login」がセッション変数に設定されていないかどうかを確認します。したがって、設定されていない場合は、設定されていない!isset($_SESSION['login'])
「login」インデックスにアクセスしようとする 2 番目の条件も確認します。

もしかして、この状態のことですか?
if (!isset($_SESSION['login']) || ($_SESSION['login'] == ''))
ログインが設定されていない場合、または空の場合はログインにリダイレクトし、
それ以外の場合はヘッド 3 にリダイレクトします。

于 2010-05-25T10:49:57.060 に答える
0

1) || を使用 && (AND) の代わりに (OR)。
2) != を == に変更

于 2010-05-25T10:45:36.743 に答える
0

isset($_SESSION['login'])代わりに(「!」なしで)したくないですか?

if (!isset($_SESSION['login']) && ($_SESSION['login'] != '')) {

$_SESSION['login']設定されていないことがすでにわかっている場合は、テストしてもあまり意味がありません。「!」を削除すると、通知がisset無音になり、インデックスが設定されていない場合は 2 番目の条件が評価されないため、通知が削除されます。

于 2010-05-25T10:48:20.213 に答える
0

セッションが設定されていない場合 ( !isset($_SESSION['loginAdmin']))、if ステートメントの 2 番目の条件は真になることはないため、実際には不要です。未定義の変数 (最初の条件) に値 (2 番目の条件) を指定することはできません。

このエラーは、2 番目の条件 ( の後&&) でテストしている変数が存在しないために発生します。

これを試して:

<?php
session_start();

if (!isset($_SESSION['loginAdmin'])) {
    header ("Location: loginam.php");
    exit;
} else {
    include('head2.php');
}



if (!isset($_SESSION['login'])) {
    header ("Location: login.php");
    exit;
} else {
    include('head3.php'); 
}
?>

exitそうしないとコードが実行され続け、おそらく未定義の動作が発生するため、ヘッダー呼び出しの後に含めました。

于 2010-05-25T10:48:52.740 に答える
0

オペレーター評価の簡単な例:

function returnFalse() { echo "returning false\n"; return false; }
function returnTrue() { echo "returning true\n"; return true; }

echo "false && true\n";
if (returnFalse() && returnTrue()) {
    echo "True!\n";
} else {
    echo "False!\n";
}

echo "\ntrue && false\n";
if (returnTrue() && returnFalse()) {
    echo "True!\n";
} else {
    echo "False!\n";
}

echo "\ntrue && true\n";
if (returnTrue() && returnTrue()) {
    echo "True!\n";
} else {
    echo "False!\n";
}

この実験は&&、最初のオペランドが false の場合にのみオペレーターが短絡できることを示しています。コードが失敗する場所を調べてみましょう。

if (!isset($_SESSION['login']) && ($_SESSION['login'] != '')) {
    header ("Location: login.php");
} else {
    include('head3.php'); 
}

言葉で言えば、条件は次のとおりです。$_SESSION['login']存在しない場合、および$_SESSION['login']空の文字列ではありません。配列に存在しないキーにアクセスしたいと思うことは決してありません。また、左側のオペランドが false の場合にのみ演算子が短絡する$_SESSIONことがわかっています。&&

左オペランドが$_SESSION['login']存在しません。これは、$_SESSION['login']が存在しない場合に true です。つまり、&&演算子は右側のオペランドを調べて、それも true であるかどうかを確認する必要があります。&&条件$_SESSION['login']が空の文字列ではないことを確認します。おっと!$_SESSION['login']この条件は、この時点で既に存在しないと判断されたものにアクセスします!

于 2010-05-25T10:56:38.487 に答える
0

セッション変数 loginAdmin が設定されていない場合は、空の文字列かどうかを確認する 2 番目の条件を評価したくありません。ここでは、短絡評価が役立ちます。コードを次のように変更します

<?php
session_start();

if (!isset($_SESSION['loginAdmin']) || ($_SESSION['loginAdmin'] == '')) {
    header ("Location: loginam.php");
} else {
    include('head2.php');
}



if (!isset($_SESSION['login']) || ($_SESSION['login'] == '')) {
    header ("Location: login.php");
} else {
    include('head3.php'); 
}
?>
于 2010-05-25T10:56:46.970 に答える