php登录函数不返回真实的会话id

php登录函数不返回真实的会话id,php,mysqli,Php,Mysqli,我有这个功能 function login_check($username, $password ){ global $mysqli; $password = md5($password); $sql = $mysqli->query("select a_id, a_email from admin where a_email='".$username."' and a_password='".$password."'")or die(mysql_error()); $num_rows

我有这个功能

function login_check($username, $password ){
global $mysqli;
$password = md5($password);

$sql = $mysqli->query("select a_id, a_email from admin where a_email='".$username."' and a_password='".$password."'")or die(mysql_error());

$num_rows = mysqli_num_rows($sql);

if ($num_rows == 1){
    $row = mysqli_fetch_array($sql);
    $macke_session = $_SESSION['a_id'] = $row['a_id'];
    return $macke_session;
}else{
    return false;
}
}
在while循环中,我也使用了这个

 return $_SESSION['a_id'] = $row['a_id'];
还有这个

$_SESSION['a_id'] = $row['a_id'];
if ($num_rows == 1){
return true;
}else{return false;}
还有这个

$_SESSION['a_id'] = $row['a_id'];
if ($num_rows == 1){
return true;
}else{return false;}
它工作正常!!但我有个问题 问题是 win我登录了任何用户,它总是登录id为1的用户

我想尽办法让另一个用户登录,但

没有发生任何情况,只有id号为1的用户直接登录

我不知道如何让函数选择正确的会话id

请帮忙 提前感谢:D

已编辑

正如您在评论中所要求的,这里有一个我为您创建和测试的过程登录函数,可能并不完美。您需要添加安全性并根据您的首选项进行更改,并且永远不要在发布项目中输出调试消息,这只是为了调试目的。祝你好运。希望我能帮忙:)。如果它有效,我要求你们把这个标记为答案,否则评论什么不起作用

mytest.php

<?php
session_start();
//test case a_id = 1
$username="test1@gmail.com";
$password="testpassword";
//test case a_id = 2
//$username="test2@gmail.com";
//$password="test2password";
$dbserver="localhost";
$dbusername="dbuser";
$dbpassword="dbpasss";
$dbname="testdb";

//echo $_SESSION['attempt'];
if(isset($_SESSION['attempt'])&&$_SESSION['attempt']<5){    
$link = new mysqli($dbserver, $dbusername, $dbpassword, $dbname);
echo '<pre>';
login_check($username,$password,$link);
echo '</pre>';}else{echo "Debugging: Too many wrong attempts";
}

function login_check($username, $password,$link){
    if (mysqli_connect_errno()) {
        printf("Debugging:Connect failed: %s\n", mysqli_connect_error);
        exit();
    }else
   {
    $password=md5($password);
    $query="SELECT * FROM `admin` where a_email='".$username."' AND a_password='".$password."'";
    $result=mysqli_query($link,$query);
    $row=mysqli_fetch_array($result);
        $_SESSION['attempt']=isset($_SESSION['attempt'])?$_SESSION['attempt']:0;
        $row['a_id']!=""?$_SESSION['a_id'] = $row['a_id']:$_SESSION['attempt']++;
        if($row['a_id']!="")
        {
            //user match
            $_SESSION['a_id'] = $row['a_id'];
            $_SESSION['attempt']=0;
            echo "Debugging::...<br>row id=".$row['a_id']."<br>";
            echo "Session id=".$_SESSION['a_id']."<br>";
            print_r($row);
            return true;
        }
        else
        {
            //user doesn't match
            $_SESSION['attempt']++;
            echo "Debugging:Session attempt=".$_SESSION['attempt']."<br>";
            return false;
        }
    }
    return false;
}
function user_data(){
global $mysqli;

//$session_id = @$_SESSION['a_id'];

$args = func_get_args();
$fields = '`'.implode('`, `',$args).'`';

$query = $mysqli->query("SELECT $fields FROM admin WHERE a_id='".isset($_SESSION['a_id'])."'")or die(mysqli_error($mysqli));
$query_result = mysqli_fetch_assoc($query);
foreach($args as $field){
    $args[$field] = $query_result[$field];
}
return $args;}

你不会相信的 我的功能正常,您的也正常 我每次都成功登录,但另一个功能中存在问题:((((

造成问题的功能是

$query = $mysqli->query("SELECT $fields FROM admin WHERE a_id='".$_SESSION['a_id']."'")or die(mysqli_error($mysqli));
此功能用于获取登录用户的数据

我换了这一行 像这样

$query = $mysqli->query("SELECT $fields FROM admin WHERE a_id='".isset($_SESSION['a_id'])."'")or die(mysqli_error($mysqli));
Notice: Undefined index: a_id
就是这样

$query = $mysqli->query("SELECT $fields FROM admin WHERE a_id='".isset($_SESSION['a_id'])."'")or die(mysqli_error($mysqli));
Notice: Undefined index: a_id
但现在的问题是,我明白了

每次数据库中的第一个用户返回isset()函数 我不知道为什么

我试着在变量中使用它,但我得到了与我使用的相同的问题 isset()函数

因此,如果有必要,我必须重建user\u data()函数

非常感谢你的帮助,我很害羞

这让我很尴尬:((

我认为如果我将所有功能上的会话名称更改为电子邮件,它将正常工作


再次非常感谢您,非常感谢您帮助我向大家致以最诚挚的问候

@macke\u session
是否返回正确的ID?这不会帮助您
或死亡(mysql\u error())
这将
或死亡(mysqli\u error($mysqli))
。打开错误报告并设置为显示。另外,我希望您不打算继续使用MD5。请确保会话也已启动。会话正在启动,我已登录,但我始终以数据库中的第一个用户身份登录,并且win I use mysqli_error($mysqli),,我得到了这个错误解析错误:语法错误,在C:\wamp\www\iman\include\func.php第22行出现意外的“;”你说的@macke_sessionWARNING是什么意思?@macke_sessionWARNING:编写自己的访问控制层并不容易,而且有很多机会会严重出错。在这个简短的示例中,你会遇到一些危险,来自鲁莽的lack当然可以。请不要编写自己的身份验证系统,因为任何现代的同类产品都内置了强大的功能。它会一如既往地成功登录,,,,,但问题仍然存在,,,,,**它总是返回用户id号为1**的会话,而其他用户没有使用会话!,,,,数据库的问题在哪里?请检查此项d如果不起作用,请告诉我。1可能不是来自数据库的结果,它可能是查询或结果的返回值,表示其为真(1)。从数据库得到的结果是打印win I use print_r命令,它给了我正确的用户是win,但页面正在重定向id号为1的用户已登录,而想要登录的用户不接受任何内容!你是说打印($MAKE_会话)??是,,,win I print_r($MAKE_会话);我得到了正确的id,但它是以登录形式出现的,,,系统告诉我您已成功登录,,,他返回了用户id 1,而不是2或3,或者….等等,它返回了+1:)