У меня есть следующий код:
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 об этой ошибке.
Что вызывает эту ошибку, и что мне делать, чтобы ее исправить? (Показанный код – это просто эксперимент и планирование дизайна для бесконечной разбивки на страницы с использованием моей базы данных.)
Механизм хранения сеанса 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 использует функцию plain serialize / unserialize внутри и не имеет ограничений, которые имеют php и php_binary. Старые обработчики сериализации не могут хранить числовой индекс, а индекс строки содержит специальные символы (| и!) В $ _SESSION. Используйте php_serialize, чтобы избежать ошибок числового индекса или специальных символов при завершении работы скрипта.