0

セッション配列をエコーアウトするという奇妙な問題が発生しています。私は次のことを達成したいと思います:

for($i=0;$i<sizeof($_SESSION['medication']);$i++){
    echo $_SESSION['medication'][$i];
}

実際、配列のすべてのフィールドをエコーアウトした、よく知られたエラー メッセージ「キャッチ可能な致命的なエラー: クラス stdClass のオブジェクトを文字列に変換できませんでした」が表示されます。

ただし、ループ内でフィールド $i の代わりに常にフィールド 0 をエコーアウトすると、エラー メッセージが表示されずに正常に動作します。

エラー メッセージが表示されるのはなぜですか?

更新 1

var_dump($_SESSION['medication'])たくさんのものをエコーアウトします:

array(12) { [0]=> string(1) "1" [1]=> int(10) [2]=> string(2) "14" [3]=> string(2) "17" [4]=> object(stdClass)#1 (7) { ["id"]=> string(1) "1" ["name"]=> string(9) "AUGMENTIN" ["strength"]=> string(6) "875 mg" ["sig"]=> string(29) "1 tablet by mouth twice a day" ["quantity"]=> string(6) "twenty" ["refills"]=> string(4) "zero" ["treatmentfor"]=> string(17) "sinus, bronchitis" } [5]=> object(stdClass)#2 (7) { ["id"]=> string(2) "10" ["name"]=> string(8) "DIFLUCAN" ["strength"]=> string(6) "150 mg" ["sig"]=> string(47) "1 tablet by mouth as needed for yeast infection" ["quantity"]=> string(3) "one" ["refills"]=> string(3) "one" ["treatmentfor"]=> string(27) "yeast, other abx for female" } [6]=> object(stdClass)#3 (7) { ["id"]=> string(2) "14" ["name"]=> string(14) "MEDROL DOSEPAK" ["strength"]=> string(1) "-" ["sig"]=> string(135) "6 PO Qday x 1 day, then 5 PO Qday x 1 day, then 4 PO Qday x 1 day, then 3 PO Qday x1 day, then 2 PO Qday x 1 day then 1 PO Qday x 1 day" ["quantity"]=> string(2) "21" ["refills"]=> string(4) "zero" ["treatmentfor"]=> string(17) "allergic rhinitis" } [7]=> object(stdClass)#4 (7) { ["id"]=> string(2) "17" ["name"]=> string(23) "FLUTICASONE NASAL SPRAY" ["strength"]=> string(6) "0.0005" ["sig"]=> string(91) "1 spray each nostril twice a day, reducing to 1 spray per nostril per day when appropriate." ["quantity"]=> string(10) "one bottle" ["refills"]=> string(3) "one" ["treatmentfor"]=> string(17) "allergic rhinitis" } [8]=> object(stdClass)#5 (7) { ["id"]=> string(1) "1" ["name"]=> string(9) "AUGMENTIN" ["strength"]=> string(6) "875 mg" ["sig"]=> string(29) "1 tablet by mouth twice a day" ["quantity"]=> string(6) "twenty" ["refills"]=> string(4) "zero" ["treatmentfor"]=> string(17) "sinus, bronchitis" } [9]=> object(stdClass)#6 (7) { ["id"]=> string(2) "10" ["name"]=> string(8) "DIFLUCAN" ["strength"]=> string(6) "150 mg" ["sig"]=> string(47) "1 tablet by mouth as needed for yeast infection" ["quantity"]=> string(3) "one" ["refills"]=> string(3) "one" ["treatmentfor"]=> string(27) "yeast, other abx for female" } [10]=> object(stdClass)#7 (7) { ["id"]=> string(2) "14" ["name"]=> string(14) "MEDROL DOSEPAK" ["strength"]=> string(1) "-" ["sig"]=> string(135) "6 PO Qday x 1 day, then 5 PO Qday x 1 day, then 4 PO Qday x 1 day, then 3 PO Qday x1 day, then 2 PO Qday x 1 day then 1 PO Qday x 1 day" ["quantity"]=> string(2) "21" ["refills"]=> string(4) "zero" ["treatmentfor"]=> string(17) "allergic rhinitis" } [11]=> object(stdClass)#8 (7) { ["id"]=> string(2) "17" ["name"]=> string(23) "FLUTICASONE NASAL SPRAY" ["strength"]=> string(6) "0.0005" ["sig"]=> string(91) "1 spray each nostril twice a day, reducing to 1 spray per nostril per day when appropriate." ["quantity"]=> string(10) "one bottle" ["refills"]=> string(3) "one" ["treatmentfor"]=> string(17) "allergic rhinitis" } } 

更新 2

問題が見つかりました。コードの後半で、セッションを参照しているように見える変数 $medication を使用しています。どうして?register_globals はオンですか?

UPDATE 3 - SOLUTION FOUND register_globals は確かにオンになっていて (なんて恥ずかしいことでしょう)、オフにしました。これは、他の変数 $medication に関連しています。今では正常に動作します。みんなありがとう!

4

3 に答える 3

1

で配列をループしようとしているのはなぜforですか? foreach配列を反復処理するために特別に設計されました。

試す:

foreach($_SESSION['medication'] as $foo){
    echo $foo;
}

$_SESSION['medication']他の人が示唆しているように、オブジェクトを保存している可能性があります。var_dump($_SESSION['medication']);そこに実際に格納されているものを確認する必要があります。実際にオブジェクト ( stdClass) がそこにある場合は、クラスをエコーできないため、ループを実行する前にそれを削除する必要があります。

編集:

$_SESSION['medication'][4]その後のすべての要素には値としてオブジェクトが含まれているため、エコー以外のことを行う必要があります(他の人が提案したようにprint_rを試してください)

于 2012-05-29T22:41:19.363 に答える
1

私の推測では、セッション配列のそのインデックスに格納されている文字列以外のものがあると思います。この場合、stdClass配列にオブジェクトがあるようです。

また、数値以外の配列インデックスを使用できるため、foreach ループを使用するとより良い結果が得られます。

foreach($_SESSION['medication'] as $index => $value) {
    if (is_scalar($value)) {
        echo "$index = $value<br />";
    } else {
        echo "<pre>$index = " . print_r($value, true) . "</pre><br />";
    }
}

is_scalarは、変数をエコーできるかどうか (string、int、float、bool) を確認します。そうでない場合は、値をprint_rします。

于 2012-05-29T22:41:33.753 に答える
0

そのセッション配列には、エコーできないタイプの StdClass のオブジェクトがあります

また、foreachを使用します

于 2012-05-29T22:41:13.647 に答える