# 【MC-Innovation-Lab】PHP2回目
## 初期準備
XAMPP又はMAMPを起動
PHPの授業からはXAMPPというアプリケーションを利用します。
*「Apache Server」と「MySQL Server」の横に緑色のランプがついたら、サーバーの起動完了です。
### XAMPPでPHPのエラーが表示されない場合
XAMPP/etc/php.iniの中の設定を記述変更すると表示できるようになります。
471行目です
`
display_error:Off
`
↓↓↓↓↓↓↓↓
`
display_error:On
`
XAMPPを 再起動すると設定情報が更新されます。
### 授業資料のダウンロードと解凍
Zipファイルですので解凍してください。
本日使う授業フォルダphp02に入っているもの。
```
cssフォルダ
fontsフォルダ
funcs.php
index.php
insert.php
jsフォルダ
select.php
```
### php02フォルダをMAMPのhtdocs階層に移動させてください。
先ほどCドライブにダウンロードしたXAMMPの中にhtdocsというフォルダがあります。
ここに授業資料の「php02」フォルダを移動してください!
## セクション1:データベースとは
### まずはphpMyAdminとMySQLの場所を知る
#### 1. XAMPPを起動
#### 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. まずはfuncs.phpの中のdb_conn()関数を完成させてDB接続処理を作る
```
function db_conn(){
try {
$db_name = "gs_db"; //データベース名
$db_id = "root"; //アカウント名
$db_pw = ""; //パスワード:XAMPPはパスワードなしMAMPのパスワードはroot
$db_host = "localhost"; //DBホスト
$db_port = "3306"; //XAMPPの管理画面からport番号確認
$pdo = new PDO('mysql:dbname=' . $db_name . ';charset=utf8;host=' . $db_host.';port='.$db_port.'', $db_id, $db_pw);
return $pdo;//ここを追加!!
} catch (PDOException $e) {
exit('DB Connection Error:' . $e->getMessage());
}
}
```
#### 2. index.phpのformの設定を完成させる
```
method:POST
action:insert.php
```
#### 3. insert.phpに処理を追記
```
//1. POSTデータ取得
$name = $_POST["name"];
$email = $_POST["email"];
$naiyou = $_POST["naiyou"];
//2. DB接続します
require_once('funcs.php');
$pdo = db_conn();
//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();
```
#### 4. リダイレクト処理を追加
```
//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接続します
require_once('funcs.php');
$pdo = db_conn();
//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['naiyou'].' / '.$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['naiyou']).' '.h($result['email']);
$view .= "</p>";
```
今日やったおまじないの部分、
->
この矢印の部分について、気になる方はclassという概念を学ぶ必要があります。
classについて、もし興味ある方はこちら
https://twitter.com/daisu_yamazaki/status/1375797555339030533?s=21