PHP8.0.3调用setcookie触发TypeError报错求修复方案
你遇到的报错是PHP 8强类型校验和参数顺序错误共同导致的,具体修复方案如下:
错误根因
你贴出的报错:
Fatal error: Uncaught TypeError: setcookie(): Argument #3 ($expires_or_options) must be of type array|int, string given in D:\xampp\htdocs\ford\logoff.php:9 Stack trace: #0 D:\xampp\htdocs\ford\logoff.php(9): setcookie('PHPSESSID', '1629284838', '/') #1 {main} thrown in D:\xampp\htdocs\ford\logoff.php on line 9
触发原因有两个:
setcookie参数顺序错误:标准setcookie参数顺序为cookie名称、cookie值、过期时间、路径、域名...,你的代码跳过了cookie值参数,把路径"/"传到了仅支持整数/数组类型的第三个参数位置,PHP 8的强类型校验直接触发报错。- 变量拼写错误:代码中
$_SESSEION拼写错误,正确为$_SESSION,会导致会话变量清空逻辑失效。
修复后完整代码
<?php session_start(); if(isset($_SESSION["logged_in"])){ // 修正拼写错误,清空会话变量 $_SESSION = []; if(ini_get('session.use_cookies')){ // 补全参数顺序,第二个参数传空字符串作为cookie值 setcookie(session_name(), '', time() - 15, "/"); } session_destroy(); header("Location:login.php"); } else{ header("Location:login.php"); } ?>
如果需要配置cookie的域名、安全传输、HttpOnly等属性,也可以用数组形式传参,兼容性更好:
setcookie(session_name(), '', [ 'expires' => time() - 15, 'path' => '/', 'secure' => false, // 开启HTTPS后可改为true 'httponly' => true // 建议开启,防止XSS窃取cookie ]);
内容的提问来源于stack exchange,提问作者Aizaz ul haq
相关产品推荐
相关产品推荐

