---
# System prepended metadata

title: 【MC-Innovation-Lab】PHP2回目

---

# 【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」フォルダを移動してください！

## セクション１：データベースとは
### まずは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. 実行してみる

## セクション２：データベース操作
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. まずは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();


//３．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{
  //５．index.phpへリダイレクト
  header('Location: index.php');//ヘッダーロケーション（リダイレクト）
}
```

### PHPからデータ取得と表示
#### 1. selsect.phpでデータ取得
```
//1.  DB接続します
require_once('funcs.php');
$pdo = db_conn();

//２．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