2012-03-29 3 views
0

Может ли кто-нибудь сказать мне, почему этот код не работает? Какие-то глупые ошибки я сделал?Неудачный код PHP

Проблема: Существует страница входа. На странице «Вход» введите ID и пароль и нажмите «Ввод». Как только я нажму «Enter», он запустит следующий файл, который будет login_now.php. В моей базе данных у меня есть 2 записи. Первый вход позиция является менеджером и 2-й позицией позиция является персоналом. Вход в систему с менеджером очень успешный, а вход в систему с персоналом - это полный сбой ... сбой, поскольку в нем никогда не делается то, что он должен делать, просто возвращай обратно на страницу входа.

Это код, который находится в login_now.php и это то, что она предположим делать, если ввести нажимается кнопка:

$query = "select * from emp where EID = '$myeid' and PASS = '$mypassword'"; 

//run the query 
$result = mysql_query($query, $conn); 
$row = mysql_fetch_assoc($result); 

//found a record? 
if (mysql_num_rows($result) > 0 and $row['POSITION']=="manager")    
{ 
    $_SESSION['eid'] = $myeid;   //remember name as a session variable 
    $_SESSION['password'] = $mypassword; //remember password as a session variable 
    header('Location: welmanager.php'); //redirect user to index 
} 
elseif (mysql_num_rows($result) > 0 and $row['POSITION']=="staff") 
{ 
    $_SESSION['eid'] = $myeid;   //remember name as a session variable 
    $_SESSION['password'] = $mypassword; //remember password as a session variable 
    header('Location: welstaff.php'); //redirect user to index 
} 
else 
{ 
    header('Location: login.php');  //kick back to login 
} 

Позвольте мне знать, если больше кодов в login.php следует показать здесь. Заранее спасибо.

+0

Возможно, это глупый вопрос, но вы проверили, правильно ли введены данные для входа для пользователя штата и что у пользователя есть позиция «персонал» в базе данных? – F21

+8

Рассмотрите, что произойдет, если вы введете пароль: ''или' '='' – Wyzard

+1

Серьезно ... надеюсь, что $ myeid и $ mypassword дезинфицированы ... –

ответ

1

Незначительная ошибка может найти место, если состояние.

if (mysql_num_rows($result) > 0 and $row['POSITION']=="manager") 

Вы должны использовать или состояние, а не и,

if (mysql_num_rows($result) > 0 || $row['POSITION']=="manager") 
0

Не желая, чтобы вскочить на подножку, комментарии об управлении сессии будучи решенной проблемой прав - даже если вы не выбрали используйте его, вы можете много узнать о том, как они это делают. Посмотрите на CakePHP, Zend Framework, Symphony, даже PEAR.

Во-вторых - SQL-инъекция! Даже если это не распространяется на более широкий Интернет, вы не можете гарантировать, что ни один из ваших сотрудников не злонамерен.

В-третьих, похоже, что вы храните свои пароли в виде обычного текста; это большой нон. Люди часто повторно используют свои паспорта; кто может украсть ваши записи пользователя (используя SQL Injection), может попробовать эти пароли в онлайн-банках и т. д. Прочитайте хэширующие пароли.

В-четвертых, не храните пароль в открытом виде нигде - но, конечно, не в объекте сеанса. Вы уже накрываете это ...

Фактический код выглядит синтаксически хорошо, но есть некоторые странные вещи.

if (mysql_num_rows($result) > 0 and $row['POSITION']=="manager") 

Не имеет смысла! Если результатов нет, логически массив $ row должен быть пустым.

Вы также не очень различаете между допустимыми ситуациями «нет совпадений для username/pwd» и ошибками, такими как наличие STAFF, а не персонала в столбце типа.

Я бы реорганизовать как:

$result = mysql_query($query, $conn); 
$row = mysql_fetch_assoc($result); 
if (mysql_num_rows($result) == 0)// no match! 
{ 
    header('Location: login.php');  //kick back to login 
} 
//Maybe put in a catch for more than 1 record too - that would be a data bug. 


$_SESSION['eid'] = $myeid;   //remember name as a session variable 

switch($row['POSITION']){ 
case "manager":    
    header('Location: welmanager.php'); //redirect user to index 
    break; 
case "staff": 
    header('Location: welstaff.php'); //redirect user to index 
    break; 
default: 
    echo ("Found unknown staff type. Error."); 
} 

Теперь вы можете увидеть, является ли ваша запись на самом деле не найден - то есть имя пользователя/пароль комбо не совпадают - то ли профиль пользователя не типа «персонал».

Смежные вопросы