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

