提问者:小点点

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


我有以下代码:

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个答案

匿名用户

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

这意味着$_session[42]是无效的,因为$42不是有效的变量名,而且由于$foo[42]$foo['42']引用了相同的东西,所以$_session['42']也是无效的。

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

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

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