スレッド表示 | フラット表示〕 全トピック 920 件中 101 番目 次≫ ≪前

サーバによる配列の認識?

created: 2007-08-03 17:58 | modified: 2007-08-04 12:25 | reply: 6

[3838] サーバによる配列の認識?

user: $satoshi['help'] | created: 2007-08-03 17:58
セッションを使った、簡単な買い物カゴをテストしています。
商品の登録を以下のようにセッションの2次元配列に代入したあと…
array_push($_SESSION['goods_number'],$goods_number);

以下のようにprintを使用とすると…
for($i = 0;$i < sizeof($_SESSION['goods_number']);$i++){
     print ($_SESSION['goods_number'][$i]);
}

返される値が『Array』となってしまいます。
どういう理由でしょうか?
ローカルな環境では、正確な値が返されます。
サーバにインストールされているPHPに関係しているのでしょうか?(サーバはXreaです。)
どなたかわかる方がいらっしゃれば回答いただけると助かります。
reply: 3839 返信 編集 削除

[3839] Re. サーバによる配列の認識?

user: ゆうじ | created: 2007-08-03 18:29
こんばんわ。

ローカルマシンとサーバで結果が違うのは変ですね。

それぞれのPHPのバージョンと
現象を再現できる簡単なコードを挙げてもらえれば
こちらでも試してみます。
Parent: 3838  reply: 3840 返信 編集 削除

[3840] Re. サーバによる配列の認識?

user: $satoshi['help'] | created: 2007-08-03 21:08
ありがとうございます。
仕事の合間の返信なのでレスポンス遅れてすみません。
phpinfo();でチェックしたところ…
以下のようになっていました
【サーバのPHP】
PHP Version 5.2.2
【ローカルのPHP】
PHP Version 5.1.1

スクリプトは…
array_push($_SESSION['goods_number'],$goods_number);
array_push($_SESSION['goods_name'],$goods_name);
array_push($_SESSION['order'],$order);
array_push($_SESSION['price'],$price);

のように配列に代入した後…
for($a=0;$a<10;$a++){
print ("number".$_SESSION['goods_number'][$a]."<br />");
print ("name".$_SESSION['goods_name'][$a]."<br />");
print ("order".$_SESSION['order'][$a]."<br />");
print ("price".$_SESSION['price'][$a]."<br /><br />");
}
という風にprintで出力すると…
numberArray
nameArray
order
price
とサーバ側ではprintされます。それに対しローカルだと…
numberA2
name靴下
order10
price350
こうなります。…こちらが希望する形なのですが…
Parent: 3839  reply: 3841 返信 編集 削除

[3841] 現象を再現できる簡単なコード

user: ゆうじ | created: 2007-08-03 22:38
現象を再現できる簡単なコードとして、例えば、
以下を実行しても違う結果になりますか?

<?php
session_start();

$goods_number = array('A2');

array_push($_SESSION['goods_number'], $goods_number);

print ("number". $_SESSION['goods_number'][0]. "<br />");
?>
Parent: 3840  reply: 3842 返信 編集 削除

[3842] 結果はちがいます

user: $satoshi['help'] | created: 2007-08-03 22:48
ありがとうございます。
早速チェックしました。

ローカルの結果は
『number』です。

サーバ側の結果は
『numberA2』になっています。

やはり2次元配列の解釈の部分の関数でPHPのver.で認識の差があるのでしょうか?
Parent: 3841  reply: 3843 返信 編集 削除

[3843] array_pushがWarningかも

user: ゆうじ | created: 2007-08-04 00:38
マニュアルによると
http://jp.php.net/manual/ja/function.array-push.php
array_push の第一引数は配列(のリファレンス)ですね。
第一引数が配列でない場合は、エラーとなるはずです。

あくまでも推測ですが、現時点で、
サーバ側の $_SESSION['goods_number'] は配列なのに対し、
ローカルの $_SESSION['goods_number'] は空なので、
array_push がエラーになってるのではないでしょうか。

エラーとなるのははじめて呼び出された時だけで
2回目以降は、$_SESSION['goods_number']は、
$goods_numberで初期化されてるのでエラーにはならないと。

var_dump()の結果を見れば、
おそらく想定した結果になってないと思います。

<?php
session_start();

$goods_number = array('A2');

var_dump($_SESSION['goods_number']);
// ↑この時点で $_SESSION['goods_number'] が空ならば
// ↓ここでWarningレベルのエラーとなるはず
array_push($_SESSION['goods_number'], $goods_number);

var_dump($_SESSION['goods_number']);
?>

このコードだと同じ結果になりませんか。
<?php
session_start();

$goods_number = array('A2');

var_dump($_SESSION['goods_number']);

// $_SESSION['goods_number'] が配列で無いなら配列で初期化
if(!is_array($_SESSION['goods_number'])){
$_SESSION['goods_number'] = array();
}
array_push($_SESSION['goods_number'], $goods_number);

var_dump($_SESSION['goods_number']);
?>

買い物カゴならarray_pushよりも
こちらの方が目的にぴったりでは。
<?php
session_start();

$goods_number = array('A2');

var_dump($_SESSION['goods_number']);

$_SESSION['goods_number'][] = $goods_number;

var_dump($_SESSION['goods_number']);
?>
Parent: 3842  reply: 3844 返信 編集 削除

[3844] 配列の定義

user: $satoshi['help'] | created: 2007-08-04 12:25
配列の定義の問題だったようです。
if(!is_array($_SESSION['goods_number'])){
$_SESSION['goods_number'] = array();
}

このソースをスクリプトの冒頭に置いてみたら、大丈夫でした。
また、foreach関数でセッションを読ませていたので、セッションが空のときのエラーもあったかもしれません。
ヒントになりました。ありがとうございます。もう少し粘ってみます。
また何かありましたら書き込みさせてください。
よろしくお願します。
Parent: 3843  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 101 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑