PHPで作る簡易掲示板

右も左もわからない初学者がDocker＋PHP＋MySQLで開発環境構築。

Dockerインストール済み
windows
エディタはvscode使用

<b>①とりあえずファイル構成</b>
```
.
├── .vscode/
│   └── launch.json
├── html/
│   └── index.php
├── mysql
│   └── my.cnf
├── php/
│   ├── Dockerfile
│   └── php.ini
└── docker-compose.yml
```
<b>②とりあえず書いたやつ</b>
```docker-compose.yml
version: '3'

services:

  #MySQL用コンテナ
  mysql:
    container_name: mysql
    image: mysql:5.7
    volumes:
      - ./mysql:/var/lib/mysql #左側が保存先
      #- ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf #my.cnfを読み込む
      - ./mysql:/etc/mysql/conf.d/my.cnf #my.cnfを読み込む
    ports:
      - 3307:3306
    environment:
      - MYSQL_ROOT_PASSWORD=test
      - MYSQL_DATABASE=test
      - MYSQL_USER=test
      - MYSQL_PASSWORD=password
    # - TZ='Asia/Tokyo'
    # command: ['mysqld', '--character-set-server=utf8mb4','--collation-server=utf8mb4_general_ci','--default-time-zone=+09:00']
    #↑上2つはmy.cnfで記述してるから要らない
  #phpMyAdmin用コンテナ
  phpmyadmin:
    container_name: phpMyAdmin
    depends_on:
      - mysql
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=test
      - PMA_PASSWORD=password
    restart: always
    ports:
      - "80:80"

  #php用コンテナ
  web:
    build: ./php
    volumes:
      - ./php//php.ini:/usr/local/etc/php/php.ini
      - ./html:/var/www/html
    ports:
      - 8080:80
    depends_on:
      - mysql
```


```my.cnf
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
default-time-zone = 'Asia/Tokyo'

[mysql]
default-character-set=utf8

[client]
default-character-set=utf8
```
<b>●躓いた所 : mysqlのコンテナが正常に動かない(runningにならない)</b>
<b>原因 : mysqlフォルダにファイルが存在したため</b>

mysqlフォルダの中にmy.cnfを作成するとDocker-compose up -dでmysqlのコンテナが起動しなかった。
ログを確認すると（VSCODEのDockerアイコン→コンテナ名を右クリック→view Logsをクリック）
[ERROR] --initialize specified but the data directory has files in it. Aborting.
(日本語訳：[エラー] --initializeが指定されましたが、データディレクトリにファイルがあります。中止します。)
と記載があった。以下対処したこと
①mysqlフォルダを作成。フォルダ内にファイルを作成しない。
②docker-compose build→docker-compose up -d
③mysqlのフォルダや必要なファイルが作成された。その後mysqlフォルダ内にmy.cnfファイルを作成
④もう一度docker-compose up -d
⑤mysqlコンテナが起動した。

```DockerFile:DockerFile
FROM php:8.0-apache

ENV TZ Asia/Tokyo
RUN pecl install xdebug && \
    docker-php-ext-enable xdebug && \
    echo "${TZ}" > /etc/timezone \
    && dpkg-reconfigure -f noninteractive tzdata
RUN docker-php-ext-install pdo_mysql
```
FROM命令でPHPイメージの作成
ENV～RUN命令 タイムゾーンの設定 Xデバッグをインストールして機能を有効にする


```PHP.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
```
<b>●躓いた所 : phpMyadminにログインできない</b>
<b>原因 : phpMyadmin用のユーザーとパスワードの設定がされていなかった。</b>

Docker-compose.ymlのphpMyAdmin用コンテナで
PMA_USER=test
PMA_PASSWORD=password
↑の記載をしていず、最初PHPMyAdminにログインできなかった。
あと、PMA_USERとMYSQL_USER
PMA_PASSWORDとMYSQL＿PASSWORDは一致していないとログインできなかった。

<b>●躓いた所 : my.cnfが読み取られていない</b>
<b>原因 : 読み取り専用になっていなかった。</b>
Windowsの場合、my.cnfは読み取り専用にしないといけないらしい。

<b>●躓いた所 : DockerFileやDocker-compose.ymlを修正しても反映されない</b>
<b>原因 : 再度ビルドする必要があった。docker-compose upだとイメージが再作成されない。

<b>●躓いた所 : MySQLに接続できない（MySQLの接続でエラー。SQLSTATE[HY000] [2002] No such file or directory）</b>
<b>原因 : 接続文字列を誤っていた。</b>
https://qiita.com/b-coffin/items/8103583efe3767b6748e
この記事にあるように新規PDOを作成する際のhost名を、docker-compose.ymlで指定したservice名に変更したところ改善。(host名をmysqlにした。)
```
$dsn = 'mysql:host=mysql;dbname=test;charset=utf8mb4';
$user = 'test';
$pass = 'password';
```
<b>●躓いた所 : まだMySQLに接続できない（SQLSTATE[HY000] [1045] Access denied for user 'root'@'xx.xx.xx.xx' (using password: YES)）</b>
<b>原因 : ログインしていなかった（mysqldが落ちていた？）</b>

```
docker-compose exec mysql mysql -proot
```
で、ログインしたところ接続された。（-pの直後にDocker-compose.ymlで設定したMYSQL_PASSWORDの値を入力。)
今はDocker-compose.ymlでMYSQL_PASSWORD=passwordとしているが元々はrootをパスワードにしていた。パスワードをpasswordに変更後docker-compose down→docker-compose build→docker-compose up -dとしたので-prootではなく-ppasswordとするのが正解だと思ったが、-ppasswordではログインできなかった。しかしdocker-compose exec mysql bashでコンテナにログインした後はmysql -u test -p test→passwordでログインできた。何故なのか分からない…。

<b>●躓いた所 : MySQLに接続できない（SQLSTATE[HY000] [1045] Access denied for user 'root'@'xx.xx.xx.xx' (using password: NO)）</b>
<b>原因 : コマンドが対話形式になっていなかった</b>

```
docker exec -it mysql mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.44 MySQL Community Server (GPL)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```
-i=標準入力(stdin)を有効にする
-t=議事端末(TTY)を有効にする
この二つが「対話的に」コマンドを実行するために必要。(ソース:ChatGPT)
MySQLクライアント(mysqlコマンド)は、ユーザーからの入力を受け取って処理する対話型プログラム。とのこと。

-itがなくても前回接続できたのは何故なのか？わかり次第追記する

#
※参考にしたもの

・ドットインストール(Premiumプラン)　PHPで作る簡易掲示板
→かなり簡易的。DBの接続はせずにタブ区切りのテキストファイルを使用する。

https://zenn.dev/aono/articles/0856cf4d4e3e25

https://qiita.com/are-38-a/items/fbd08334a7d613c3d824

https://qiita.com/tegnike/items/bcdcee0320e11a928d46



https://qiita.com/b-coffin/items/8103583efe3767b6748e












https://www.infra-linux.com/menu-docker3/phpmyadmin-mysql-container/