2013-06-27 4 views
0

Когда я вхожу в систему с правильным именем пользователя и паролем, я получаю сообщение об ошибке «Неправильное имя пользователя или пароль», и соединение с базой данных работает, и я думаю, что что-то не так с паролем + проверка имени пользователя.Необходима помощь PHP для сценария входа

<?php 
    $host="mysql12-int.cp.hostnet.nl"; // Host name 
    $username="u33936_mick"; // username 
    $password="//password was correct"; // password 
    $db_name="db33936_axe"; // Database name 
    $tbl_name="users"; // Table name 


    mysql_connect("$host", "$username", "$password"); 
    mysql_select_db("$db_name"); 



    $myusername = stripslashes($myusername); 
    $mypassword = stripslashes($mypassword); 
    $myusername = mysql_real_escape_string($myusername); 
    $mypassword = mysql_real_escape_string($mypassword); 
    $sql = 'SELECT * FROM `users` LIMIT 0, 30 WHERE username="$myusername" and   
    password="$mypassword"'; 
    $result=mysql_query($sql); 


    $count=mysql_num_rows($result); 



    if($count==1){ 
     session_register("username"); 
     session_register("password"); 
     header("location:index.php"); 
    } else { 
     echo "Wrong Username or Password"; 
    } 
    ?> 

Это моя форма

 <form name="login" method="post" action="login.php"> 
       <fieldset id="inputs"> 
        <input id="myusername" type="text" name="myusername"  
    placeholder="Username" required=""> 
        <input id="mypassword" type="password" name="mypassword"  
    placeholder="Password" required=""> 
       </fieldset> 
       <fieldset id="login.php"> 
        <input type="submit" id="submit" value="Login"> 
    </style> 
       </fieldset> 
      </form> 
+3

Существует ** больше поддержки ** для 'mysql_ *' функций, они [** официально устарели **] (https://wiki.php.net/rfc/mysql_deprecation), ** больше не поддерживаются ** и будет [** удален **] (http://php.net/manual/en/function.mysql-connect.php#warning) в будущем. Вы должны обновить свой код с помощью [PDO] (http://php.net/pdo) или [MySQLi] (http://php.net/msqli), чтобы обеспечить функциональность вашего проекта в будущем. – War10ck

+1

мужчина не ищет совета, который ищет решение. –

+0

'echo $ count;' -может быть какая-то странная причина, это больше, чем 1? может быть, это ноль? – alfasin

ответ

7

Прежде всего, я предлагаю вам посмотреть, чтобы переход от устаревшей mysql_* семейства функций в пользу mysqli (docs) или PDO (docs), ни один из которые требуют каких-либо существенных изменений с вашей стороны, поскольку код идет.

Что касается вашей конкретной ошибки, кажется, что вы неправильно сопоставляете значения в запросе. Кроме того, неверный и неверный код вашего WHERE и LIMIT. Вот правильная форма:

$sql = ' 
    SELECT 
     * 
    FROM 
     `users` 
    WHERE 
     username="'.$myusername.'" AND 
     password="'.$mypassword.'" 
    LIMIT 0, 30 
'; 

Не ясно, какую пользу вы приносите с помощью LIMIT заявление. Либо у вас должна быть одна соответствующая строка, либо ни одна. Во всяком случае, я бы использовал LIMIT 1. Если у вас есть 30 строк назад, что бы вы сделали с ними !?

Преобразование в PDO легко! Тот же самый запрос в PDO будет выглядеть следующим образом:

$host="mysql12-int.cp.hostnet.nl"; // Host name 
$username="u33936_mick"; // username 
$password="//password was correct"; // password 
$db_name="db33936_axe"; // Database name 

$pdo = new PDO('mysql:host='.$host.';dbname='.$db_name, $username, $password); 
$sth = $pdo->prepare(' 
     SELECT 
      * 
     FROM 
      `users` 
     WHERE 
      username=:username AND 
      password=:password 
     LIMIT 0, 30 
'); 
$sth->execute(array('username'=>$myusername, 'password'=>$mypassword)); 
$user = $sth->fetch(); 

Обратите внимание, что при использовании PDO со связанными параметрами (как показано здесь), вы НЕ должны дезинфицировать с mysql_real_escape_string или addSlashes, как вы сделали в своем коде.

Непонятно, где вы определяете $mypassword и $myusername, но если вы используете зарегистрированные глобальные переменные, тогда вы должны изменить свой код. Получите значения непосредственно с $_POST. addSlashes НЕ БЕЗОПАСНО, и ни один из них не зарегистрирован.

Документация

+0

спасибо! но теперь моя домашняя страница показывает, что u33936_mick входит в систему вместо учетной записи, с которой я вошёл в систему с помощью – user2528939

+0

. Я думаю, что вы смешиваете свое имя пользователя и пароль с помощью '$ _POST ['myusername']' и '$ _POST ['mypassword'] '. Вот почему использование зарегистрированных глобальных переменных - плохая идея :) Я не знаю, что находится в вашей базе данных или что вы делаете после проверки базы данных, но убедитесь, что вы не используете '$ username' в любом месте, потому что это имя пользователя БД , а не зарегистрированный пользователь. –

2

Несколько проблем:

  • Вы должны использовать $_POST['myusername'] и т.д., чтобы получить отправленные переменные. Если вы полагаетесь на register_globals, вы должны отключить его, поскольку он устарел и представляет угрозу безопасности;
  • Предложение LIMIT приведено в конце в mysql;
  • Вы не должны изменять переданную информацию с помощью таких функций, как stripslashes и escape-функции, вместо этого вы должны использовать подготовленные операторы с связанными переменными в PDO/mysqli, поскольку функции mysql_* устарели, а пароли могут содержать, например, косые черты.

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

+1

Хорошее примечание о зарегистрированных глобальностях! Я добавил, что к моему ответу также, чтобы быть уверенным, что будущие читатели получают намек. +1 –