会话登录成功后如何插入表
Posted
技术标签:
【中文标题】会话登录成功后如何插入表【英文标题】:How to insert into a table after a successful session login 【发布时间】:2019-05-31 10:34:20 【问题描述】:我正在使用 Facebook 等简单的会话管理功能制作登录脚本
首先我创建了一个名为"users_sessions"
的表
这是代码:
$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;
");
所以我想做的是当用户自动填写正确的用户名和密码时,脚本会自动将成功用户日志的正确信息插入到这个表中。
这是 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();
这是我的数据库配置:
<?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);
?>
【问题讨论】:
不要将密码存储在 cookie 中!您可以使用有效会话的存在作为身份验证的证明。 @AlexHowansky 别担心我会删除记住我的,那么我应该在哪里添加插入表单以及正确的插入表单是什么? 见this和this。 另请注意,INT 类型列对于会话 ID 字段是不够的。你会想要一个字符串。 (不知道 PHP 的默认会话 id 长度是多少,但安全起见,至少说 64 个字符。) @MohcineMimoudi 请edit 您的问题包含您的问题的minimal reproducible example,其他人可以对其进行测试,这表明您如何尝试在数据库/表中创建新行。目前您没有显示发送INSERT INTO
SQL 查询的代码。
【参考方案1】:
这是我的解决方案
我已经创建了一些函数来获取用户浏览器或用户 ip 等
然后在下面创建这个函数在$_SESSION['user_id']
之后添加它
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')");
【讨论】:
【参考方案2】: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);
insert_into_db($params);
else
$_SESSION['user_id'] = User::login($_POST['username'], $_POST['password']);
insert_into_db($params);
function insert_into_db($params)
// write insert query
在理想情况下,我会在插入函数中使用带有绑定参数的 PDO,让每个表都设置了 PRIMARY_KEYs,并清理用户输入。当然,根据How to use password_hash
存储之前的哈希密码更新
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();
【讨论】:
以上是关于会话登录成功后如何插入表的主要内容,如果未能解决你的问题,请参考以下文章