注意:未知:在第0行的“未知”中跳过数字键1

时间:2013-09-14 00:56:10

标签: php

我有以下代码:

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上找不到关于此错误的任何条目。

导致此错误的原因是什么,我应该怎么做才能修复它? (显示的代码只是我使用我的数据库进行实验和规划无限分页的设计。)

1 个答案:

答案 0 :(得分:30)

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

这意味着$_SESSION[42]无效,因为$42不是有效的变量名称,并且由于$foo[42]$foo['42']引用相同的内容,{{ 1}}也是无效的。

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

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

  

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