【问题标题】:PHP - getting user first name from mysql database (session.php)PHP - 从 mysql 数据库 (session.php) 获取用户名
【发布时间】:2016-03-22 13:34:15
【问题描述】:

我正在尝试显示带有用户名的欢迎消息。我设置了一个会话,一切正常,没有错误,但是我不能让用户名出现在“欢迎”旁边。我阅读了大量帖子,大多数建议都要求在echo 之前添加session_start();。还是什么都没有..

如果有人可以帮助我,这里是 session.php 的代码:

<?php
session_start();
$message="";
if(count($_POST)>0) {
$conn = mysql_connect("**.***.***.***", "*********", "*********");
mysql_select_db("*********",$conn);
$result = mysql_query("SELECT * FROM WebsiteUsers WHERE user_name='" . $_POST["fname"] . "' and password = '". $_POST["password"]."'");
$row  = mysql_fetch_array($result);
if(is_array($row)) {
$_SESSION["UserID"] = $row[user_id];
$_SESSION["fname"] = $row[user_name];
} else {
$message = "Invalid Username or Password!";
}
}
if(isset($_SESSION["user_name"])) {
header('Location: login.php');
}
?>

这是个人资料页面的代码,用户名应该出现在该页面上:

<?php
include('session.php'); //file shown above
?>
<!DOCTYPE html>
<html>
<head>
<title>Your Home Page</title>
</head>
<body>
<div id="profile">
<b id="welcome">Welcome : <i>

<?php
session_start();
echo $_SESSION['fname'];
?>

</i></b>
<b id="logout"><a href="logout.php">Log Out</a></b>
</div>
</body>
</html>

我只是在学习 PHP,这是一个基本测试。

感谢您提供任何信息。 祝你有美好的一天!

更新:

登录脚本.php

<?php
session_start();
$error='';
if (isset($_POST['submit'])) {
if (empty($_POST['uname']) || empty($_POST['password'])) {
$error = "Username or Password is invalid";
}
else
{
$uname=$_POST['uname'];
$password=$_POST['password'];
$conn = mysql_connect("**.***.***.***", "*********", "*********");
$uname = stripslashes($uname);
$password = stripslashes($password);
$uname = mysql_real_escape_string($uname);
$password = mysql_real_escape_string($password);
$db = mysql_select_db("*********", $conn);
$query = mysql_query("select * from WebsiteUsers where password='$password' AND uname='$uname'", $conn);
$rows = mysql_num_rows($query);
if ($rows == 1) {
$_SESSION['login_user']=$uname;
header("location: profile.php");
} else {
$error = "Username or Password is invalid";
}
mysql_close($conn);
}
}
?>

注销.php:

<?php
session_start();
if(session_destroy())
{
header("Location: login.php");
}
?>

【问题讨论】:

  • 显示你的 session.php 文件。我已经测试了你的代码,它运行良好
  • 用户在哪里登录?您的代码也有一个奇怪的地方:if(isset($_SESSION["user_name"])) 如果用户名在会话中,您将用户重定向到登录页面。应该是反过来吧?喜欢if( !isset($_SESSION["user_name"]) )
  • session.php 是代码的第一位。
  • @user2387628 我已经为你更新了我的答案。告诉我你发现了什么

标签: php mysql


【解决方案1】:

你需要引用你的数组键,例如你有:

$_SESSION["UserID"] = $row[user_id];

但这实际上应该是

$_SESSION["UserID"] = $row['user_id'];

注意$row 中数组键周围的单引号。我看到您使用双引号,我认为存在细微差别,但重点是,在数组键字符串周围使用引号。请阅读https://stackoverflow.com/a/2317969/3536236

还有可能是一个问题,你用双引号设置值,然后用单引号调用值 --

$_SESSION["fname"] = $row['fname'];
print $_SESSION['fname']; 

但这只是一个理论。

进一步调试:

Print_r($_SESSION); <== what does this give you after the values are set?
  • 使用 MySQLi 或 PDO 而不是 MySQL_,因为现在 已弃用,不应再使用。

  • 在您的 header 重定位调用之后添加 exit;。因为脚本的其余部分仍然会在重定位头调用运行之前执行,所以您需要告诉脚本在到达header(location: ) 点后立即停止执行。

  • 保持一致并在数组键标识符中使用所有单引号 ' 或所有双引号 "

  • 删除 session_start() 从您的 HTML 中,此函数调用必须位于页面的最开始/顶部,而不是其他位置。您可以将此 session_Start 替换为上面引用的print_r,以进行调试。

调试

第一步,您需要在页面上启用错误,因此无论您正在处理的页面如何,都将此代码添加到顶部:

error_reporting(E_ALL);
ini_set('display_errors', 1);

这将在您运行页面时将代码罚款的任何错误输出到您的浏览器。非常有用且内容丰富。

接下来,我将向您展示确定数据在逻辑链中“丢失”的位置所需的过程。

$result = mysql_query("SELECT * FROM WebsiteUsers WHERE user_name='" . $_POST["fname"] . "' and password = '". $_POST["password"]."'");

print_r($result) <== should return something like "this is a type 4 element". False shows your DB is empty or your MySQL code is bad. 

$row  = mysql_fetch_array($result);

var_dump($row) <== should return the values from the DB. It should also tell you what data type this variable is, as you demand an array, below:

if(is_array($row)) {
$_SESSION["UserID"] = $row[user_id];
$_SESSION["fname"] = $row[user_name];
} 
else {
die("This will display if the IF statement does not show TRUE.");
}

上面的die 语句会告诉你错误不在会话中,而更多是在你对 MySQL 输出的处理中,

我重申您应该在所有数组键上使用单引号!保持一致!!

重组你的 MySQL 使其更像这种形状:

mysql_query($query) or print_r("line ".__LINE__.": ".mysql_error());

这样,如果您的 MySQL 代码有任何问题,就会发现并显示给您。大部分编程都是关于查找错误的来源,而不是错误本身。

【讨论】:

  • Print_r($_SESSION);给我这个:欢迎:数组([login_user] => pkirst)这似乎没问题,因为我使用“pkirst”作为我的登录名。
  • @user2387628 好的,那么这意味着该值没有保存到会话中,事实上,您发布的代码中没有该会话值,那么login_user 值在哪里设置?
  • @user2387628 将双引号数组更改为单引号数组,然后在行设置$result 之后执行:var_dump($row); 以查看实际从 MySQL 返回的数据
  • 刚刚检查了所有文件,我认为它来自 login.php 我应该把它改成什么?很抱歉..我是 PHP 新手..
  • 我全部更改了,但没有显示任何错误或信息。我 login.php 是否将会话设置为 login_user 有关系吗?
【解决方案2】:

试试这样的:

    $db_result  = mysql_fetch_array($result); $row = $db_result[0];

而不是:

$row  = mysql_fetch_array($result);

【讨论】:

  • 你能转储 $result 和 $db_result 吗?
【解决方案3】:
<?php
session_start();
$message="";
if(count($_POST)>0) {
$conn = mysql_connect("**.***.***.***", "*********", "*********");
mysql_select_db("*********",$conn);
$result = mysql_query("SELECT * FROM WebsiteUsers WHERE user_name='" .    $_POST["fname"] . "' and password = '". $_POST["password"]."'");
 if(mysql_num_rows($result)>0) {
 $row  = mysql_fetch_array($result);
 $_SESSION["UserID"] = $row[user_id];
 $_SESSION["fname"] = $row[user_name];
 } else {
 $message = "Invalid Username or Password!";
}
}
if($_SESSION["fname"]=="") {// changed from $_SESSION['user_name'],checks if sesison is empty , will redirect to login page.
 header('Location: login.php');
}
?>

【讨论】:

  • 你能解释一下这里发生了什么吗?
  • 首先在你有 if 语句会话变量未定义的地方 $_SESSION["user_name"]
  • 您可以编辑您的答案并将其添加进去吗?仅使用代码块的答案不太擅长传达问题和解决方案。干杯。
  • 我试过你的代码,但它仍然没有显示用户名。谢谢
  • 你得到的结果,你能尝试回显另一个会话变量吗?
【解决方案4】:

你必须在profile.php的开头使用session_start();

【讨论】:

  • 没有必要这样做,因为他在文件的开头包含了 session.php
  • 是的,如果第一个代码块是 session.php 则无需再次声明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-27
  • 1970-01-01
  • 2023-03-29
  • 2019-07-16
  • 2014-07-19
  • 1970-01-01
  • 2016-07-10
相关资源
最近更新 更多