# PHP02
## 授業資料
[ダウンロードリンク](https://drive.google.com/drive/folders/1FChvsX5Tlplwr9Qg1S7BMQQyDrtnC4aq?usp=sharing)
## 1章:データベースとは
### まずはphpMyAdminとMySQLの場所を知る
#### 1. MAMPを起動
#### 2. WebStartボタンから起動トップページを表示
#### 3. ページの真ん中MySQLのタブからphpMyAdminのリンクをクリック
#### 4. 起動した画面がMySQLを管理するphpMyAdminの画面が表示されます。
### データベースを作ってみよう
#### 1. データベースタブをクリック
#### 2. データベースを作成から以下の名前で作成
```
データベース名:gs_db
照合順序:utf8_unicode_ci
```
#### 3. 作成ボタンをクリック
左側にgs_dbというデータベースができていると思います。
現在は空っぽです。
### テーブルを作成してみよう
データベースの中にデータ管理用の表としてテーブルを作成します。
今回はアンケートシステムのDBとしてテーブルを構築します。
#### 1. テーブルを作成に以下の設定で作成
```
テーブル名:gs_an_table
カラム数:5
```
#### 2. カラムを作成していく
```
id: int(12) AUTO_INCREMENT PRIMARY KEY
name: var_char(64)
email: var_char(128)
naiyou: text
indate: datetime
```
#### 3. 実行してみる
## 2章:データベース操作
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件取得
```
## 3章:PHPからMySQLを操作
PHP(サーバー言語)からMySQLにデータを送って保存したり取得したりしてみる。
### PHPからデータ登録
#### 1. index.phpのformの設定を完成させる
```
method:POST
action:insert.php
```
#### 2. insert.phpに処理を追記
```
//1. POSTデータ取得
$name = $_POST["name"];
$email = $_POST["email"];
$naiyou = $_POST["naiyou"];
//2. DB接続します
try {
//Password:MAMP='root',XAMPP=''
$pdo = new PDO('mysql:dbname=gs_db;charset=utf8;host=localhost','root','root');
} catch (PDOException $e) {
exit('DBConnectError:'.$e->getMessage());
}
//3.SQL文を用意(データ登録:INSERT)
$stmt = $pdo->prepare(
"INSERT INTO gs_an_table( id, name, email, naiyou, indate )
VALUES( NULL, :name, :email, :naiyou, sysdate() )"
);
// 4. バインド変数を用意
$stmt->bindValue(':name', $name, PDO::PARAM_STR); //Integer(数値の場合 PDO::PARAM_INT)
$stmt->bindValue(':email', $email, PDO::PARAM_STR); //Integer(数値の場合 PDO::PARAM_INT)
$stmt->bindValue(':naiyou', $naiyou, PDO::PARAM_STR); //Integer(数値の場合 PDO::PARAM_INT)
// 5. 実行
$status = $stmt->execute();
```
#### 3. リダイレクト処理を追加
```
//6.データ登録処理後
if($status==false){
//SQL実行時にエラーがある場合(エラーオブジェクト取得して表示)
$error = $stmt->errorInfo();
exit("ErrorMassage:".$error[2]);
}else{
//5.index.phpへリダイレクト
header('Location: index.php');//ヘッダーロケーション(リダイレクト)
}
```
### PHPからデータ取得と表示
#### 1. selsect.phpでデータ取得
```
//1. DB接続します
try {
//Password:MAMP='root',XAMPP=''
$pdo = new PDO('mysql:dbname=gs_db;charset=utf8;host=localhost','root','root');
} catch (PDOException $e) {
exit('DBConnectError:'.$e->getMessage());
}
//2.SQL文を用意(データ取得:SELECT)
$stmt = $pdo->prepare("SELECT * FROM gs_an_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 .= "<p>";
$view .= $result['indate'].':'.$result['name'].' '.$result['text'].' '.$result['email'];
$view .= "</p>";
}
}
```
#### 3. select.phpの表示用HTMLにviewを呼び出す
```
<div>
<div class="container jumbotron"><?= $view ?></div>
</div>
```
#### 4. select.phpにfuncs.phpを読み込んで関数を使う
```
<?php
require_once('funcs.php'); //select.phpの一番上に1行追記
```
viewの処理の部分でXSS対策のh関数を呼び出す
```
$view .= "<p>";
$view .= h($result['indate']).':'.h($result['name']).' '.h($result['text']).' '.h($result['email']);
$view .= "</p>";
```
今日やったおまじないの部分、
->
この矢印の部分について、気になる方はclassという概念を学ぶ必要があります。
classについて、もし興味ある方はこちら
https://twitter.com/daisu_yamazaki/status/1375797555339030533?s=21