2015-02-20 4 views
1

Это первый раз, когда я использую PHP и MySQL для создания системы входа, в которой человек может ввести имя пользователя и пароль, а скрипты php проверяют, существует ли в базе данных имя пользователя и пароль.PHP-MySQL Login system

Когда пользователь вводит правильную информацию. Он отображает сообщение «УСПЕШНО ВХОД В ПОЛЬЗОВАТЕЛЮ ПРОФИЛЬ ...», которое все хорошо. Но если пользователь вводит неверную информацию, появляется сообщение «ИЗВЛЕЧЕН ... ВЫ ВХОДИЛИ НЕПРАВИЛЬНЫЙ И И ПАРОЛЬ ... ПОЖАЛУЙСТА, ВОЗВРАЩАЙТЕ ...», но страница пустая. Почему это?

<?php 
define('DB_HOST','localhost'); 
define('DB_NAME','test'); //name of database 
define('DB_USER','root'); //mysql user 
define('DB_PASSWORD',''); //mysql password 

$con = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) or die(mysqli_connect_error()); 
/* check connection */ 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
} 
$db = mysqli_select_db($con,DB_NAME) or die(mysqli_connect_error()); 

/* 
$ID = $_POST['user']; 
$Password = $_POST['pass']; 
*/ 
function SignIn(mysqli $con){ 
    session_start(); //starting the session for user profile page 
    if(!empty($_POST['user'])){ //checing the 'user' name which is from Sign-in.html, is it empty or have some text 
     $query = mysqli_query($con,"SELECT * FROM UserName where userName = '$_POST[user]' AND pass = '$_POST[pass]'") or die(mysqli_connect_error()); 
     $row = mysqli_fetch_array($query) or die(mysql_error()); 
     if(!empty($row['userName']) AND !empty($row['pass'])){ 
      $_SESSION['userName'] = $row['pass']; 
      echo "SUCCESSFULLY LOGIN TO USER PROFILE PAGE..."; 
     } 
     else{ 
      echo "SORRY...YOU ENTERED WRONG ID AND PASSWORD...PLEASE RETRY..."; 
     } 
    } 
} 

if(isset($_POST['submit'])){ 
    SignIn($con); 
} 
?> 
+0

Почему вы назначаете имя пользователя сеанса равным паролю? 'session_start()' должен находиться в самой верхней части файла, а не внутри функции. –

+4

Как и предостережение, что произойдет, если мое имя пользователя «1», DATPASE UserName; - '?? – castis

+0

@castis SQL Injection –

ответ

4

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

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

  • Проконсультируйтесь с моими сносками обо всем вышеперечисленном, касающемся инъекций и хранения паролей.

Вы также смешивания API для MySQL с mysql_error(), который не смешивается с mysqli_ функциями. Это должно быть mysqli_error($con).


Теперь код не удается из-за этой линии:

if(!empty($row['userName']) AND !empty($row['pass'])) 

Даже если человек вводит неверный или inexistant имя пользователя и/или пароль, он все равно будет оставаться верным, потому что эти строки не пустой.

Поэтому он никогда не вводит часть вашего скрипта else.

Для начала, вот что вам нужно сделать:

Заменить:

if(!empty($row['userName']) AND !empty($row['pass'])) 

с:

$row = mysqli_fetch_array($query); 
    $username = $row['userName']; 
    $pw = $row['pass']; 

if($user==$username && $pass==$pw) { 
// $user and $pass are from POST 
// $username and $pw are from the rows 

    $_SESSION['userName'] = $row['pass']; 

    echo "Successfully logged in."; 
    } 

else { echo "Invalid."; } 

При использовании следующих внутри функции SignIn():

$user = mysqli_real_escape_string($con,$_POST['user']); 
$pass = mysqli_real_escape_string($con,$_POST['pass']); 

и замещающие запрос с:

$query = mysqli_query($con,"SELECT * FROM UserName 
     where userName = '$user' 
     AND pass = '$pass'") 
     or die(mysqli_connect_error()); 

Сноски:


Edit:

Ах да, и я также изменил код на Ваш сайт, но теперь каждый раз, когда я войти в нем отображается Invalid, даже с правом имя пользователя и пароль. Любые идеи? Кажется, что это ошибка if ($ user == $ username & & $ pass == $ pw) if statement.

Вот что я использовал, чтобы проверить его, вы можете заменить учетную БД с вашими собственными и другими изменениями, так как я не использовал форму, но жестко закодированные значения.

При вводе неправильного пользователя/пароля это произошло в else.

<?php 
$DB_HOST = 'xxx'; 
$DB_USER = 'xxx'; 
$DB_PASS = 'xxx'; 
$DB_NAME = 'xxx'; 

$con = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME) or die(mysqli_connect_error()); 

/* check connection */ 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
} 

function SignIn($con){ 

$_POST['user'] = "John"; 
$user = $_POST['user']; 

$_POST['pass'] = "12345"; 
$pass = $_POST['pass']; 

    // session_start(); //starting the session for user profile page 
    if(isset($_POST['user'])){ 

$query = mysqli_query($con,"SELECT * 
     FROM UserName where userName = '$_POST[user]' 
     AND pass = '$_POST[pass]'") 
     or die(mysqli_connect_error()); 


$row = mysqli_fetch_array($query); 
    $username = $row['userName']; 
    $pw = $row['pass']; 

if($user==$username && $pass==$pw) { 
    echo "Successfully logged in."; 
    } 

else { echo "Invalid"; } 


    } // brace for isset post user 

} // brace for function 

if(isset($_POST['submit'])){ 
    echo SignIn($con); 
} 
?> 
+0

Работает, спасибо! Это всего лишь тестовый скрипт. Я добавлю соответствующие меры безопасности, чтобы избежать инъекций SQL. –

+0

@KevinShen Добро пожаловать, Кевин, рад помочь. Теперь мы можем закрыть вопрос, и вы можете пометить его как решение. Посетите http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work, затем вернитесь к моему ответу и сделайте то же самое с флажком, пока он не станет зеленым, * приветствует! * –

+0

Oh да, а также я изменил свой код на ваш, но теперь каждый раз, когда я вхожу в систему, он отображает Invalid, даже с правильным именем пользователя и паролем. Любые идеи? Кажется, что это ошибка в случае if ($ user == $ username && $ pass == $ pw) if. –

0

Перед тем, как попасть на самом деле ответ на свой вопрос, я бы порекомендовал вам использовать mysqli_real_escape_string() как для имени пользователя и пароля. Вы можете использовать PDO, который делает все это для вас и, на мой взгляд, меньше работы.

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

if(!empty($_POST['user'])) { 
    // first block 
    if(!empty($row['userName']) AND !empty($row['pass'])) { 
     // first inner block 
    } else { 

    } 
} else { 
    // this else is what your missing 
} 
+0

Это все еще не работает. Это приводит меня к пустой странице. Я использую локальный сервер WAMP. –