10

我有以下代码:

include 'includes/connect.php';
$sp= "clot";
$selectall = mysqli_prepare($connection, "SELECT Count FROM prices WHERE Category = ? ORDER BY ppu LIMIT 11");
mysqli_stmt_bind_param($selectall, 's', $sp);
mysqli_stmt_execute($selectall);
$resulttotal = mysqli_stmt_get_result($selectall);
$x=1;
while($row = mysqli_fetch_array($resulttotal, MYSQLI_ASSOC)){
$_SESSION[$x] = $row['Count'];
$x++;
}
$y=1;
while(isset($_SESSION[$y])){
    if($y==11){
        $_SESSION['nextstart'] = $_SESSION[$y];
        unset($_SESSION[11]);
    }
    else{
        echo($y);
        echo("<br>");
        echo($_SESSION[$y]);
        echo("<br>");
        $y++;
    }
}

它输出预期的数字字符串(1、17、2、18...)此错误消息(十次,使用键 1、键 2、键 3,依此类推):

Notice: Unknown: Skipping numeric key 1 in Unknown on line 0

查找此错误,我能找到的唯一答案是将数组放入超全局会导致此错误。我不相信我放了一个数组,$row['Count']是一个字符串,不是吗?我在 stackoverflow 上找不到有关此错误的任何条目。

是什么导致了这个错误,我应该怎么做才能修复它?(显示的代码只是我使用我的数据库试验和计划一个无限分页的设计。)

4

1 回答 1

38

PHP 会话存储机制最初是围绕“注册”变量构建的,因此其中的键$_SESSION必须是本身可以被视为变量的名称。

这意味着它$_SESSION[42]是无效的,因为$42它不是一个有效的变量名,并且因为$foo[42]$foo['42']引用相同的东西,$_SESSION['42']也是无效的。

解决方案是在您的会话变量上使用前缀(例如$_SESSION['row_count_' . $x] = $row['Count'];)或将它们制成一个数组,然后您可以稍后循环等(例如$_SESSION['row_counts'] = array(); ... $_SESSION['row_counts'][$x] = $row['Count'];

注意:这个限制实际上是在将会话写入磁盘时使用的“序列化处理程序”的一部分,这就是错误没有上下文的原因(它们在 PHP 关闭时被触发)。在当前版本的 PHP 中有一个session.serialize_handler的设置没有这个限制:

php_serialize 从 PHP 5.5.4 开始可用。php_serialize 在内部使用普通的序列化/反序列化函数,没有 php 和 php_binary 的限制。旧的序列化处理程序不能存储数字索引,字符串索引也不能在 $_SESSION 中包含特殊字符(| 和 !)。使用 php_serialize 避免脚本关闭时出现数字索引或特殊字符错误。

于 2013-09-14T01:20:44.110 回答