更新数据库中的外键以在PHP中注册用户日志
我试图在为此目的创建的表中注册用户的登录和注销日志。创建新用户时,我使用transaction用其数据填充用户表,并在logs表中注册时间戳和用户电子邮件,因为用户id还不可用,如下所示:更新数据库中的外键以在PHP中注册用户日志,php,mysql,Php,Mysql,我试图在为此目的创建的表中注册用户的登录和注销日志。创建新用户时,我使用transaction用其数据填充用户表,并在logs表中注册时间戳和用户电子邮件,因为用户id还不可用,如下所示: // sign up $firstName = $_POST['first_name']; $lastName = $_POST['last_name']; $email = $_POST['mail'];
// sign up
$firstName = $_POST['first_name'];
$lastName = $_POST['last_name'];
$email = $_POST['mail'];
try{
$pdo->beginTransaction();
$sql = "INSERT INTO users(user_first_name, user_last_name)
VALUES (:user_first_name, :user_last_name)";
$stmt=$pdo->prepare($sql);
$stmt->execute(array(
':user_first_name'=> $firstName,
':user_last_name'=> $lastName
));
//log first entry
$sql = "INSERT INTO logs(user_first_mail) VALUES
(:user_first_mail)";
$stmt=$pdo->prepare($sql);
$stmt->execute(array(':user_first_mail'=> $email));
$pdo->commit();
header('Location: ../message.php');
return;
}catch(Exception $e){
// An exception has been thrown
// We must rollback the transaction
$pdo->rollback();
}
}
然后,当用户进入登录页面并在密码验证后:
/*Succesful login*/
}else if($pass_check == TRUE){
session_start();
$_SESSION['user_id'] = $row['user_id'];
$stmt = $pdo->prepare("SELECT user_id FROM logs WHERE user_id = ?
");
$stmt->execute(array($_SESSION['user_id']));
$row = $stmt->fetchAll(PDO::FETCH_ASSOC);
//This part runs after the first login, because the user id already exist in
logs table
if($row != '' || $row!= null){
$sql = "UPDATE logs SET login = current_timestamp WHERE
user_id = ? ";
$stmt=$pdo->prepare($sql);
$stmt->execute(array($_SESSION['user_id']));
header('Location: ../users_u/user_dash.php?login=success');
}else{
//this parts runs the first time the users logs, and is the part
//that don't work,
//though when I run it directly on database, it works fine)
$sql = "UPDATE logs SET user_id = ? WHERE user_first_mail = ?
";
$stmt=$pdo->prepare($sql);
$stmt->execute(array($_SESSION['user_id'], $email));
header('Location: ../users_u/user_dash.php?login=success');
}
}else{
header('Location: ../login.php?error=notfound&'.$pass_check.'');
}
}
一些建议?您不需要在注册时先插入用户邮件,然后在登录时更新用户id
在您的注册代码中,您可以获得实际的用户id,以便进一步用于日志表
以下是注册文件的代码外观:
...
$sql = "INSERT INTO users(user_first_name, user_last_name)
VALUES (:user_first_name, :user_last_name)";
$stmt=$pdo->prepare($sql);
$stmt->execute(array(
':user_first_name'=> $firstName,
':user_last_name'=> $lastName
));
$user_id = $stmt->lastInsertId(); // Add this line to get last insert id as user_id
//log first entry
$sql = "INSERT INTO logs(user_id) VALUES (:user_id)";
...
您应该能够在创建用户后立即获取用户id,只需选择最后一个插入id;pdo甚至不需要第二次查询。