2015-11-24 2 views
1

Мне нужно создать систему входа в систему с использованием PHP и MYSQL. Пользователю должен быть предоставлен доступ, если его имя пользователя и пароль существуют в базе данных. У меня есть следующий код, но после ввода полей он возвращается на ту же страницу. Я новичок в программировании в php и stackoverflow. Пожалуйста помоги.Ошибка входа в PHP MySQL

<?php 
ini_set('display_errors',1); 
error_reporting(E_ALL); 
    //Start session 
    session_start(); 

    //Include database connection details 
    require_once('config.php'); 

    //Array to store validation errors 
    $errmsg_arr = array(); 

    //Validation error flag 
    $errflag = false; 

    //Connect to mysql server 
    $link = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_DATABASE); 
    if(!$link) { 
     die('Failed to connect to server: ' . mysql_error()); 
    } 

    //Select database 
    $db = mysqli_select_db($link, DB_DATABASE); 
    if(!$db) { 
     die("Unable to select database"); 
    } 

    //Function to sanitize values received from the form. Prevents SQL injection 
    function clean($str) { 
     $str = @trim($str); 
     if(get_magic_quotes_gpc()) { 
      $str = stripslashes($str); 
     } 
     return mysqli_real_escape_string($str); 
    } 

    //Sanitize the POST values 
    $login = clean($_POST['login']); 
    $password = clean($_POST['password']); 

    //Input Validations 
    if($login == '') { 
     $errmsg_arr[] = 'Login ID missing'; 
     $errflag = true; 
    } 
    if($password == '') { 
     $errmsg_arr[] = 'Password missing'; 
     $errflag = true; 
    } 

    //If there are input validations, redirect back to the login form 
    if($errflag) { 
     $_SESSION['ERRMSG_ARR'] = $errmsg_arr; 
     session_write_close(); 
     header("location: index.php"); 
     exit(); 
    } 

    //Create query 

    $result=mysqli_query("SELECT * FROM login-teachers WHERE login=$login AND password=".md5($_POST['password']).""); 

    //Check whether the query was successful or not 
    if($result) { 
     if(mysqli_num_rows($result) == 1) { 
      //Login Successful 
      session_regenerate_id(); 
      $member = mysqli_fetch_assoc($result); 
      $_SESSION['SESS_USERNAME'] = $member['member_id']; 
      $_SESSION['SESS_FIRST_NAME'] = $member['firstname']; 
      $_SESSION['SESS_LAST_NAME'] = $member['lastname']; 
      session_write_close(); 
      header("location: member-index.php"); 
      exit(); 
     }else { 
      //Login failed 
      header("location: login-failed.php"); 
      exit(); 
     } 
    }else { 
     die("Query failed"); 
    } 
?> 
+1

'mysql_error()', который не смешивается с 'mysqli_' и' mysqli_real_escape_string() 'требует подключения db. Вы также не подключаетесь сюда '$ result = mysqli_query (" SELECT ... ' –

+1

@Drew, если он когда-либо делает это там. –

+1

@Drew, они могут быть смешанными. Неправильная практика, но смешивание ООП и процедурной работы работают вместе, * как ни странно *. –

ответ

4

Как я уже говорил в комментариях:

Вы также не связывая здесь $result=mysqli_query("SELECT...

Тогда мы имеем этот SELECT * FROM login-teachers вы используете дефис. Он должен быть отмечен галочкой.

SELECT * FROM `login-teachers` 
  • MySQL будет интерпретировать это как «войти в МИНУС учителей» и думать, что вы хотите сделать математику.

Проверяемый на наличие ошибок, это само по себе привело бы к синтаксической ошибке.

Sidenote: Чтобы избежать тикания, переименуйте свой стол с помощью подчеркивания в качестве разделителя, выбор за вами login_teachers.

Этот номер AND password=".md5($_POST['password'])."" является строкой.

Он должен читаться как AND password='".md5($_POST['password'])."'

Sidenote: Если $login является строкой, то это тоже должно быть заключено в кавычки.

Тем не менее, я полностью избавился бы от этого MD5 вообще для хэширования паролей.

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

  • Только не идет LIVE с этим.

Используйте один из следующих действий:

Другие ссылки:

  • PBKDF2 For PHP

  • Также проверьте одну из ответов ircmaxell в https://stackoverflow.com/a/29778421/1415724 - Он использует подготовленные заявления с password_hash() и/или пароль-совместимость (пакет совместимости).

Плюс, это не уверены, если вы даже сохранить этот хэш в первую очередь, и если тип столбца является правильным, а его длина достаточно долго удерживать хэш.

Также не уверен, что ваши массивы POST сохраняют значения и что ваша форма имеет метод POST. Используйте условные !empty() против них.

Проверка на наличие ошибок.

Добавьте error reporting в начало файла, в котором будут найдены ошибки.

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', 1); 

// rest of your code 

Sidenote: Отображение ошибок не должно быть сделано только в постановке, и никогда производства.

Также добавьте or die(mysqli_error($link)) в mysqli_query().

Тогда это die("Unable to select database"); получить реальную ошибку mysqli_error($link) должно быть.

Добавлено примечание:

Я не знаю, что вы используете это ниже, вы уже заявили все 4 параметра выше него, и он может быть безопасно удалены:

$db = mysqli_select_db($link, DB_DATABASE); 
if(!$db) { 
    die("Unable to select database"); 
} 

и убедитесь, эти константы правильно определены.