3
votes

Comment insérer dans une table après une connexion réussie à la session

Je crée un script de connexion avec une fonction de gestion de session simple comme Facebook

Pour commencer, j'ai créé une table appelée "users_sessions"

Voici le code:

<?php

/* CONNECTION */
$database_connection = new StdClass();
$database_connection->server = 'localhost';
$database_connection->username = 'root';
$database_connection->password = '';
$database_connection->name = 'wearesocio';
$database = new mysqli($database_connection->server, $database_connection->username, $database_connection->password, $database_connection->name);
if($database->connect_error) {

    header('Location: '.$_SERVER['PHP_URL']."install");
}

/* DB CLASS */
Database::$database = $database;
/* DEBUGGING */
define('DEBUGGING', true);

?>

Donc, ce que je veux faire, c'est que lorsque les utilisateurs remplissent la case avec le bon nom d'utilisateur et le bon mot de passe automatiquement, le script insère automatiquement dans ce tableau les bonnes informations de l'utilisateur qui a réussi log.

et voici l'index.php:

 $_POST['password'] = User::hash_password($_POST['password']);
if(!empty($_POST) && empty($_SESSION['error'])) {
    /* If remember me is checked, log the user with cookies for 30 days else, remember just with a session */
    if(isset($_POST['rememberme'])) {
        setcookie('username', $_POST['username'], time()+60*60*24*30);
        setcookie('password', $_POST['password'], time()+60*60*24*30);
        setcookie('user_id', User::login($_POST['username'], $_POST['password']), time()+60*60*24*30);


    } else {
        $_SESSION['user_id'] = User::login($_POST['username'], $_POST['password']);
    }
    redirect();
}

Et voici ma configuration de base de données:

$database->query("
    CREATE TABLE `users_sessions` (
        `session_id` int(10) UNSIGNED NOT NULL,
        `session_date` datetime NOT NULL,
        `user_id` int(10) UNSIGNED NOT NULL,
        `user_browser` varchar(64) COLLATE utf8mb4_bin NOT NULL,
        `user_os` varchar(64) COLLATE utf8mb4_bin NOT NULL,
        `user_ip` varchar(64) COLLATE utf8mb4_bin NOT NULL,
         PRIMARY KEY (`session_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
");


5 commentaires

Ne stockez pas le mot de passe dans un cookie! Vous pouvez utiliser l'existence d'une session valide comme preuve d'authentification.


@AlexHowansky ne vous inquiétez pas, je supprimerai le formulaire Remember me, alors où dois-je ajouter le formulaire d'insertion et quel est le bon formulaire d'insertion?


Voir ceci et ceci .


Notez également qu'une colonne de type INT n'est pas suffisante pour un champ d'identifiant de session. Vous voudrez une chaîne. (Je ne sais pas quelle est la longueur de l'identifiant de session par défaut de PHP, mais soyons prudents et disons au moins 64 caractères.)


@MohcineMimoudi Veuillez modifier votre question pour inclure une exemple minimal reproductible de votre problème, qui peut être testé par d'autres, qui montre comment vous essayez de créer une nouvelle ligne dans la base de données / table. Actuellement, vous n’affichez pas le code qui envoie la requête SQL INSERT INTO .


3 Réponses :


-1
votes

par exemple, vous pouvez l'ajouter à la fin de la méthode login ()

public static login(){

  // you put the login logic here 


     // when the user login info are correct
     if(login == true ){

      // add the user to users_sessions

     }
}


0 commentaires

0
votes
if(!empty($_POST) && empty($_SESSION['error'])) {
    $username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
    $password_raw = $_POST['password'];

    // Get these data
    $session_params = array();
    $session_id = 1;
    $session_date = time();
    $user_id = User::login($username, $password_raw);
    $user_browser = '';
    $user_os = '';
    $user_ip = '';
    array_push($session_params, $session_id, $session_date, $user_id, $user_browser, $user_os, $user_ip);

    if(isset($_POST['rememberme'])) {
        setcookie('username', $username, time()+60*60*24*30);
        //setcookie('password', $_POST['password'], time()+60*60*24*30);
        setcookie('user_id', $user_id, time()+60*60*24*30);
        insert_session_into_db($session_params);
    } else {
        $_SESSION['user_id'] = $user_id;
        insert_session_into_db($session_params);
    }
    redirect();
}

function insert_session_into_db($session_params)
{
    // include database config file, or instantiate your Database class here

    extract($session_params);

    $sql = "INSERT INTO users_sessions (session_id, session_date, user_id, user_browser, user_os, user_ip)
            VALUES ('".$session_id."', '".$session_date."', '".$user_id."', '".user_os."', '".$user_ip."')";
    $res = $database->query($sql);
    if ($res === true) {
        echo "New record created successfully";
    } else {
        echo "Error: " . $sql . "<br>" . $database->error;
    }
    $database->close();
}

0 commentaires

2
votes

c'est ma solution

J'ai créé des fonctions pour obtenir le navigateur utilisateur ou l'adresse IP de l'utilisateur, etc. Ensuite, créez cette fonction ci-dessous pour l'ajouter après le $_SESSION['user_id'letter

    function insert_into_users_sessions($user_id){
    // here add your database class name
    global $database;

    $user = $_SESSION['user_id'];
    $date = new DateTime();
    $date = $date->format('Y-m-d H:i:s');
    $user_browser = get_user_browser();
    $user_ip = get_user_ip();
    $user_os = get_user_os();

    @$database->query("INSERT INTO `user_sessions` (`user_id`, `session_ip`, `session_os`, `session_browser`, `session_date`) VALUES ('$user', '$user_ip', '$user_os', '$user_browser', '$date')");

}


0 commentaires