【问题标题】:Trying to connect two databases to a php file and store user session尝试将两个数据库连接到一个 php 文件并存储用户会话
【发布时间】:2016-08-09 01:13:58
【问题描述】:

好的,所以我要尝试的基本上是将两个数据库连接到我的 index.php 文件,然后使用其中一个数据库来登录用户,并使用另一个数据库来存储用户的会话。

我不知道该怎么做是存储用户的会话。我想要做的是显示用户信息,例如电子邮件和用户名之类的东西,然后当他们注销时,我希望该信息随着会话消失,但目前当用户登录时,信息仍然是来自老用户,它不会改变。

我在下面包含了我的代码。在我的代码中,当我提到 session 之类的数据库时,那是因为我创建了一个名为 session 的数据库和表,而我的另一个数据库称为数据库,而该表称为 admin。

索引

<?php
 session_start();
$servername = "localhost";
$username = "root";
$password = "****";
$dbname = "database";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
     die("Connection failed: " . $conn->connect_error);
} 


if($_SERVER["REQUEST_METHOD"] == "POST") {
// username and password sent from form

$myusername = mysqli_real_escape_string($db,$_POST['username']);
$mypassword = mysqli_real_escape_string($db,$_POST['password']);

$sql = "SELECT id FROM admin WHERE username = '$myusername' and passcode = '$mypassword'";
$result = mysqli_query($db,$sql);
$row = mysqli_fetch_array($result,MYSQLI_ASSOC);
$active = $row['active'];

$count = mysqli_num_rows($result);

// If result matched $myusername and $mypassword, table row must be 1 row

if($count == 1) { 
$session_id = session_id(); 
$sql = "INSERT INTO session(session_id,username) VALUES('$session_id','$myusername')";
mysqli_query($db,$sql); 
header("Location: test2.php");
}else {
         $error = "";
      }
   }
?>

配置

<?php
   define('DB_SERVER', 'localhost');
   define('DB_USERNAME', 'root');
   define('DB_PASSWORD', '******');
   define('DB_DATABASE', 'database');
   $db = mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE);
?>

会话

<?php
 include('config.php');
 session_start();

 $user_check = $_SESSION['myusername'];

 $ses_sql = mysqli_query($db,"select username from admin where username = '$user_check' ");

 $row = mysqli_fetch_array($ses_sql,MYSQLI_ASSOC);

 $login_session = $row['username'];

 ?>

测试 2 页面(这是我要登录的页面,因此它会显示用户信息。)

<?php
 session_start();
 include("config.php");

$servername = "localhost";
$username = "root";
$password = "*****";
$dbname = "database";
$dbname2 = "session";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname, $dbname2);
// Check connection
if ($conn->connect_error) {
     die("Connection failed: " . $conn->connect_error);
} 

$session_id = session_id(); 

$sql = "SELECT id, username, passcode, email, Address, City, Country, Zip, FirstName, LastName, About FROM admin WHERE username = (SELECT username FROM session WHERE session_id = '$session_id')";

$result = $conn->query($sql);
$row = $result->fetch_assoc();

?> 

【问题讨论】:

  • 一方面,您没有为$sql = "SELECT id FROM admin 查询选择active 行。查询中的mysqli_error($db) 会告诉你这件事。 编辑: 似乎无关紧要,无论如何您都没有使用 $active 变量。因此,请删除此评论。
  • 警告:当使用mysqli 时,您应该使用parameterized queriesbind_param 将用户数据添加到您的查询中。 不要使用手动转义和字符串插值或连接来完成此操作,因为如果您忘记正确转义某些内容,您将创建严重的SQL injection bugs
  • 为什么需要两个独立的数据库?
  • 我相信你的问题是你没有破坏会话。
  • @tadman mysqli_real_escape_string 很难手动转义

标签: php mysql database session


【解决方案1】:

正如我在 cmets 中所说的:

“基本上,您需要做的是将会话数组分配给 post 数组,然后将该会话传递给其他页面(并在 WHERE 子句中查询),然后在注销时销毁会话。” em>

所以这是您可以使用的逻辑,并作为一个基本示例:

旁注:

我很可能需要更多时间来检查您的整个代码来修复它。这更容易/更快。

<?php 

session_start();

$_POST['user'] = "John"; // Take the POST array from your named input

if (!isset($_SESSION['var'])) {

  $_SESSION['var'] = $_POST['user'];
} else {
  echo "It seems the session is already set " . $_SESSION['var'];
}
$username = $_SESSION['var'];

echo $username;

...然后检查会话是否在后续页面中设置并应用相同的逻辑。

还要注意你的问题下留下的 cmets。

引用销毁会话:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    相关资源
    最近更新 更多