【问题标题】:query database and session [closed]查询数据库和会话[关闭]
【发布时间】:2012-12-19 11:58:26
【问题描述】:

我在 php 文件中显示我的会话时遇到问题。我可以让会话显示,但显示不正确 - 它只显示字母“S”。

会话是在用户登录我的系统时创建的,其中包含他们的唯一 ID 和全名。

我的登录 php 如下。只有“full_name”和“id”会话我遇到了问题,因为我必须自己将它们编码到脚本中。 我已经探测到某个地方出错了

<?php

ob_start();
include ("includes/dbConfig.php");
$tbl_name="users"; // Table name 

// Connect to server and select databse.
mysql_connect("$host", "$un", "$pwd")or die("cannot connect"); 
mysql_select_db("$db_name")or die("cannot select DB");

// Define $myusername and $mypassword 
$username=$_POST['username']; 
$password=$_POST['password'];


// To protect MySQL injection (more detail about MySQL injection)
$username = stripslashes($username);
$encrypted_password=md5($password);
$username = mysql_real_escape_string($username);
$encrypted_password = mysql_real_escape_string($encrypted_password);
$sql="SELECT * FROM $tbl_name WHERE username='$username' and    password='$encrypted_password'";
$result=mysql_query($sql);

//Get User Info

$userinfo="SELECT * FROM $tbl_name WHERE username='$username'";
$result=mysql_query($userinfo);

$full_name= $userinfo['full_name'];
$id= $userinfo['id'];

// Mysql_num_row is counting table row
$count=mysql_num_rows($result);

// If result matched $username and $password, table row must be 1 row
if($count==1){

// Register $username, $password and redirect to file "console.php"
session_start();
$_SESSION['username'] = $username;
$_SESSION['full_name'] = $full_name;
$_SESSION['id'] = $id; // store session data
header("Location: console.php");      
}
else {
echo "Wrong Username or Password";
} 
ob_end_flush();

?>

我已经在我的站点中测试了会话,并且一些虚拟信息可以通过。我认为这是从数据库中获取信息的问题。

我知道 md5 不是最安全的密码加密方法,但它可以满足我的需要。

提前致谢。


这是我页面顶部的代码。

<?php

    include ("includes/dbConfig.php");

    session_start(); 
    if(!$_SESSION['username'])
    if(!$_SESSION['full_name'])
    if(!$_SESSION['id']) {
        // user not logged in redirect
        header("Location: index.php");  
    }
?>

这是我用来打印会话数据的代码。

<?php echo "" . $_SESSION["username"]; ?>
<?php echo "" . $_SESSION["full_name"]; ?>
<?php echo "" . $_SESSION["id"]; ?>

【问题讨论】:

  • console.php 中有session_start(); 吗?如果没有,那是你的问题。
  • 是的。 “用户名”会话通过了,因为我可以打印我的用户名。它只是另外两个,当我打印它们时,只显示字母“S”。
  • 你能提供打印它们的代码吗?
  • 我已经编辑了我的帖子。往上看。谢谢

标签: php mysql session passwords


【解决方案1】:

这很快就会被弃用,但不会导致错误。

$sql="SELECT * FROM $tbl_name WHERE username='$username' and password='$encrypted_password'";
$result=mysql_query($sql);

这毫无意义,你已经在上面的查询中得到了这些数据

//Get User Info
$userinfo="SELECT * FROM $tbl_name WHERE username='$username'";
$result=mysql_query($userinfo);

这是错误的,您正在尝试将字符串作为关联数组访问!

$full_name= $userinfo['full_name'];
$id= $userinfo['id'];

你需要

$count=mysql_num_rows($result);
// If result matched $username and $password, table row must be 1 row
if($count==1){
    $row = mysql_fetch_assoc($result);
    $full_name= $row['full_name'];
    $id= $row['id'];
}

这就是它产生“S”的原因。我不知道。但无论如何,这些都是错误。

【讨论】:

  • 非常感谢。我是 php 和 MySQL 的新手,所以所有的男生都会出错。谢谢你们的帮助!
【解决方案2】:

您必须确保,首先发生的是session_start() 方法调用。如果您的代码在方法调用之前只回显一个字符,则会话不起作用。

【讨论】:

  • 我已经问过了,答案是肯定的,它 [console.php] 确实 [have session_start();在里面]
【解决方案3】:

只是想表明你的原始脚本中有很多你不需要的代码,(这结合了 Philip Whitehouse 对问题的解决方案)

<?php

include "includes/dbConfig.php";
$tbl_name="users"; // Table name 
// Connect to server and select databse.
mysql_connect($host, $un, $pwd)or die("cannot connect"); // no quotes needed around vars
mysql_select_db($db_name)or die("cannot select DB"); // no quotes needed around vars

$username = mysql_real_escape_string($_POST['username']);
$encrypted_password = mysql_real_escape_string(md5($_POST['password']));
$sql="SELECT username, full_name, id FROM $tbl_name WHERE username='$username' and    password='$encrypted_password'";
$result=mysql_query($sql);

// If result matched $username and $password, table row must be *AT LEAST* 1 row
if(mysql_num_rows($result)){
    session_start();
    $_SESSION['user'] = mysql_fetch_assoc($result);
    header("Location: console.php");      
}
else {
    echo "Wrong Username or Password";
    die;
} 

?>

检查

<?php

session_start();
// using if(!$_SESSION['..']) without isset throws a warning if it's not set
if(!isset($_SESSION['user'])) header("Location: index.php");

?>

并回显

<?php

echo $_SESSION['user']['username'];
echo $_SESSION['user']['full_name'];
echo $_SESSION['user']['id'];

?>

【讨论】:

    猜你喜欢
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多