我有以下代码:
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上找不到关于此错误的任何条目。
导致此错误的原因是什么,我应该怎么做才能修复它? (显示的代码只是我使用我的数据库进行实验和规划无限分页的设计。)
答案 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可以避免在脚本关闭时出现数字索引或特殊字符错误。