こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

クッキー値の表示について(PHP)

添付画像のような、医院名のクッキーを、ドメイン内で発行しているのですが、
このようなクッキーの値そのものがクッキー名である場合、下記のようなスクリプトでは
当然同じクッキーの内容の値が表示されます。
(かと言って、$_COOKIE["hospital[i]"] のような書き方だとうまく動作しません)
添付画像のような別々のクッキーを、連続して画面に表示してやるにはどうすればいいのでしょうか?どういうスクリプトを書けばいいのか、教えていただけますでしょうか。
-------------------------------------------------------------------------------------------------
for($m=0; $m<$_SESSION['cnt']; $m++){
if(isset($_COOKIE["$hospital"])){
echo '<tr><td cellpadding="3"><div class="moji1">&nbsp;&nbsp;&nbsp;<a href="detail.php?tab=1&sid='.$sid.'&iinmei='.$iinmei.'&from=0&chuumoku_flag=1">'.$_COOKIE["$hospital"].'</a></div><div class="moji2">&nbsp;&nbsp;&nbsp;<img src="../image/tokei.png">'.$date.'</div></td></tr>';
}
}

マルチメディアファイルは削除されたか見つかりません。

投稿日時 - 2015-07-06 15:36:51

QNo.9007208

すぐに回答ほしいです

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

>setcookie("$hospital[$i]", $hospital, time()+60*60*24*7);

このsetcookieがブラウザ側にどう送られているか(ブラウザ側で受け取ったHTTPレスポンスヘッダで)確認されていますか?

$hospitalは文字列でしょうか?配列でしょうか?コメントアウトされた部分では配列として扱っていたようですが、少なくとも$hospital = $_GET['iinmei'];の時点では文字列のハズです。
配列でなく文字列に対しても$str[$i]のように書けますが、これは(zero baseで)$i番目の一文字を表すだけです。書けてしまうので文法エラーにはなりませんので要注意です。




なお、Cookieに配列を保存したいのであれば、json_encode/json_decodeやserialize/unserializeを使って「文字列化して格納/取得してから元に戻す」のが手っ取り早いです。

(セット時)
setcookie('hospital', json_encode($hospityal_array), time()+60*60*24*7);

(取得時)
if (isset($_COOKIE['hospital'])) {
$hospital_array = json_decode($_COOKIE['hospital']);
} else {
$hospital_array = array();
}

投稿日時 - 2015-07-06 22:32:01

お礼

ご回答、どうもありがとうございました。
前回ご指摘の、$idxを用いた方法で動作しました。

投稿日時 - 2015-07-09 09:51:30

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

ちょっと状況が読み取れていないかもですが、こんな話なんですかねぇ・・・

for($m=0; $m<$_SESSION['cnt']; $m++){
if (!isset($hospital[$m])) { continue; }
$idx = $hospital[$m];
if (!isset($_COOKIE[$idx])) { continue; }
//
// $_COOKIE[$idx] を使って表示
//
}

投稿日時 - 2015-07-06 15:47:52

補足

<?php
session_start();
//$hospital = array(); // 医院配列
// アクセスした医院名が、医院配列に存在しなければ、医院配列に医院名を追加する
//if(!array_key_exists($_GET['iinmei'], $hospital)) array_unshift($hospital, $_GET['iinmei']);
$hospital = $_GET['iinmei'];
if(is_null($_SESSION['cnt'])) $_SESSION['cnt']=0;
if((int)$_GET['chuumoku_flag']===1){ // 注目リストに追加するボタンが押されたら
//$chuumoku_iin["$hospital"] = 1;
// 注目リストファイルに、キーと値をライト
$filename = "../access_log/chuumoku_hospital.txt";
$fp = fopen($filename, 'a');
$buf = $_GET['iinmei'].',1'."\n";
fputs($fp, $buf);
fclose($fp);
//setcookie("$hospital", $hospital, time()+60*60*24*7); // 1週間分のクッキーを発行
//$_SESSION['cnt']++; // クッキーの数をインクリメント
$i = $_SESSION['cnt'];

setcookie("$hospital[$i]", $hospital, time()+60*60*24*7); // 1週間分のクッキーを発行
//setcookie("$hospital", $hospital, time()+60*60*24*7); // 1週間分のクッキーを発行
$_SESSION['cnt']++; // クッキーの数をインクリメント
}else{ // 注目リストから削除ボタンが押されたら
//$chuumoku_iin["$hospital"] = 0;
// 注目リストファイルに、キーと値をライト
$filename = "../access_log/chuumoku_hospital.txt";
$fp = fopen($filename, 'a');
$buf = $_GET['iinmei'].',0'."\n";
fputs($fp, $buf);
fclose($fp);
//setcookie("$hospital", "", time()-1000); // クッキー削除
//if($_SESSION['cnt']>0) $_SESSION['cnt']--; // クッキーの数をデクリメント
$i = $_SESSION['cnt'];
setcookie("$hospital[$i]", "", time()-1000); // クッキー削除
//setcookie("$hospital", "", time()-1000); // クッキー削除
if($_SESSION['cnt']>0) $_SESSION['cnt']--; // クッキーの数をデクリメント
}

//var_dump($chuumoku_iin);
/*
$r=0;
while(list($key, $val) = each($chuumoku_iin)){
if($val===1) setcookie("chuumoku_hospital", $key, time()+60*60*24*7);
//if($val===1) setcookie("chuumoku_hospital[$r]", $key, time()+60*60*24*7);
$r++;
}
*/
?>
<!doctype html>
<html>
<head><title>整形外科クリニック詳細ページ</title>
<meta charset="utf-8">

--------------------------------------------------------------
上記のようなスクリプトで、クッキーを作成しているのですが、
結果の注目リストの医院が、1つ前の医院名をあとで作ったクッキーで
上書きしているようなのです。(注目リストに同じクッキー名(医院名)で連続して
表示されます)

どのように書けば、この現象を回避できるでしょうか。

投稿日時 - 2015-07-06 17:02:27

お礼

毎回お世話になっております^^
ご回答、どうもありがとうございました。

投稿日時 - 2015-07-06 16:25:17

あなたにオススメの質問