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
相关产品推荐
相关产品推荐

