2013-02-01 3 views
0

Я пытаюсь создать простую систему входа в систему. Тем не менее, у меня есть все с сеансами, и все работает, но вход пользователя не работает с базой данных. Я могу ввести любое имя пользователя и пароль и логин.Сценарий входа в систему: пользователи могут входить в систему с любым именем пользователя и паролем

Вот моя страница Логин:

<?php 
session_start(); 


$db_host = "localhost";    // Place the database host here 
$db_username = "data_user"; // Place the username for the MySQL database here 
$db_pass = "password";   // Place the password for the MySQL database here 
$db_name = "database_name";  // Place the name for the MySQL database here 

if (isset($_POST['username'])) 
{ 
// MySQL Connection 
$db_link = mysql_connect("$db_host","$db_username","$db_pass") or die ("could not connect to mysql. Make sure you have correctly inputed your host, username, and password."); 
mysql_select_db("$db_name") or die ("no database could be found."); 

$username = mysql_real_escape_string($_POST['username']); 
$password = mysql_real_escape_string($_POST['password']); 

// MySQL Query 
$result = mysql_query("SELECT * FROM users WHERE 
username = '$username' AND password = '$password' "); 

if(!$result) { 
    $_SESSION['error'] = '<span style="color:red">Login Failed</span>'; 
} else 
    { 
    $row = mysql_fetch_assoc($result); 
     $_SESSION['userid'] = $row['id']; 
     $_SESSION['username'] = $username; 
    } 
    mysql_close($db_link); 
} 
header('Location: ./') 
?> 

Я использую бутстрэпами логин. Таким образом, это мой логин html:

   <div id="login" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> 
    <div class="modal-header"> 
    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> 
    <h3 id="myModalLabel">Login</h3> 
    </div> 
    <div class="modal-body"> 

    <form class="form-horizontal" action="login.php" method="post"> 
    <div class="control-group"> 
    <label class="control-label" for="inputUsername">Username</label> 
    <div class="controls"> 
     <input name="username" type="text" id="inputUsername" placeholder="Username"> 
    </div> 
    </div> 
    <div class="control-group"> 
    <label class="control-label" for="inputPassword">Password</label> 
    <div class="controls"> 
     <input name="password" type="password" id="inputPassword" placeholder="Password"> 
    </div> 
    </div> 
    <div class="control-group"> 
    <div class="controls"> 
     <label class="checkbox"> 
     <input type="checkbox"> Remember me 
     </label> 
    </div> 
    </div> 
    </div> 
    <div class="modal-footer"> 
    <button type="submit" class="btn btn-primary">Sign in</button> 
    </form> 
    </div> 
</div> 

Это самый простой логин, использующий бутстрап. Я получил журнал, работающий нормально, так что это хорошо, однако в любом случае кто-нибудь может объяснить мне, почему он не связан с базой данных, и вы можете войти в систему с любым именем пользователя и паролем, который вы можете себе представить?

+0

Пожалуйста, не используйте устаревшие функции 'mysql_ *' в новом коде. –

+0

Вы также можете отлаживать многое из этого самостоятельно. Выясните, что возвращает '$ result' и почему. –

+0

Это также пахнет тем, что у вас есть открытые пароли в вашей базе данных. Будут люди, которые не могут дождаться, чтобы взять их в руки! Извините, хотя если вы хешируете клиентскую сторону и отправляете результат. –

ответ

-2

print_r($row);

что это дисплей при печати $ строки строка делает, что возвращает данные

+1

.. помочь объяснить почему? – tradyblix

+0

Это дает ошибку: Ошибка анализа: ошибка синтаксиса, неожиданно T_CONSTANT_ENCAPSED_STRING в /home/pardyco/public_html/login.php в строке 22 –

-3

попробуйте отредактировать следующую строку

$row = mysql_fetch_assoc($result); 
     $_SESSION['userid'] = $row['id']; 
     $_SESSION['username'] = $username; 
    } 

в

$row = mysql_fetch_assoc($result); 
     $_SESSION['userid'] = $row[0]['id']; 
     $_SESSION['username'] = $username; 
    } 

только потому, что вы использовали mysql_fetch_assoc, результирующий массив будет ассоциативным массив строк и столбцов.

+0

Нет, 'mysql_fetch_assoc' возвращает одну строку. –

+0

Нет, mysql_fetch_array будет возвращать 1 строку каждый раз, когда вы используете ее в цикле для одного и того же набора результатов. Но mysql_fetch_assoc является ассоциативным массивом всех строк и столбцов, выбранных по запросу select. –

+0

http://php.net/manual/en/function.mysql-fetch-assoc.php –

2

SQL-оператор

SELECT * FROM users WHERE username = '$username' AND password = '$password' 

будет работать на значении линии будет в $result не будет ложным.

Это означает, что результирующий набор не имеет строк в случае неправильной пары имени пользователя и пароля.

+0

Так что же мне вместо этого? –

+1

Для начала используйте либо функции mysqli, либо PDO. См. Http://www.php.net/manual/en/function.mysql-num-rows.php –

5
if(!$result) { 

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

$num_rows = mysql_num_rows($result); 
if($num_rows!=1) 
{ 
echo "Bad U/P"; 
} 

Примечание: Его время, как вы прекратить использование mysql_ * функции и перейти к Mysqli или PDO

0

Использование PDO: Quick tutorial »

$sth = $dbh->prepare("SELECT `password` FROM `table` WHERE `username` = ?"); 

$sth->execute(array($username)); 

$returned_password = $sth->fetchColumn; 

... и выполнив запрос это значит, что вам не нужно WHERE password, это означает, что вам не нужно индексировать столбец password (эффективность говоря).

-

Из результата, сравните с пользовательским введенным паролем:

if ($returned_password == $password) 
    // OK 
else 
    // NOT OK 

...или если вы ранее хранить пароль в некоторой хэш-значение, которое является очень хорошей практикой:

if ($returned_password == md5($password)) 
    // OK 
else 
    // NOT OK 

... а почему ваш текущий скрипт позволяет любой вход, см ответ @Hanky ​​Panky ㇱ 's.

Удачи вам!

+2

Просто совет, не используйте md5. – itachi

0

Это может звучать глупо,

но вы на самом деле создать базу данных с именем «имя_б_д» и пользователя «data_user»?

$db_host = "localhost"; 
$db_username = "data_user"; 
$db_pass = "password"; 
$db_name = "database_name"; 

Я считаю, что вы не указали правильные данные для базы данных. Пожалуйста, сделайте это, если нет, и сообщите нам об этом.

+0

Lol, я только что разместил их там для переполнения стека. Не собираюсь выдавать мой пароль и такие: P –

+0

уверен! я просто хотел подчеркнуть это :) Я так и думал из-за строки «однако так или иначе кто-нибудь может объяснить мне, почему она не связана с базой данных» в вашем вопросе –

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