【问题标题】:How Can I get a Session Id or username in php?如何在 php 中获取会话 ID 或用户名?
【发布时间】:2012-01-31 23:24:54
【问题描述】:

我有一个用户可以登录的网站。我试过了:

<?php echo $_SESSION ['userlogin']

当用户登录时,我将他们的会话设置为用户登录,但它不会显示他们的用户名。

This is the tutorial I used

【问题讨论】:

    标签: php session session-variables


    【解决方案1】:

    你在使用之前start the session了吗?

    所以设置它:

    <?php
       //Fetch the username from the database
       //The $login and $password I use here are examples. You should substitute this
       //query with one that matches your needs and variables.
       //On top of that I ASSUMED you are storing your passwords MD5 encrypted. If not,
       //simply remove the md5() function from below.
       $query = "SELECT name FROM users WHERE login='" . mysql_real_escape_string($login) . "' AND password='" . md5($password)  . "'";
       $result = mysql_query($query);
    
       //Check if any row was returned. If so, fetch the name from that row
       if (mysql_num_rows($result) == 1) {
          $row = mysql_fetch_assoc_assoc($result);
          $name = $row['name'];
    
          //Start your session
          session_start();
          //Store the name in the session
          $_SESSION['userlogin'] = $name;
       }
       else {
          echo "The combination of the login and password do not match".
       }
    ?>
    

    要在另一个页面上检索它:

    <?php
       //Start your session
       session_start();
       //Read your session (if it is set)
       if (isset($_SESSION['userlogin']))
          echo $_SESSION['userlogin'];
    ?>
    

    编辑

    有关如何创建登录表单的更多信息。您说您尝试设置 $_SESSION['user'] 但这不起作用。

    因此,请确保您在此之前确实执行了session_start();。如果你这样做了,一切都应该工作。除非您为会话分配一个空变量。因此,请仔细检查您分配的变量是否实际包含一个值。喜欢:

    <?php
       session_start();
       echo "Assigning session value to: " . $user;
       $_SESSION['user'] = $user;
    ?>
    

    在您将我链接到他们正在做的教程中:

    $_SESSION[user]=$_GET[userlogin];
    

    这意味着他们正在分配从他们在此处创建的登录表单中获得的值:

    function loginform() {
       print "please enter your login information to proceed with our site";
       print ("<table border='2'><tr><td>username</td><td><input type='text' name='userlogin' size'20'></td></tr><tr><td>password</td><td><input type='password' name='password' size'20'></td></tr></table>");
       print "<input type='submit' >";    
       print "<h3><a href='registerform.php'>register now!</a></h3>";    
    } 
    

    在那里你看到&lt;input type='text' name='userlogin' size'20'&gt;。但是这个表单周围没有&lt;form&gt;&lt;/form&gt; 标签。所以这不会正确发布。所以你应该做的是:

    <form method="POST" action="index.php">
       <label for="userlogin">Username:</label> <input type="text" id="userlogin" name="userlogin" size="20" />
       <label for="password">Password:</label> <input type="password" id="password" name="password" size="20" />
       <input type="submit" value="login" />   
    </form>
    

    此表单会将表单发送回 index.php,其中 userloginpassword 作为 $_POST 变量。

    在您的 index.php 中,您可以这样做:

    <?php
       //Get variables:
       $login = mysql_real_escape_string($_POST['userlogin']);
       $pass = mysql_real_escape_string($_POST['password']);
    
       //Check your table:
       $query = "SELECT userlogin FROM users WHERE userlogin = '" . $login . "' AND password='" . $pass . "'";
       $result = mysql_query($query);
    
       //Check if this user exists:
       if (mysql_num_rows($result) == 1) {
          echo "User exists!";
    
          //Store the login in the session:
          session_start();
          $_SESSION['userlogin'] = $login;
       }
       else {
          echo "Unknown user";
       }
    ?>
    

    如果不为您编写完整的代码,我无法让它更加清晰。所以我希望这对你有帮助。

    【讨论】:

    • 我知道这会起作用,但我的所有用户都会将 nick 视为他们的用户名
    • 'nick' 是一个例子,因为我不知道你的代码。您只需使用他们的用户名(在我的示例代码中为$username)设置它。我回答的重点是,您应该先启动一个会话,然后才能使用session_start() 使用它(读取或写入)。
    • @Nick:你的方法不对。会话变量作为cookies存储在本地用户的系统中,而不是在网络服务器中,因此为一个用户定义的会话变量将不可用到另一个。希望这就是您在评论中的意思。
    • 我试过了,但它显示为空白。如果我的数据库表名是“users”,而我存储用户名的表行是“name”,那会有所不同吗?
    • 是的,显然您必须在$username 中输入一个值,然后才能将其分配给您的会话。否则肯定会是空白的。我将再次调整我的答案给你一个例子。 注意此代码是一个示例,并不完美,因为我不知道您的所有代码、设置、数据库等...
    【解决方案2】:

    把 session_start();回声之前

    【讨论】:

      【解决方案3】:

      如果不显示更多代码,我们无法发表太多评论,但是您确定在每个页面中都调用session_start,您也使用会话变量吗? 还要确保您使用相同的大小写(userlogin != UserLogin)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多