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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

Q&A

0回答

729閲覧

session_handlerを使ってストレージをMySQLに切り替える

e.okuno

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

0グッド

0クリップ

投稿2020/07/07 03:54

PHPのセッションストレージをデフォルトのファイルからMySQLに切り替える際に以下のエラーが出てしまって困っています。

Warning: session_start(): Failed to read session data: user (path: /var/lib/php/7.2/session)

下記参考サイトをもとに作成しました。
参考サイト:https://www.keicode.com/cgi/save-session-in-mysql.php

実際に作成したコードが以下になります
・セッションをMySQLで使用するためのクラス
※参考サイトでは、mysqliでデータベース接続を行っていたのですが、私は今回PDOで行っております。

PHP

1<?php 2 3require_once(__DIR__."/../lib/QuerySession.php"); 4 5 6class MySessionHandler implements SessionHandlerInterface 7{ 8 9 /** 10 * @inheritDoc 11 * セッションを閉じる際に呼ばれる 12 */ 13 public function close() 14 { 15 return true; 16 } 17 18 /** 19 * @inheritDoc 20 */ 21 public function destroy($session_id) 22 { 23 $query_session = new QuerySession(); 24 $flg = $query_session->delete_session(); 25 return $flg; 26 } 27 28 /** 29 * @inheritDoc 30 */ 31 public function gc($maxlifetime) 32 { 33 $t = time() - $maxlifetime; 34 $query_session = new QuerySession(); 35 $flg = $query_session->delete_session_by_updatedtime($t); 36 return $flg; 37 } 38 39 /** 40 * @inheritDoc 41 * セッションを開始する際に呼ばれる 42 */ 43 public function open($save_path, $name) 44 { 45 return true; 46 } 47 48 /** 49 * @inheritDoc 50 * セッションのデータを読み込む。 51 * 対象レコードのIDを取り出してデータを返す 52 * @param string $session_id セッションID 53 * @return string セッションのデータ(存在しない場合は空文字) 54 */ 55 public function read($session_id) 56 { 57 $query_session = new QuerySession(); 58 $session_data = $query_session->get_session_by_id($session_id); 59 return $session_data; 60 } 61 62 /** 63 * @inheritDoc 64 */ 65 public function write($session_id, $session_data) 66 { 67 $query_session = new QuerySession(); 68 $affected_rows = $query_session->insert_session($session_id,$session_data); 69 return $affected_rows ? true : false; 70 71 } 72}

・Sessionテーブルを操作するクラス
※このクラスはデータベース接続を行うDatabaseConnectionクラスを継承しているため、実際の接続処理は記述していません。

PHP

1<?php 2 3require_once(__DIR__."/DatabaseConnection.php"); 4 5class QuerySession extends DatabaseConnection 6{ 7 function __construct() 8 { 9 parent::__construct(); 10 } 11 12 13 public function get_session_by_id($session_id) 14 { 15 $stmt = $this->pdo->prepare('SELECT session_data FROM session WHERE session_id = :session_id;'); 16 $stmt->bindParam(':session_id', $session_id, PDO::PARAM_STR); 17 $stmt->execute(); 18 $session_data = $stmt->fetchColumn(); 19 return $session_data; 20 } 21 22 public function insert_session($session_id,$session_data) 23 { 24 $stmt = $this->pdo->prepare( 25 'INSERT INTO session(session_id,session_data) 26 VALUES(:session_id,:session_data) 27 ON DUPLICATE KEY UPDATE 28 session_data = :session_data;'); 29 $stmt->bindParam(':session_id', $session_id, PDO::PARAM_STR); 30 $stmt->bindParam(':session_data', $session_data, PDO::PARAM_STR); 31 $stmt->bindParam(':session_data', $session_data, PDO::PARAM_STR); 32 $stmt->execute(); 33 $affected_rows = $stmt->rowCount(); 34 return $affected_rows; 35 36 } 37 38 public function delete_session($session_id) 39 { 40 $stmt = $this->pdo->prepare('DELETE FROM session WHERE session_id = :session_id;'); 41 $stmt->bindParam(':session_id', $session_id, PDO::PARAM_STR); 42 $flg = $stmt->execute(); 43 return $flg; 44 } 45 46 public function delete_session_by_updatedtime($updated_time){ 47 $stmt = $this->pdo->prepare('DELETE FROM session WHERE updated_at < :updated_at;'); 48 $stmt->bindParam("updated_at",$updated_time,PDO::PARAM_STR); 49 $flg = $stmt->execute(); 50 return $flg; 51 } 52 53}

補足
このサイトをもとに、session.save_pathのディレクトリの権限や所有者の変更は行いました。
・webサーバーはApache、phpのバージョンは7.2で行っております。

お分かりになるかたいらっしゃいましたら回答よろしくお願い致します。
また同じようなエラーが起こった方いらっしゃいましたらどのようにしたら直ったのか教えてください。
以上、よろしくお願い致します!

足らない情報ありましたら追記いたしますので、是非コメントお願い致します。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問