Как избежать уведомления в php, когда одно из условий не выполняется - PullRequest
2 голосов
/ 25 мая 2010

Я заметил, что когда одно из двух условий в php, если утверждение не верно. Вы получите неопределенное уведомление об индексе для утверждения, которое не соответствует действительности. И результатом в моем случае является искаженная веб-страница. Например, этот код:

<?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 неверно. Тот, кто не соответствует действительности, сообщит вам, что он не определен. В моем случае это говорит о том, что сессия 'login' не определена. Если используется сессия '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.";
        }

Ответы [ 8 ]

4 голосов
/ 25 мая 2010

Ваше состояние не так, оно должно быть:

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

Но опять же, находясь в разработке, вы должны знать обо всех ошибках и уведомлениях, так что это не очень хорошая идея, если вы не уверены, что делаете.

3 голосов
/ 25 мая 2010

Я думаю, вы имели в виду это:

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");
}
1 голос
/ 25 мая 2010

Ваши условия странные.
например: !isset($_SESSION['login']) && ($_SESSION['login'] != '')
Во-первых, вы проверяете, не установлен ли логин в переменной сеанса !isset($_SESSION['login'])
Поэтому, если он не установлен, вы также проверите второе условие, при котором вы пытаетесь получить доступ к индексу 'login', , который не установлен .

Может быть, вы имеете в виду это условие?
if (!isset($_SESSION['login']) || ($_SESSION['login'] == ''))
Если логин не задан, ИЛИ пуст, перенаправить на логин
в противном случае перенаправить на голову 3.

0 голосов
/ 25 мая 2010

если переменная sesion loginAdmin не установлена, тогда вы не хотите оценивать второе условие, где вы проверяете, является ли это пустой строкой. Вы можете использовать оценку короткого замыкания , чтобы помочь вам здесь. Измените свой код на

<?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'); 
}
?>
0 голосов
/ 25 мая 2010

Быстрый пример оценки оператора:

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'] не является пустой строкой. Мы никогда не сможем получить доступ к ключу, который не существует в массиве $_SESSION, и мы знаем, что оператор && будет замыкать накоротко, только если его левый операнд имеет значение false.

Левый операнд $_SESSION['login'] не существует. Это верно, если $_SESSION['login'] не существует, то есть оператор && должен смотреть на правый операнд, чтобы убедиться, что он также равен true. Теперь && смотрит на условие $_SESSION['login'] - не пустая строка. Упс! Доступ к этому условию $_SESSION['login'], который мы уже определили на данный момент, не существует!

0 голосов
/ 25 мая 2010

Если сеанс не установлен (!isset($_SESSION['loginAdmin'])), тогда второе условие в операторах if действительно не нужно, потому что они никогда не будут истинными. Вы не можете иметь неопределенную переменную (первое условие) со значением (второе условие).

Ошибка возникает из-за того, что проверяемая вами переменная во втором условии (после &&) не существует.

Попробуйте это:

<?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 после вызова вашего заголовка, потому что в противном случае код продолжит работать, возможно, вызывая неопределенное поведение.

0 голосов
/ 25 мая 2010

Разве вы не хотите isset($_SESSION['login']) вместо (без "!")?

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

Нет смысла проверять, если $_SESSION['login'], если вы уже знаете, что он не установлен. Если вы удалите «!», Это исключит уведомление, поскольку isset заставляет его замолчать, и второе условие никогда не будет оцениваться, если индекс не установлен.

0 голосов
/ 25 мая 2010

1) Использование || (ИЛИ) вместо && (И).
2) изменить! = На ==

...