Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更新数据库中的外键以在PHP中注册用户日志_Php_Mysql - Fatal编程技术网

更新数据库中的外键以在PHP中注册用户日志

更新数据库中的外键以在PHP中注册用户日志,php,mysql,Php,Mysql,我试图在为此目的创建的表中注册用户的登录和注销日志。创建新用户时,我使用transaction用其数据填充用户表,并在logs表中注册时间戳和用户电子邮件,因为用户id还不可用,如下所示: // sign up $firstName = $_POST['first_name']; $lastName = $_POST['last_name']; $email = $_POST['mail'];

我试图在为此目的创建的表中注册用户的登录和注销日志。创建新用户时,我使用transaction用其数据填充用户表,并在logs表中注册时间戳和用户电子邮件,因为用户id还不可用,如下所示:

// 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甚至不需要第二次查询。