73866


### 環境

Mac  
PHP  
ClearDB MySQL  
(MySQL Workbenchで操作中)  
Herokuでデプロイ

### 実現したいこと

データベースから情報を取得し、デプロイの際に、日本時間で表示させたい

### 課題

表示される時間が日本時間にならず9時間の時差が生じてしまいます。

画像に記載しているようなSQL文を試したのですが、"SUPER特権が付与されていないので変更できない" というエラーが出てきてしまいました。

**設定がUTCのまま:**

[![設定がUTCのまま](https://i.stack.imgur.com/a4HXi.png)](https://i.stack.imgur.com/a4HXi.png)

## ↓時間の部分に時差が生まれる

**入力時の時間**  
11：48(11時48分)  
**表示時の時間**  
02:48(02時48分)  
**時差**  
９時間の時差が生じる  
[![時間の部分に時差が生まれる](https://i.stack.imgur.com/euZT0.png)](https://i.stack.imgur.com/euZT0.png)

また、PHPプログラムで時間を変更した方がいい場合はどのようにするのがよいのでしょうか。

何かヒントやアドバイスをいただきたいです。  
何卒よろしくお願いいたします。

**追記**  
データベースの保存内容になります。

[![データベースの保存内容](https://i.stack.imgur.com/nG6ph.png)](https://i.stack.imgur.com/nG6ph.png)

表示内容に関わるソースコードになります

[code]

    <?php
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    error_reporting(E_ALL);
    require 'escape.php';
    $_GET['id'] = filter_input(INPUT_GET, 'id');
    $id = $_GET['id'];
    $_GET['page_id'] = filter_input(INPUT_GET, 'page_id');
    //データ登録
    function createBoard($db, $board)
    {
        if (!empty($board['nickname']) && !empty($board['message'])) {
            $statement = $db->prepare('INSERT INTO posts SET nickname=?, message=?,created=NOW()');
            $statement->execute(array($board['nickname'], $board['message']));
        }
    }
    //バリデーション処理
    function validate($board)
    {
        $errors = [];
        if (!strlen($board['nickname'])) {
            $errors['nickname'] = 'ニックネームを入力してください';
        }
        if (!strlen($board['message'])) {
            $errors['message'] = '投稿が未入力です';
        }
        return $errors;
    }
    //ページネーションの作成
    function pagiNation($db)
    {
        define('max_view', 10);
        $count = $db->prepare('SELECT COUNT(*) AS count FROM posts');
        $count->execute();
        $total_count = $count->fetch(PDO::FETCH_ASSOC);
        $maxPage = ceil($total_count['count'] / max_view);
        //ページ番号の取得
        $page = $_GET['page_id'];
        if ($page === '') {
            $page = 1;
        } else {
            $page = $_GET['page_id'];
        }
        $page = max($page, 1);
        $page = min($page, $maxPage);
        //表示する記事の取得
        $select = $db->prepare("SELECT * FROM posts ORDER BY id DESC LIMIT :start,:max ");
        //1ページ目の処理
        if ($page === 1) {
            $select->bindValue(":start", $page - 1, PDO::PARAM_INT);
            $select->bindValue(":max", max_view, PDO::PARAM_INT);
        } else {
            $select->bindValue(":start", ($page - 1) * max_view, PDO::PARAM_INT);
            $select->bindValue(":max", max_view, PDO::PARAM_INT);
        }
        $select->execute();
        $list = $select->fetchAll(PDO::FETCH_ASSOC);
        return [$page, $maxPage, $list];
    }
    //データの削除
    function deleteBoard($db, $id)
    {
        $statement = $db->prepare('DELETE FROM posts WHERE id=?');
        $statement->execute(array($id));
    }
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        $board = [
            'nickname' => $_POST['nickname'],
            'message' => $_POST['message'],
        ];
        $errors = validate($board);
        if (!count($errors)) {
            header('Location: index.php');
        }
    }
    
[/code]


CC BY-SA 4.0
2021-02-06T03:16:42.367
73826
2021-02-16T00:22:49.480
2021-02-11T22:40:56.150
42289
42289
question
php mysql heroku
データベースから取得した時間を表示する際に時差が生じてしまう。デプロイの際に、日本時間で表示させたい。


`SET GLOBAL time_zone='Asia/Tokyo'` は権限がないかもしれませんが、`SET time_zone='+09:00'`
はできるはずです。

データベース接続後に `SET time_zone='+09:00'` を実行すれば良いと思います。


CC BY-SA 4.0
2021-02-08T12:21:01.707
73866
2021-02-08T12:21:01.707
3249
73826
answer


接続時に、time_zoneを設定することで解決いたしました！  
沢山のアドバイス、ありがとうございました！

[code]

    <?php
    function connect()
    {
        $db = parse_url(getenv("CLEARDB_DATABASE_URL"));
        $db['dbname'] = ltrim($db['path'], '/'); //pathのみ取り出す
        $dsn = "mysql:host={$db['host']};dbname={$db['dbname']};charset=utf8";
        $driver_options = [PDO::MYSQL_ATTR_INIT_COMMAND => "SET time_zone='+09:00'"];
        try {
            $db = new PDO($dsn, $db['user'], $db['pass'], $driver_options);
            $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        } catch (PDOException $Exception) {
            die('DB接続エラー: ' . $Exception->getMessage());
        }
        return $db;
    }
    
[/code]


CC BY-SA 4.0
2021-02-16T00:22:49.480
74028
2021-02-16T00:22:49.480
42289
73826
answer