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

如何在PHP函数中正确获取并使用Session变量?

问题:PHP函数中无法正确获取Session变量

我已在文件顶部执行以下代码:

<?php
session_start();
var_dump($_SESSION);

执行结果显示Session变量正常存在:

array(3) { ["loggedin"]=> bool(true) ["name"]=> string(4) "Piet" ["id_staff"]=> int(9) }

但在下面的静态函数中无法正确使用Session变量:

public static function getStaffList($_SESSION['name']){ 

  if ($_SESSION['name'] =="admin" || $_SESSION['name'] =="Piet") {
    $sql = "SELECT * FROM staff";
  }
  else {
    $sql = "SELECT * FROM staff where surname = '".$_SESSION['name']."'";
  }

  $result = Core::$link->query($sql);

  if (!$result) {
    return 'Error: ' . mysqli_error(Core::$link);
  }

  $return = array();
  while ($myrow = mysqli_fetch_assoc($result)) {
    if ($myrow['birthday'] !== '0000-00-00') {
      $myrow['birthday'] = date("d.m.Y", strtotime($myrow['birthday']));
    } else {
      $myrow['birthday'] = '';
    }

    $return[] = $myrow;
  }

  return $return;
}

解决方法

1. 修正函数参数的语法错误

你的函数参数写法getStaffList($_SESSION['name'])是语法错误,函数参数必须是合法的变量名,不能直接使用$_SESSION表达式。正确做法是将Session值作为参数传入函数:

// 修改函数定义,使用合法参数名
public static function getStaffList($username){ 

  if ($username == "admin" || $username == "Piet") {
    $sql = "SELECT * FROM staff";
    $result = Core::$link->query($sql);
  }
  else {
    // 改用预处理语句防范SQL注入
    $sql = "SELECT * FROM staff where surname = ?";
    $stmt = Core::$link->prepare($sql);
    $stmt->bind_param("s", $username);
    $stmt->execute();
    $result = $stmt->get_result();
  }

  if (!isset($result) || !$result) {
    return 'Error: ' . mysqli_error(Core::$link);
  }

  $return = array();
  while ($myrow = mysqli_fetch_assoc($result)) {
    if ($myrow['birthday'] !== '0000-00-00') {
      $myrow['birthday'] = date("d.m.Y", strtotime($myrow['birthday']));
    } else {
      $myrow['birthday'] = '';
    }

    $return[] = $myrow;
  }

  // 关闭预处理语句(如果使用了)
  if (isset($stmt)) $stmt->close();

  return $return;
}

// 调用函数时传入Session值
$staffList = YourClassName::getStaffList($_SESSION['name']);

2. 直接在函数内访问全局Session变量

如果不想传参,可以在函数内部声明$_SESSION为全局变量,或者使用$GLOBALS['_SESSION']访问:

public static function getStaffList(){ 
  // 声明使用全局的$_SESSION变量
  global $_SESSION;
  $username = $_SESSION['name'];

  if ($username == "admin" || $username == "Piet") {
    $sql = "SELECT * FROM staff";
    $result = Core::$link->query($sql);
  }
  else {
    $sql = "SELECT * FROM staff where surname = ?";
    $stmt = Core::$link->prepare($sql);
    $stmt->bind_param("s", $username);
    $stmt->execute();
    $result = $stmt->get_result();
  }

  if (!isset($result) || !$result) {
    return 'Error: ' . mysqli_error(Core::$link);
  }

  $return = array();
  while ($myrow = mysqli_fetch_assoc($result)) {
    if ($myrow['birthday'] !== '0000-00-00') {
      $myrow['birthday'] = date("d.m.Y", strtotime($myrow['birthday']));
    } else {
      $myrow['birthday'] = '';
    }

    $return[] = $myrow;
  }

  if (isset($stmt)) $stmt->close();

  return $return;
}

// 调用函数
$staffList = YourClassName::getStaffList();

3. 关键注意点:防范SQL注入

原代码直接将$_SESSION['name']拼接到SQL语句中,存在严重的SQL注入风险。上面的示例改用预处理语句(prepare+bind_param)解决了这个问题,这是必须的安全措施。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:33:13