異なるページへ配列を渡す方法についての質問

このQ&Aのポイント
  • 異なるページへ配列を渡す方法が分かりません。フォームの隠し項目で配列データを渡す方法を試しましたが、うまくいきませんでした。
  • 現在、APIへアクセスを行い、simplexml_load_stringを使ってカテゴリー階層部分を取得し、配列に格納していますが、別ページへ丸まる渡す方法がわかりません。
  • 質問者は単純に別のページに配列を渡したいだけであり、エンコードやデコードにこだわりはありません。どのようにすればよいでしょうか?
回答を見る
  • ベストアンサー

異なるページへ配列を渡したいのですが、うまくいきません。どうすればよい

異なるページへ配列を渡したいのですが、うまくいきません。どうすればよいでしょうか? ■現状 APIへアクセスを行い、 simplexml_load_stringを使って、 カテゴリー階層部分を取得して、配列$hitsへ格納しています。 $xml = simplexml_load_string (引数); $hits = $xml->カテゴリー階層部分; これを別ページへ丸まる渡す方法が分かりません。 ネットで検索したところ、 フォームの隠し項目で配列データを渡したい時、という項目があり、 自分がやりたいケースにあてはまるかなと思い試してみたのですが、うまくいきませんでした。 ▽配列データをエンコード、デコードして送受信する - 覚え書き PHP Sample   http://antonsan.net/study/php/php013.php ■試してみた内容 ▽渡す前のページ <form action="**.php" method="get"> <input type="hidden" name="array_enc" value="<?php echo base64_encode(serialize($hits)) ?>"> ▽渡した後のページ print_r(unserialize(base64_decode(@$_GET["array_enc"]))); var_dump($hits); ▽画面でのエラー表示 Warning: unserialize() [function.unserialize]: Node no longer exists in **.php on line 5 SimpleXMLElement Object Warning: print_r() [function.print-r]: Node no longer exists in **.php on line 5 ( ) NULL ■ やりたいことは、別ページへ配列を渡したいだけなのですが、どうすればよいのでしょうか? (特にエンコード、デコード等にこだわりはありません)

  • re999
  • お礼率61% (476/777)
  • PHP
  • 回答数3
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.3

SimpleXMLElementは、objectからシリアル化はできても、タグ名情報が失われているので、unserializeでは再現出来ないようです。 空っぽの SimpleXMLElement Object() にはなるので、 'Node no longer exists'の方は、@$_GET["array_enc"] としているけど、送信情報を受け取ってないときは、null をunserializeに渡してしまうためでしょう。@ を付けるところを間違ってるというか、勘違いしてるように思います。isset() で切り分けるべきでしょう。 あと、var_dump($hits); も、送信ソースと別ソースに書いてるなら代入してないので、未定義変数を渡してますよ? あと、session もserialize() unserialize()を使っているので、SimpleXMLElementの中身を再現出来ないようです。 SimpleXMLElement::asXML でxml文字列に変換したデータをさらにhtmlspecialchars変換して、value値に入れて送信すればいいのでは? <?php session_start(); $xml = simplexml_load_string (引数); $hits = $xml->カテゴリー階層部分; $sosin= $hits->asXML() ; $_SESSION['xml_str'] = $sosin; // session に入れる場合 ?> <form action="**.php" method="get"> <input type="hidden" name="array_enc" value="<?php echo htmlspecialchars( $sosin, ENT_QUOTES ); ?>">以下略 受け取り: get送信なら、url欄のqueryもチェック <?php session_start(); // 1. session 受け取り if( isset($_SESSION['xml_str']) ){ $getsession = $_SESSION['xml_str'] ; echo 'session data :'.htmlspecialchars($getsession, ENT_QUOTES ).PHP_EOL. '<br> xml parsed ='; $sessionhits = simplexml_load_string($getsession); var_dump($sessionhits); }else{ echo 'cookie off ですか?'; } // 2. get 受信 if(isset( $_GET['array_enc'] )){ $jusin = $_GET['array_enc']; echo PHP_EOL.'<br>get data :'.htmlspecialchars($jusin , ENT_QUOTES ).PHP_EOL. '<br> xml parsed ='; $gethits = simplexml_load_string($jusin); var_dump($gethits ); }else{ echo '送信してませんよ'; } ?>

re999
質問者

お礼

コードを完璧に書いていただいたおかげで、 hiddenで渡すやり方と、セッションを使うやり方と、 それぞれ、個別に、無事動作確認することができました!!! 正直、自力ではどうしても解決できず、 半ば諦めかけていたので、 今、とっても、嬉しい気分です!!! 最後になりましたが、 配列を渡す方法を教えてくださいなどという、 ピントのズレた質問に、ご回答&ご協力&アドバイスいただいたみなさん、 本当にありがとうございました!

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

可能性としては・・・ 配列に入っているデータが、数値や文字列じゃなくオブジェクトになっている場合。 「unserialize() Node no longer exists」あたりでググるとちょこちょこ引っかかります。 とりあえず渡す前のページでvar_dump($hits)を実行してデータ型を確認してみるとよいかと。

re999
質問者

補足

回答ありがとうございます。 渡す前のページでvar_dump($hits)を実行してデータ型を確認してみると、 どうやら、ご指摘のとおり、オブジェクト型となっているようです…。 早速、「unserialize() Node no longer exists」あたりでググってみたのですが、 書いてある内容が、難しくて、まだ試行錯誤中です。 とりあえず、もう少し、考えてみたいと思います。

回答No.1

SESSIONではダメなんでしょうか? $xml = simplexml_load_string (引数); $_SESSION['hits'] = $xml->カテゴリー階層部分; ----------- 次ページで同様に、 $hits = $_SESSION['hits']; var_dump($hits); で確認していただければ…。

re999
質問者

補足

回答ありがとうございました。 早速試してみたのですが、 うまくいきませんでした……。 もうちょっと考えてみたいと思います。

関連するQ&A

  • simplexmlで取得したデータを配列へ。

    PHP5のsimplexml_load_fileでデータにアクセスし、配列に 入れたいのですが、うまくいきません。 $xml = simplexml_load_file($file); $arrayA = array(); foreach($xml->A as $A){ array_push($arrayA, $A); } print_r($arrayA); とすると、 Array ( [0] => SimpleXMLElement Object ( [0] => data1 ) [1] => SimpleXMLElement Object ( [0] => data2 ) [2] => SimpleXMLElement Object ( [0] => data3 ) ) となってしまいます。 そうではなくて、 Array ( [0] => data1 [1] => data2 [2] => data3 ) とデータの中身を直接配列に入れたいのですが、 どうすればよいのでしょうか。 非常に初歩的な質問じゃないかと思うのですが、どなたがご教示 いただけますと有難いです。 どうぞ宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 配列のデータを受け取る、のバグ

    PHPスーパーサンプル第2版の2-3/rcvarray.phpからの抜粋です。 <html> <head> <title>配列のデータを受け取る</title> </head> <body> <?php <?php $array = array("menu"=>"カレー", "price"=>"380", "date"=>"2005/01/01"); echo "配列の内容(エンコードした場合)"; print_r(unserialize(base64_decode($_POST["ar_enc"]))); echo "<p>配列の内容(そのまま渡すと失敗)"; print_r($_POST["ar"]); ?> <form method="POST" action="<?php echo $_SERVER["PHP_SELF"]?>"> <input type="submit" value="送信" name="sub1"> <input type="hidden" name="ar" value="<?php echo $array ?>"> <input type="hidden" name="ar_enc" value="<?php echo base64_encode(serialize($array)) ?>"> </form> </body> </html> を実行すると、 配列の内容(エンコードした場合): Notice: Undefined index: ar_enc in /UNIONFS/opt/lampp/htdocs/samples/chapter2/2-3/rcvarray.php on line 14 配列の内容(そのまま渡すと失敗): Notice: Undefined index: ar in /UNIONFS/opt/lampp/htdocs/samples/chapter2/2-3/rcvarray.php on line 16 というエラーが出るんですが、どうやって直せばいいのですか? 正しくは、上には配列の内容が表示され、下にはarrayとだけ表示されるようです。 $arrayの直後に     $ar_enc = "";     $ar = ""; と挿入してみましたがダメでした。 @でエラーを抑制するのはなしでお願いします。

    • ベストアンサー
    • PHP
  • PHPでJSONを扱うときに配列の参照について

    Web ad Fortune http://jugemkey.jp/api/waf/api_free.php という占いのAPIをPHPにて使おうと思い、 JSON形式で情報が帰ってくるようなので JSONについて調べて json_decode()関数を使うことにしました。 しかし、いまいち配列からのデータ参照ができません。どういうことかというと、 牡羊座のランクを取り出したいときに 【ソース】 <?php $json = file_get_contents("http://api.jugemkey.jp/api/horoscope/free/2009/02/27","r"); $obj = json_decode($json); echo "<pre>"; print_r($obj->horoscope->2009/02/27[0]["rank"]); echo "</pre>"; ?> としても何も表示されません。 ちなみに、print_rの部分を print_r($obj->horoscope); とすると http://nanigashi.biz/json.php のように表示されます。 配列からの情報の読み込み(データ参照)がわかりません。 教えてください。

    • ベストアンサー
    • PHP
  • 「Warning: simplexml_load_string() [

    「Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 61: parser error : Entity 'rsaquo' not defined」というようなエラーが出てPHPファイルが実行できません。 simplexml_load_string() はphpのpearのXMLフォルダのUtil.phpの中の関数と思われるのですが、ちゃんと関数があるのにどうしてエラーが出ているのでしょうか。

    • ベストアンサー
    • PHP
  • simplexml_load_stringで取得したオブジェクトをペー

    simplexml_load_stringで取得したオブジェクトをページングして表示させたいのですが、どうすればよいでしょうか? ▽現状 $xml = simplexml_load_string (引数); $hits = $xml->Body->Items; foreach ($hits as $hit) { echo $hit->Url; echo $hit->UrlImage; となっていて、取得したものがそのまま表示されているだけの状態です。 下記サイトを参考に、ページングしようとしているのですが、 http://tenderfeel.xsrv.jp/php/639/ simplexml_load_stringで取得したオブジェクト型(?)のものを、 foreachではなく、for文で回数を指定させて回すには、 どうすればよいのでしょうか。

    • ベストアンサー
    • PHP
  • 配列のデータ抽出

    phpでgoogleニュースをxmlから抽出しようとしているのですが、 /*配列の中身↓*/ [entry] => Array ( [0] => SimpleXMLElement Object ( [title] => googleのニュースです ( [@attributes] => Array ( [href] => http://googlerss.com ) ) と、いつも使っているsimplexml_load_file関数から配列にいれて foreach ($xml->entry->@attributes as $item) { とした所、[@attributes]の@マークでエラーが出てしまいます。 このような場合、どのようにすれば、配列から情報をとれるのでしょうか。 宜しくお願いします。

    • 締切済み
    • PHP
  • phpのSimpleXMLでXMLの要素を参照したい。

    フォームからキーワードを受け取り、それを、xmlを参照しながらphpで出力したいのですが、最後の最後でつまずきます。 ------------------ <?php $doc = new domDocument(); // DOMDocumentオブジェクトにより、インスタンスを生成 $doc->load("./beta.xml"); // ファイルからXML文書を読みこむ $kywd = $_REQUEST['kywd']; // フォームからデータを受け取る $nodelist = $doc->getElementsByTagName('keyword'); // 指定した要素名(keyword)の全ての要素を取得 foreach ($nodelist as $node) { // 各要素を参照 if($kywd == $node->textContent){ // もし、フォームから受け取ったデータが要素と一致したら $xurl = $node->namespaceURI; // 要素の名前空間URLを取得して$xurlに代入 $xml = simplexml_load_file("./beta.xml"); // SimpleXMLによってXMLファイルをパースし、simplexml_elementオブジェクトを作成する $parent = $xml->children("$xurl"); // 指定したノードの子ノードの配列を取得 $hairetsu = $parent[0]->children("$xurl"); //取得した配列素$hairetsuに代入 foreach($hairetsu as $key=>$value) { // ちゃんと連想配列になっているか、ためしに出力 print ($key."→".$value."<br />"); } // 連想配列になっていることを確認 print $hairetsu["title"]; // しかし、キーを指定して値を取得しようとすると、なぜか得られない。 } } ?> 問題は最後のほうです。連想配列になっていることは確かに確認できる(titleというキーも、その値もある)のですが、連想配列のキーから値を参照しようとすると、なぜか値がNULLになっていて表示できません。私は趣味でプログラミングをする程度なので、おそらく基本的なところで間違っているのだと思いますが、それがどこだか分かりません。お教え願えないでしょうか。

    • ベストアンサー
    • PHP
  • illegal string offset

    php5.3では動いていたプログラムをphp 5.4 で動かしたらwarning illegal string offsetが出て困っています。以下のプログラムでwarningが出ないようにするにはどのようにコーディングすればよいのでしょうか? 例 $a = array('exists' => 'foo'); if ($a['exists']['non_existent']) { print 1; } print 2; exit;

    • ベストアンサー
    • PHP
  • print_rで出力した配列データファイルをfile_get_cont

    print_rで出力した配列データファイルをfile_get_contentsでそのまま取り込もうとしましたが、配列としてではなく文字列として取り込んでしまいます。 ひとつの配列にまとまってしまします。 text.php $data=array(1,2,3,4,5); print_r($data); Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) output.php これを別ファイルで取り込むと$value= file_get_contents("text.php"); echo $value; print_r($value);両方とも Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) が出力されました。 配列として取り込みたいのですが可能でしょうか?

    • ベストアンサー
    • PHP
  • javaで配列の中身を表示する方法

    こんばんは。 私は、PHPをやっていたのですが、今度はjavaにチャレンジしてみたいと思っています。 それで、質問です。 PHPでは重宝していたのですが、print_r()メソッドにあたるメソッドはないでしょうか? このメソッドは、配列やオブジェクトの中身を全て出力してくれるメソッドなのですが…。配列の構造が見たいときなどはとても重宝しました。 ex) ■プログラム $arr = array(1, 2, 3, 4, 5); print_r($arr); ■結果: Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) ご存知の方いらっしゃいまいしたら、教えてください。

専門家に質問してみよう