質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

4回答

381閲覧

これはなんというデータフォーマットなのでしょうか?

smnsmn

総合スコア175

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2018/09/12 07:42

編集2018/09/12 08:14

CakePHP3でセッションをデータベースに保存するようにしました。
セッションデータはMySQLのblob型で保存されるので、
データベースから呼び出すとresourceとしか表示されません。
そのため、stream_get_contentsで読み出したところ下記のような文字列が返ってきました。

JSONなのだと思ったのですがよく見ると違います。
キーと値が保存されているのは分かるのですが(NはNULL?)これはどういったフォーマットなのでしょうか?
また、このデータを配列にすることはできますでしょうか?

(そもそもデータベースに保存したセッション情報をこのように読み出して扱うことは正しいのでしょうか?)

Config|a:1:{s:4:"time";i:1536737268;} Auth|a:1:{s:4:"User";a:16:{s:2:"id";s:16:"hoge";s:5:"email";s:15:"hoge@example.com";s:4:"name";s:16:"hoge";s:11:"comment";N;} Flash|a:0:{} ...

色々と調べてみましたが、どういったものなのかわからなかったのでご教授いただけますと幸いです。
よろしくお願い致します。

#追記
回答たくさんありがとうございます。
シリアライズされているものだったのですね。納得しました。

unserializeしてみたところ、unserialize(): Error at offset 0 of 833 bytesとなりました。
文字エンコードや何か処理しないとunserializeできないようです・・・。
base64_decodeやutf8_decodeは試しましたがダメでした。
CakePHP独自の何かなのでしょうか・・・。

参考URLを拝見しつつ解決を目指してみます。
解決次第、改めて解決済みにしに参ります。m(_ _)m

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

(そもそもデータベースに保存したセッション情報をこのように読み出して扱うことは正しいのでしょうか?)

正しく無いので、Sessionを書き込んだ時と同じような感じで読みだしてください。
リファレンス
参考


以下蛇足ですが、
a:1:{s:4:"time";i:1536737268;}
部分はPHPのシリアライズデータ型だと思われます。
参考

serialize()で作成し、unserialize()で展開できます。
参考

Config|a:1:{s:4:"time";i:1536737268;} Auth|a:1:{s:4:"User";a:16:{s:2:"id";s:16:"hoge";s:5:"email";s:15:"hoge@example.com";s:4:"name";s:16:"hoge";s:11:"comment";N;} Flash|a:0:{}

Config|の様な形式になっているのは、PHPシリアライズ型のデータを複数個同じレコードで管理するために、CakePHPが独自の形式で持っているのだと思われます。

強いて言うなら以下の様な感じで取れると思いますが、折角フレームワークが抽象化してくれている部分を無視してまで独自実装する様なことはするべきでは無いです

PHP

1<?php 2 3$str = 'Config|a:1:{s:4:"time";i:1536737268;} 4Auth|a:1:{s:4:"User";a:16:{s:2:"id";s:16:"hoge";s:5:"email";s:15:"hoge@example.com";s:4:"name";s:16:"hoge";s:11:"comment";N;} 5Flash|a:0:{}'; 6 7var_dump(readSession("Config",$str)); 8 9function readSession($key, $str){ 10 $sessionValueList = explode(PHP_EOL,$str); 11 foreach($sessionValueList as $sessionValue){ 12 $session = explode("|",$sessionValue); 13 if($session[0] === $key){ 14 return unserialize($session[1]); 15 } 16 } 17 18 return null; 19}

//実行結果
array(1) {
["time"]=>
int(1536737268)
}

投稿2018/09/12 08:01

編集2018/09/12 13:51
tanat

総合スコア18709

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

smnsmn

2018/09/26 02:20

ご回答ありがとうございました! >正しく無いので、Sessionを書き込んだ時と同じような感じで読みだしてください。 おっしゃる通り、DBに保存したセッションデータを直接取り出すのが良くないので、 $this->Session->read()や$this->Auth->user()などを使用するようにしたところ、無事にセッション情報を読み出すことができました。 2つのサーバー間でセッションを共有するために初めてDBにセッション情報を保存する方法をとったのですが、 情報を取り出すのにDBから出さなくてはいけないのかと思い質問のような事をしておりました。 (良く考えれば通常のセッションの取り扱いと同じようにすればよかったのですが・・・) また、質問自体のシリアライズについても丁寧にご回答いただき大変勉強になりました。 シリアライズデータについて知識がなく思いつきもしなかったのでとても助かりました。 追記にも記載しましたが、CakePHPの独自のシリアライズががなされており、 unserialize()だけでは配列に戻すことはできずだったのですが、質問した内容につきましては tanat様他、ご回答いただきました皆様のおかげで解決いたしました。 ありがとうございました!m(_ _)m
guest

0

シリアライズされた配列のようなかんじですね。

【[PHP] 配列を文字列に変換して取っておく4つの方法】
https://suin.io/526#3-serialize

【PHP: serialize - Manual】
http://php.net/manual/ja/function.serialize.php

投稿2018/09/12 07:53

kei344

総合スコア69364

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

PHPでシリアライズされて保存されたデータですね。

あたりを参照。

投稿2018/09/12 07:53

編集2018/09/12 07:53
CHERRY

総合スコア25171

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

私も詳しいわけではないですが、PHP セッションのシリアライズ方式と他言語からの読み取りのような記事を読む限り、デフォルトではPHP独自の方式なのではないでしょうか。
仰っているようにキーとそれに付随する値で成り立ってはいますね。

PHPマニュアル:基本的な使用法では下記のように書いてあります。

デフォルトでは、PHP が使う保存ハンドラは filesです。

投稿2018/09/12 07:54

m.ts10806

総合スコア80765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問