Open k911672 opened 3 years ago
インフラの勉強で習ったdocker-compose.ymlの設定を今回のphpの勉強に反映させてる。
version: '2'
services:
web:
container_name: app-php-todo
build: ./app/
image: app-php-todo
ports:
- "80:80"
depends_on:
- mysql
volumes:
- ~/michael-php/todo-php/todo-php-docker:/var/www/app/
mysql:
container_name: mysql-php-todo
build: ./mysql/
image: mysql-php-todo
environment:
MYSQL_DATABASE: todo
MYSQL_USER: naoki
MYSQL_PASSWORD: 11922960Kim@
MYSQL_ROOT_PASSWORD: 11922960Kim@
TZ: "Asia/Tokyo"
ports:
- "3309:3306"
volumes:
- ~/michael-php/todo-php/todo-php-docker/docker/docker-php-todo/mysql/db-data:/var/lib/mysql
mysqlのデータの保存先はdocker-compose up -d
で自動で生成される
各Dockerfileも設定直している(インフラ勉強時のファイルの設定から変更していない)
bash-5.1# mysql -u naoki -h mysql -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.34 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| todo |
+--------------------+
2 rows in set (0.030 sec)
MySQL [(none)]> use todo
Database changed
MySQL [todo]> show tables;
Empty set (0.006 sec)
usersテーブルの作成
CREATE TABLE users (
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
name VARCHAR(20),
PASSWORD VARCHAR(20),
mail VARCHAR(20),
age INT,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
todosテーブルの作成
CREATE TABLE todos (
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
user_id INT NOT NULL,
title VARCHAR(20),
detail TEXT,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
delete_at INT
);
ALTER TABLE テーブル名 CHANGE COLUMN 既存カラム名 新しいカラム名 型名 (オプション);
ALTER TABLE users CHANGE COLUMN `PASSWORD` `password` varchar(20);
SELECT * FROM users;
INSERT INTO users (name, password, mail, age) VALUE ('mike', 1234, 'mike@gmail.com', 32);
INSERT INTO todos (user_id, title, detail) VALUE (1, '本日の仕事', 'メールチェック');
<?php
const DB_HOST = 'mysql:dbname=todo; host=mysql';
const DB_USER = 'naoki';
const DB_PASSWORD = '11922960Kim@';
try {
$pdo = new PDO(DB_HOST, DB_USER, DB_PASSWORD,[
PDO :: ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,//データベースから返って来る値を連想配列で返す。
PDO :: ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,//例外を表示する。
PDO :: ATTR_EMULATE_PREPARES => false//SQLインジェクション対策
]);
echo "接続成功\n";
} catch(PDOException $e){
echo "接続失敗\n". $e->getMessage()."\n";
exit();
}
?>
<?php
require 'db_connection.php';
$sqlUsers = 'select * from users where id = :id';
$stmtUsers = $pdo->prepare($sqlUsers);
$stmtUsers->bindValue('id', 1, PDO::PARAM_INT);
$stmtUsers->execute();
$users = $stmtUsers->fetchAll();
$sqlTodos = 'select * from todos where id = :id';
$stmtTodos = $pdo->prepare($sqlTodos);
$stmtTodos->bindValue('id', 1, PDO::PARAM_INT);
$stmtTodos->execute();
$todos = $stmtTodos->fetchAll();
foreach ($users[0] as $usersColumn => $usersRecord) {
echo $usersColumn.' : '.$usersRecord."\n";
}
foreach ($todos[0] as $todosColumn => $todosRecord) {
echo $todosColumn.' : '.$todosRecord."\n";
}
?>
db_connection.php
const DB_HOST = 'mysql:dbname=todo; host=mysql';
host名はコンテナの名前になる。
index.php
<?php
require 'db_connection.php';
$sqlUsers = 'select * from users where id = :id';
$stmtUsers = $pdo->prepare($sqlUsers);
$stmtUsers->bindValue('id', 1, PDO::PARAM_INT);
$stmtUsers->execute();
$users = $stmtUsers->fetchAll();
$sqlTodos = 'select * from todos where id = :id';
$stmtTodos = $pdo->prepare($sqlTodos);
$stmtTodos->bindValue('id', 1, PDO::PARAM_INT);
$stmtTodos->execute();
$todos = $stmtTodos->fetchAll();
foreach ($users[0] as $usersColumn => $usersRecord) {
echo $usersColumn.' : '.$usersRecord."\n";
}
foreach ($todos[0] as $todosColumn => $todosRecord) {
echo $todosColumn.' : '.$todosRecord."\n";
}
?>
db_connection.php
の設定を反映できるようrequire
する。
require 'db_connection.php';
docker-compose up -d --build
これを行わないと、データベースとphpが繋がらない。
class TodoController {
const DB_HOST = 'mysql:dbname=todo; host=mysql';
const DB_USER = 'naoki';
const DB_PASSWORD = '11922960Kim@';
public function index() {
try {
$pdo = new PDO(TodoController::DB_HOST, TodoController::DB_USER, TodoController::DB_PASSWORD,[
PDO :: ATTR_DEFAULT_FETCH_MODE => PDO :: FETCH_ASSOC,//データベースから返って来る値を連想配列で返す。
PDO :: ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,//例外を表示する。
PDO :: ATTR_EMULATE_PREPARES => false//SQLインジェクション対策
]);
echo "接続成功\n";
return $pdo;
} catch(PDOException $e){
echo "接続失敗\n". $e->getMessage()."\n";
exit();
}
}
}
DBの呼び出しをTodoControllerクラスで作成。
<?php
require_once("../../controllers/TodoController.php");
$todoController = new TodoController;
$pdo = $todoController->index();
$sqlTodos = 'select * from todos where id = :id';
$stmtTodos = $pdo->prepare($sqlTodos);
$stmtTodos->bindValue('id', 3, PDO::PARAM_INT);
$stmtTodos->execute();
$todos = $stmtTodos->fetchAll();
var_dump($todos);
foreach ($todos[0] as $todosColumn => $todosRecord) {
echo $todosColumn.' : '.$todosRecord."\n";
}
?>
下記の用にcontrollerの内容を記述している
require_once("../../controllers/TodoController.php");
$todoController = new TodoController;
$pdo = $todoController->index();
server {
listen 80;
server_name dev.naoki-php-todo.work ;
gzip_static on;
gzip_types image/png image/gif image/jpeg text/javascript text/css;
gzip_min_length 1000;
gzip on;
root /var/www/app/views/todos;
index index.php index.html index.htm;
access_log /var/log/nginx/dev.access.log main;
error_log /var/log/nginx/dev.error.log;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
include fastcgi_params;
}
}
下記、ファイルの参照先を変更
root /var/www/app/views/todos;
また、dockerの内容を書き換えたので、docker-compose up -d --build
を実行し、コンテナ内に反映させる。
$sqlTodos = 'select * from todos';
これだとuser全員のtodoを読み取ってしまうので、 ↓
$sqlTodos = 'select * from todos where user_id=1';
にしておこう!
こちらはmodelディレクトリにおく →読み取ったデータはcontrollerディレクトリ内のファイルに移し、controller内のファイルから、view内のファイルにデータを飛ばし表示する。 記述は割愛。
下記では$titel_idの変数はwhere句に入らない。
$sqlDetails = 'select * from todos where user_id=1 and title='."$titel_id";
下記のようにbindValue()
を使う。
$sqlDetails = 'select * from todos where user_id=1 and title=:title_id';
$stmtDetails = $details->prepare($sqlDetails);
$stmtDetails->bindValue('title_id', $todo_id, PDO::PARAM_STR);
GETパラメーターはURLを値として読み取る。
「URL ? GETパラメーター」となる。
<a href="./detail.php?todo_id=<? echo $todo['title']?>"><?php echo $todo['title']; ?></a>
上記を$_GETで読み取ると、 「var_dump($_GET)」は 「todo_id => $todo['title']の値」となる。
dockerの設定
ファイルのインストールは省略
1. docker-compose.ymlの設定
2. docker-composeの起動
3. コンテナの起動確認
動いているコンテナだけ出てくる。
コンテナをストップする場合