警告の全文は次のとおりです:
PHP 警告: 不明: スクリプトはセッションの副作用に依存している可能性があります
PHP 4.2.3 までは存在していましたが、セッション拡張は
であることに注意してください。register_globals が有効でない限り、グローバル変数をデータのソースとして考慮しません。
session.bug_compat_42
を設定することで、この機能とこの警告を無効にできます。、または session.bug_compat_warn を
の不明でそれぞれオフにします。この問題については、インターネット上に多くの解決策がありますが、どれも不明瞭な答えを提供しています。では、本当の理由と解決方法は何でしょうか?
まずこれを覚えておいてください。PHP4.2 以降、register_globals はデフォルトで OFF に設定されています。
4.2.3 以降、以前のモードとの互換性を保つために、PHP は bug_compat_42 を導入しました。このオプションが有効になっている場合 (デフォルトで有効)、PHP は SESSION 内の変数を自動的にグローバル変数として使用できるようにします。オプションがオンになっている場合 次に、この機能の使用が報告されます。
コードの一部を見てみましょう、
session_start();
var_dump($_SESSION);
$name = 'ラルエンス';
$_SESSION['名前'] = null;
?>
上記のコードでは、bug_compat_42 がオンで register_globals がオフになっている場合、ページを 2 回リフレッシュする出力は次のようになります:
//初めて:
配列(0) {}
// 2 回目
配列(1) { ["a"]=> 文字列(8) "ラルエンス" }
2 回目に NULL にならないのはなぜですか? bug_compat_42 がオンになっていると、PHP は変数 a が $_SESSION['a'] への参照であると認識し、session_close のときに変数 a の値が書き戻されるからです。 >
このプロセス中に、bug_compat_warn がオンになっている場合、記事の冒頭の警告がスローされます。
ということで〜では、警告が発生する具体的な条件は何でしょうか? これらの条件を知れば、この警告を回避できます
PHPSRC/ext/session/session.c には、必要なすべての答えがあります:
static void php_session_save_current_state(TSRMLS_D) /* {{{ */
{
int ret = 失敗;
IF_SESSION_VARS() {
//セッション配列がある場合
if (PS(bug_compat) && !PG(register_globals)) {
ハッシュテーブル *ht = Z_ARRVAL_P(PS(http_session_vars));
HashPosition pos;
zval **val;
int do_warn = 0;
zend_hash_internal_pointer_reset_ex(ht, &pos);
while (zend_hash_get_current_data_ex(ht
、(void **) &val, &pos) != FAILURE) {
if (Z_TYPE_PP(val) == IS_NULL) { //変数はnullです
if (merge_global(ht, &pos TSRMLS_CC)) {//変数ライトバック
do_warn = 1;
}
}
zend_hash_move_forward_ex(ht, &pos);
}
if (do_warn && PS(bug_compat_warn)) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "あなたのスクリプトはおそらく
PHP 4.2.3 まで存在していたセッションの副作用に依存しています .....");
//以下の
は省略します
bug_compat_42 を有効にしない場合 (この機能は現在ほとんど使用されておらず、有効にすると混乱が生じる場合があります)、bug_compat_warn を起動しない場合、または register_globals が有効になっている場合、この警告は表示されないことがわかります。 .さらに、bug_compat_42 を有効にすると、次の通知が発生する可能性があります..
PHP 通知: 不明: セッションのバグ互換性コードは、
を試行しません。
グローバル変数 $324324 は数値的な性質があるため、行 0の Unknown にあります。
これは、$_SESSION で数値インデックスを使用するときに発生する可能性がある警告です。