You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP登录代码中创建关联数组获取$code失败求助

问题:登录场景下如何为$code创建关联数组并正确调用?

我的登录代码能正常运行,但想为$code变量创建关联数组。网上查到用$row = mysqli_fetch_assoc($sql)和$_SESSION['code'] = $row['code']的方法,但在我的场景里没用。

我的登录代码:

<?php

if(empty($email_err) && empty($password_err)){
    
    $sql = "SELECT id, code, email, cel, passw FROM members WHERE email = ? ";

    if($stmt = mysqli_prepare($link, $sql)){

        mysqli_stmt_bind_param($stmt, "s", $param_email);
        
        $param_email = $email;
        
        if(mysqli_stmt_execute($stmt)){
            mysqli_stmt_store_result($stmt);
            
        }
          
        if(mysqli_stmt_num_rows($stmt) == 1){
            
            mysqli_stmt_bind_result($stmt, $id, $code, $email, $hashed_password);
             
    
            if(mysqli_stmt_fetch($stmt)){

                if(password_verify($password, $hashed_password)){
                    session_start();

                    $_SESSION['loggedin'] = true;
                    $_SESSION['id'] = $id;
                    $_SESSION['code'] = $code;
                    $_SESSION['email'] = $email;
                    
                     $active = "Active";
                     $sql2 = mysqli_query($link, "UPDATE members SET active = '{$active}' WHERE code = {$_SESSION['code']}");
                   
                
                    
                    header("location: ../index.php");
                    
                }else{
                    $password_err = "ERROR";
                }
                
            } 
        }else{
                $email_err = "ERROR";
            }
        
    }else{
                echo "ERROR";
            }
}

mysqli_close($link);

?>

我在index.php中的尝试:

<?php echo $row['code']; ?>

我试过的另一种无效方法:

if(mysqli_stmt_fetch($stmt)){
    $result = mysqli_stmt_get_result($stmt); 
    $row = mysqli_fetch_assoc($result);
    ...

    $_SESSION['code'] = $row['code'];

解决方案

1. 正确用关联数组获取查询结果

你之前的方法顺序错误,应该先获取结果集再取关联数组,同时要修正绑定变量数量和查询字段不匹配的问题(原SQL查了5个字段,但只绑定了4个变量)。调整后的代码如下:

<?php

if(empty($email_err) && empty($password_err)){
    
    $sql = "SELECT id, code, email, cel, passw FROM members WHERE email = ? ";

    if($stmt = mysqli_prepare($link, $sql)){
        mysqli_stmt_bind_param($stmt, "s", $param_email);
        $param_email = $email;
        
        if(mysqli_stmt_execute($stmt)){
            // 直接获取结果集,无需store_result
            $result = mysqli_stmt_get_result($stmt);
            
            if(mysqli_num_rows($result) == 1){
                // 获取关联数组
                $row = mysqli_fetch_assoc($result);
                
                if(password_verify($password, $row['passw'])){
                    session_start();
                    
                    $_SESSION['loggedin'] = true;
                    $_SESSION['id'] = $row['id'];
                    $_SESSION['code'] = $row['code'];
                    $_SESSION['email'] = $row['email'];
                    
                    $active = "Active";
                    // 改用预处理语句防止SQL注入
                    $update_stmt = mysqli_prepare($link, "UPDATE members SET active = ? WHERE code = ?");
                    mysqli_stmt_bind_param($update_stmt, "ss", $active, $row['code']);
                    mysqli_stmt_execute($update_stmt);
                    
                    header("location: ../index.php");
                    exit; // 跳转后必须终止脚本
                }else{
                    $password_err = "ERROR";
                }
            }else{
                $email_err = "ERROR";
            }
        }else{
            echo "ERROR";
        }
    }else{
        echo "ERROR";
    }
}

mysqli_close($link);

?>

2. 在index.php中正确调用

你之前直接用$row['code']但$row在index.php里未定义,应该从Session中取值,且必须先启动Session:

<?php
session_start(); // 必须放在页面最顶部
echo $_SESSION['code'];
?>

额外注意事项

  • 原代码中mysqli_stmt_bind_result绑定的变量数量和查询字段数不匹配,会导致运行错误,务必修正。
  • 直接拼接$_SESSION['code']到SQL语句存在SQL注入风险,必须用预处理语句。
  • 所有用到Session的页面,都要在最顶部执行session_start()。

内容的提问来源于stack exchange,提问作者Dani Daniel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 11:20:27