# PHP03
## 授業資料
[ダウンロードリンク](https://drive.google.com/drive/folders/11zbHZB76g-UqfYCPZKdFPz-R0yrvTHvc?usp=sharing)
## 1章:DBをSQLファイルをインポートして作成する
### まずはphpMyAdminを開いて授業用のDBを作成する
#### 1. MAMPを起動
#### 2. WebStartボタンから起動トップページを表示
#### 3. ページの真ん中MySQLのタブからphpMyAdminのリンクをクリック
#### 4. 起動した画面がMySQLを管理するphpMyAdminの画面が表示されます。
#### 5. データベースタブをクリック
#### 6. データベースを作成から以下の名前で作成
```
データベース名:gs_db3
照合順序:utf8_unicode_ci
```
#### 7. 作成ボタンをクリック
左側にgs_db3というデータベースができていると思います。
現在は空っぽです。
### SQLファイルからインポートしてみよう
〇〇.sqlというSQLファイルをインポートしてデータを作成します。
#### 1. gs_db3を選択した状態でインポートタブをクリック
#### 2. ファイルを選択をクリックして配布した資料内のSQLフォルダ内のphp3_sql.sqlを選択
#### 3. 実行してみる
#### 4. 授業用のDBが完成しているはずです
## 2章:関数化&呼び出し
よく使う処理は関数化するのが一般的です。
同じ処理を複数回書くのではなく関数化して再利用しましょう。
### DB接続処理を関数化
#### 1. funcs.phpにDB接続関数を作成する
```
function db_conn()
{
try {
$db_name = "gs_db3"; //データベース名
$db_id = "root"; //アカウント名
$db_pw = "root"; //パスワード:XAMPPはパスワード無しに修正してください。
$db_host = "localhost"; //DBホスト
$pdo = new PDO('mysql:dbname=' . $db_name . ';charset=utf8;host=' . $db_host, $db_id, $db_pw);
return $pdo;//ここを追加!!
} catch (PDOException $e) {
exit('DB Connection Error:' . $e->getMessage());
}
}
```
#### 2. 関数を外部ファイルから呼び出す方法
```
//2. DB接続します
require_once('funcs.php');
$pdo = db_conn();
```
### SQLエラー処理とリダイレクト処理を関数化
#### 1. funcs.phpにSQLエラー関数とリダイレクト処理を作成する
```
//SQLエラー関数:sql_error($stmt)
function sql_error($stmt)
{
$error = $stmt->errorInfo();
exit("SQLError:" . print_r($error, true));
}
//リダイレクト関数: redirect($file_name)
function redirect($file_name)
{
header("Location: " . $file_name );
exit();
}
```
#### 2. 関数を呼び出す
```
//4.データ登録処理後
if ($status == false) {
sql_error($stmt);
} else {
redirect('index.php');
}
```
## 3章:更新処理を実装していく
PHPの基本処理、登録・表示(取得)・更新・削除の4つのうちの一つです。
更新処理は更新画面→更新処理→リダイレクトの流れです。
### UPDATE(データ更新)
#### 書式
```
UPDATE テーブル名 SET 更新対象1=:更新データ ,更新対象2=:更新データ2,... WHERE id = 対象ID;
```
### 更新画面を表示する為のリンクを作成する。
#### 1. select.phpのデータ表示のwhile文内のHTML生成にリンクを作成(GETデータ送信リンク)
```
//GETデータ送信リンク作成
// <a>で囲う。
$view .= '<p>';
$view .= '<a href="detail.php?id=' . $result['id'] . '">';
$view .= $result["indate"] . ":" . $result["name"];
$view .= '</a>';
$view .= '</p>';
```
#### 2. select.php内のDB接続・SQLエラー・リダイレクト処理を外部関数から呼び出しに変更する
#### 3. ブラウザの検証ツールからaタグのリンクの飛び先をチェック
### 更新画面を作成する
#### 1. detail.phpにデータ取得処理を記述
```
<?php
//1.外部ファイル読み込みしてDB接続
require_once('funcs.php');
$pdo = db_conn();
//2.対象のIDを取得
$id = $_GET['id'];
//3.データ登録SQL作成
$stmt = $pdo->prepare("SELECT * FROM gs_an_table WHERE id=:id;");
$stmt->bindValue(':id',$id,PDO::PARAM_INT);
$status = $stmt->execute();
//4.データ表示
$view = '';
if ($status == false) {
sql_error($status);
} else {
$result = $stmt->fetch();
}
?>
```
#### 2. detail.phpに更新画面用のHTMLを記述
index.phpのコードをまるっとコピーして貼り付け!
```
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>データ登録</title>
<link href="css/bootstrap.min.css" rel="stylesheet">
<style>
div {
padding: 10px;
font-size: 16px;
}
</style>
</head>
<body>
<header>
<nav class="navbar navbar-default">
<div class="container-fluid">
<div class="navbar-header"><a class="navbar-brand" href="select.php">データ一覧</a></div>
</div>
</nav>
</header>
<!-- method, action, 各inputのnameを確認してください。 -->
<form method="POST" action="insert.php">
<div class="jumbotron">
<fieldset>
<legend>フリーアンケート</legend>
<label>名前:<input type="text" name="name"></label><br>
<label>Email:<input type="text" name="email"></label><br>
<label>年齢:<input type="text" name="age"></label><br>
<label><textarea name="content" rows="4" cols="40"></textarea></label><br>
<input type="submit" value="送信">
</fieldset>
</div>
</form>
</body>
</html>
```
#### 3. detail.phpのHTML内formにvalueデータを代入する
```
<legend>フリーアンケート</legend>
<label>名前:<input type="text" name="name" value="<?= $result['name'] ?>"></label><br>
<label>Email:<input type="text" name="email" value="<?= $result['email'] ?>"></label><br>
<label>年齢:<input type="text" name="age" value="<?= $result['age'] ?>"></label><br>
<label><textarea name="content" rows="4" cols="40"><?= $result['content'] ?></textarea></label><br>
<input type="submit" value="送信">
```
#### 4. detail.phpのHTML内formの送信ボタン直上に以下を追記
```
<!-- ↓追加 -->
<input type="hidden" name="id" value="<?= $result['id'] ?>">
<input type="submit" value="送信">
```
#### 5. detail.phpのHTML内formのaction先をupdate.phpに変更する
```
<form method="POST" action="update.php">
.....省略
</form>
```
### 更新処理の中身を作成する
#### 1. update.phpに更新処理を追記
```
//1. POSTデータ取得
$name = $_POST["name"];
$email = $_POST["email"];
$age = $_POST["age"];
$content = $_POST["content"];
$id = $_POST["id"];
//2. DB接続します
require_once('funcs.php');
$pdo = db_conn();
//3.データ登録SQL作成
$stmt = $pdo->prepare( "UPDATE gs_an_table SET name = :name, email = :email, age = :age, content = :content, indate = sysdate() WHERE id = :id;" );
$stmt->bindValue(':name', $name, PDO::PARAM_STR);/// 文字の場合 PDO::PARAM_STR
$stmt->bindValue(':email', $email, PDO::PARAM_STR);// 文字の場合 PDO::PARAM_STR
$stmt->bindValue(':age', $age, PDO::PARAM_INT);// 数値の場合 PDO::PARAM_INT
$stmt->bindValue(':content', $content, PDO::PARAM_STR);// 文字の場合 PDO::PARAM_STR
$stmt->bindValue(':id', $id, PDO::PARAM_INT);// 数値の場合 PDO::PARAM_INT
$status = $stmt->execute(); //実行
//4.データ登録処理後
if ($status == false) {
sql_error($stmt);
} else {
redirect('select.php');
}
```
## 4章 削除処理を実装していく
PHPの基本処理、登録・表示(取得)・更新・削除の4つのうちの最後の一つです。
削除処理は削除ボタンクリック→削除処理の流れなので比較的簡単です。
### DELETE(データ削除)
#### 書式
```
DELETE FROM テーブル名 WHERE id = 対象ID
```
### 削除ボタン(削除リンクを作成する)
#### 1. select.phpのデータ表示のwhile文内のHTML生成に削除リンクを作成
```
//GETデータ送信リンク作成
// <a>で囲う。
$view .= '<p>';
$view .= '<a href="detail.php?id=' . $result['id'] . '">';
$view .= $result["indate"] . ":" . $result["name"];
$view .= '</a>';
$view .= '<a href="delete.php?id=' . $result['id'] . '">';//追記
$view .= ' [削除]';//追記
$view .= '</a>';//追記
$view .= '</p>';
```
#### 2. delete.phpに削除処理を作成する
```
//1.対象のIDを取得
$id = $_GET['id'];
//2.DB接続します
require_once('funcs.php');
$pdo = db_conn();
//3.削除SQLを作成
$stmt = $pdo->prepare("DELETE FROM gs_an_table WHERE id = :id");
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
$status = $stmt->execute(); //実行
//4.データ登録処理後
if ($status == false) {
sql_error($stmt);
} else {
redirect('select.php');
}
```