# ヤマトデジタルアカデミーWEBプログラミング講座8回目
## 初期準備
### MAMPを起動しておいてください。
MySQLの起動が確認までしておきましょう。
MySQLが起動しない場合の対処法
https://codeforfun.jp/mamp-mysql-not-starting-solutioin/
### 授業資料のダウンロードと解凍
Teams上にアップロードした資料をシンクライアント上にダウンロードしてください。
Zipファイルですので解凍してください。
本日使う授業フォルダ08_phpに入っているもの。
```
css
fonts
js
index.php
insert.php
```
### 08_phpフォルダをMAMPのhtdocs階層に移動させてください。
先ほどCドライブにダウンロードしたMAMPの中にhtdocsというフォルダがあります。
ここに授業資料の「08_php」フォルダを移動してください!
windows向け補足記事
ダウンロードから起動までの手順
https://codeforfun.jp/how-to-install-mamp-windows-and-mac/#MAMPWindows
MySQLが起動しない場合の対処法
https://codeforfun.jp/mamp-mysql-not-starting-solutioin/
## データベース作成
### まずはphpMyAdminとMySQLの場所を知る
#### 1. MAMPを起動
#### 2. WebStartボタンから起動トップページを表示
#### 3. ページの真ん中MySQLのタブからphpMyAdminのリンクをクリック
#### 4. 起動した画面がMySQLを管理するphpMyAdminの画面が表示されます。
### データベースを作成
#### 1. データベースタブをクリック
#### 2. データベースを作成から以下の名前で作成
```
データベース名:ymt_db
照合順序:utf8_unicode_ci
```
#### 3. 作成ボタンをクリック
左側にymt_dbというデータベースができていると思います。
現在は空っぽです。
### テーブルを作成してみよう
データベースの中にデータ管理用の表としてテーブルを作成します。
今回はアンケートシステムのDBとしてテーブルを構築します。
#### 1. テーブルを作成に以下の設定で作成
```
テーブル名:chat_table
カラム数:4
```
#### 2. カラムを作成していく
```
id: int(12) AUTO_INCREMENT PRIMARY KEY
name: var_char(64)
body: text
indate: datetime
```
#### 3. 実行するとテーブルが完成している。
## データベース操作
MySQLではデータベース言語SQLというものを使って操作します。
大きく次の4つの操作になります。登録・表示(取得)・更新・削除
*SQL文ではシングルコーテーション!
*phpMyAdminのSQLタブから入力してクエリを実行してみる。
### INSERT(データ登録)
#### 1. 書式
```
INSERT INTO テーブル名(カラム1,カラム2,カラム3・・・)
VALUES (値1,値2,値3・・・);
```
#### 2. データ登録SQLを書いてみよう
```
INSERT INTO gs_an_table(id,name,email,naiyou,indate)
VALUES (NULL,'テスト太郎','test1@test.jp','test',sysdate());
```
#### 3. 3~4個ほどデータを追加してみよう
### SELECT(データ取得)
#### 1. 書式
```
SELECT 表示するカラム FROM テーブル名;
```
#### 2. データ取得の基本バリエーション
```
SELECT * FROM gs_an_table; --全カラム指定取得
SELECT name FROM gs_an_table; --単一カラム指定取得
SELECT name,email FROM gs_an_table; --複数カラム指定取得
SELECT * FROM gs_an_table WHERE name='テスト太郎'; --WHEREを使った特定データの取得
```
#### 3. 条件付き検索取得
```
--演算子を使った検索
SELECT * FROM テーブル名 WHERE id = 1;
SELECT * FROM テーブル名 WHERE id >= 3;
--AND,ORで検索条件を複数指定
SELECT * FROM テーブル名 WHERE id = 1 OR id = 2;
SELECT * FROM テーブル名 WHERE id = 1 AND id = 2;
--曖昧検索
SELECT * FROM テーブル名 WHERE indate LIKE '2021-06%';
SELECT * FROM テーブル名 WHERE email LIKE '%@gmail.com';
SELECT * FROM テーブル名 WHERE email LIKE '%@%';
```
#### 4. ソート取得と制限取得
```
--ソート
書式:SELECT * FROM テーブル名 ORDER BY ソート対象カラム ソートルール;
SELECT * FROM テーブル名 ORDER BY id DESC; --降順
SELECT * FROM テーブル名 ORDER BY id ASC; --昇順
--取得数制限
書式:SELECT * FROM テーブル名 LIMIT ***;
SELECT * FROM テーブル名 LIMIT 5; --最大5件取得
SELECT * FROM テーブル名 LIMIT 3,5; --3番目のデータから最大5件取得
```
## PHPからMySQLを操作
PHP(サーバー言語)からMySQLにデータを送って保存したり取得したりしてみる。
### PHPからデータ登録
#### 1. index.phpのformの設定を完成させる
```
method:POST
action:insert.php
```
#### 2. insert.phpに処理を追記
```
//1. POSTデータ取得
$name = $_POST["name"];
$body = $_POST["body"];
//2. DB接続します
try {
//Password:MAMP='root''
$pdo = new PDO('mysql:dbname=ymt_db;charset=utf8;host=localhost','root','root');
} catch (PDOException $e) {
exit('DBConnectError:'.$e->getMessage());
}
//3.SQL文を用意(データ登録:INSERT)
$stmt = $pdo->prepare(
"INSERT INTO chat_table( id, name, body, indate )
VALUES( NULL, :name, :body, sysdate() )"
);
// 4. バインド変数を用意
$stmt->bindValue(':name', $name, PDO::PARAM_STR); //Integer(数値の場合 PDO::PARAM_INT)
$stmt->bindValue(':body', $body, PDO::PARAM_STR); //Integer(数値の場合 PDO::PARAM_INT)
// 5. 実行
$status = $stmt->execute();
```
### PHPからデータ取得と表示
#### 1. index.phpの29行目以降からPHPの処理でデータ取得
```
//1. DB接続します
try {
//Password:MAMP='root',XAMPP=''
$pdo = new PDO('mysql:dbname=ymt_db;charset=utf8;host=localhost','root','root');
} catch (PDOException $e) {
exit('DBConnectError:'.$e->getMessage());
}
//2.SQL文を用意(データ取得:SELECT文)
$stmt = $pdo->prepare("SELECT * FROM chat_table");
//3. 実行
$status = $stmt->execute();
```
#### 2. selsect.phpでデータ表示処理
先程の処理のすぐ下に以下を追記
```
//4.データ表示
$view="";//空のviewを作成
if($status==false) {
//execute(SQL実行時にエラーがある場合)
$error = $stmt->errorInfo();
exit("ErrorQuery:".$error[2]);
}else{
//Selectデータの数だけ自動でループしてくれる
//FETCH_ASSOC=http://php.net/manual/ja/pdostatement.fetch.php
while( $result = $stmt->fetch(PDO::FETCH_ASSOC)){
$view .= "<div class='arrow_box'>";
$view .= $result['indate'].':'.$result['name'];
$view .= "<br><br>";
$view .= $result['body'];
$view .= "</div>";
}
}
```
#### 3. index.phpの表示用HTMLにviewを呼び出す
```
<div class="container jumbotron"><?= $view ?></div>
```