php / mysql форма входа пользователя — застрял

#php #mysql #authentication

#php #mysql #аутентификация

Вопрос:

добрый вечер, ребята, сегодня вечером я работал над своим первым сценарием входа в систему и наткнулся на кирпичную стену.

У меня есть скрипт, который отправляет новых пользователей в БД с паролями md5 hash’d, но мне не повезло с аутентификацией и входом в систему частично, любая помощь с благодарностью.

Код приведен ниже;

 <?php
//open the session
session_start();
$sqltable="users";
$pagetitle="User Login";
$menu="no";

require 'inc/dbvars.php';
require 'inc/dafunc.php';

//check to see if someone has pressed the login button
    if(isset($_POST['login']))
    {

//connect to the database
    try {
        $dbh = new PDO("mysql:host=$sqlhost;dbname=$sqldb", $sqluser, $sqlpass);
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
    catch(PDOException $e)
        {
        echo $e->getMessage();
        }

//fetch username and password from form
    $user=$_POST['user'];
    $pass=md5($_POST['pass']);  
//query database and check users's creds
    $query = $dbh->prepare("SELECT * FROM $sqltable WHERE username = $user AND password = $pass"); // carefull with your column name which you declare in the tabel

    $query->execute();


     $_SESSION['username']=$user;
     $_SESSION['userlevel']=$row['level'];
//store login data and time in database
    $datetime = date("Y-m-d H:i:s");

 //   $query = $dbh->prepare("UPDATE ' . $sqltable . ' SET lastlogin =? WHERE user = ?");
 //   $data = array($datetime, $user);
 //   $query->execute($data);
 // right now you shouldn't perform the update query . and you should use primary key column in where caulse in update query
//if everything is correct, this should redirect the user to the confirm page   
    header("location:search.php");
}

//if the shit has hit the fan, deny deny deny
else {
echo "Wrong Username or Password";
}

//login was sucessful, build rest of page
require 'inc/header.php';
?>
<div class="tableForm">
<form name="form1" method="post" action="<?php echo "$self"; ?>">
  <p align="center">Username: 
    <input type="text" name="user" id="user" placeholder="username">
</p>
  <p align="center">Password: 
    <input type="password" name="pass" id="pass" placeholder="password">
</p>
  <p align="center">
    <input type="submit" name="Login" id="Login" value="Login">
    <input type="reset" name="Reset" id="Reset" value="Reset">
  </p>
  <p align="center">
    <input type="submit" name="forgotpass" id="forgotpass" value="Forgot your password?">
  </p>
</form>
</div>
<?php include 'inc/footer.php'; ?>
 

Комментарии:

1. Что происходит, когда они пытаются войти в систему? Что именно происходит не так? Кроме того, я вижу там вызов mysql_num_rows . Я бы это убрал.

2. Вы смешиваете API-интерфейсы MySQL, и они не смешиваются. Использовать rowCount()

3. Примечание: использование md5 для хеширования паролей действительно ужасно. Использовать php.net/manual/en/function.password-hash.php

4. «но мне не повезло с аутентификацией и входом в систему частично» назовите это «скрытым благословением». Используйте функцию CRYPT_BLOWFISH или PHP 5.5 password_hash() . Для PHP <5.5 используйте password_hash() compatibility pack .

5. ничего не происходит, никаких ошибок, никакого перенаправления на страницу подтверждения, ничего! Я застрял в том, куда идти дальше…

Ответ №1:

это:

 //query database and check users's creds
     $query = $dbh->prepare('SELECT FROM users WHERE user =?, pass =?');
 

должно быть так:

 //query database and check users's creds
    $query = $dbh->prepare('SELECT * FROM users WHERE user =? AND pass =?');
 

Комментарии:

1. спасибо, изменили это, но все равно не продвинулись дальше, чем раньше.

Ответ №2:

Попробуйте этот код

   <?php
session_start();
$sqlhost = "localhost";
$sqldb = "dbname";
$sqltable="users";
$sqlpass = "";

$pagetitle="User Login";
$menu="no";

require 'inc/dbvars.php';
require 'inc/dafunc.php';

//check to see if someone has pressed the login button
    if(isset($_POST['login']))
    {

//connect to the database
    try {
        $dbh = new PDO("mysql:host=$sqlhost;dbname=$sqldb", $sqluser, $sqlpass);
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
    catch(PDOException $e)
        {
        echo $e->getMessage();
        }

//fetch username and password from form
    $user=$_POST['user'];
    $pass=md5($_POST['pass']);  
//query database and check users's creds
    $query = $dbh->prepare("SELECT FROM users WHERE username = $user AND password = $pass"); // carefull with your column name which you declare in the tabel

    $query->execute();


     $_SESSION['username']=$user;
     $_SESSION['userlevel']=$row['level'];
//store login data and time in database
    $datetime = date("Y-m-d H:i:s");

 //   $query = $dbh->prepare("UPDATE ' . $sqltable . ' SET lastlogin =? WHERE user = ?");
 //   $data = array($datetime, $user);
 //   $query->execute($data);
 // right now you shouldn't perform the update query . and you should use primary key column in where caulse in update query
//if everything is correct, this should redirect the user to the confirm page   
    header("location:search.php");
}

//if the shit has hit the fan, deny deny deny
else {
echo "Wrong Username or Password";
}

//login was sucessful, build rest of page
require 'inc/header.php';
?>
<div class="tableForm">
<form name="form1" method="post" action="<?php echo "$self"; ?>">
  <p align="center">Username: 
    <input type="text" name="user" id="user" placeholder="username">
</p>
  <p align="center">Password: 
    <input type="password" name="pass" id="pass" placeholder="password">
</p>
  <p align="center">
    <input type="submit" name="Login" id="Login" value="Login">
    <input type="reset" name="Reset" id="Reset" value="Reset">
  </p>
  <p align="center">
    <input type="submit" name="forgotpass" id="forgotpass" value="Forgot your password?">
  </p>
</form>
</div>
<?php include 'inc/footer.php'; ?>
 

Комментарии:

1. внес несколько небольших изменений (обновил соответствующий код), и я не получаю ошибку «неправильное имя пользователя или пароль» для всего

2. remmovw эту строку // session следует поместить в верхней части страницы и проверить с помощью данных таблицы и столбца на «неправильное имя пользователя или пароль»