# 【InFiNiTO Club】プログラミング講座10回目
## 初期準備
### 授業資料のダウンロードと解凍
Teams上にアップロードした資料をダウンロードしてください。
Zipファイルですので解凍してください。
本日使う授業フォルダphp03に入っているもの。
```
cssフォルダ
fontsフォルダ
jsフォルダ
SQLフォルダ
index.php
insert.php
funcs.php
detail.php
delete.php
select.php
update.php
```
### php03フォルダをMAMPのhtdocs階層に移動させてください。
先ほどCドライブにダウンロードしたMAMPの中にhtdocsというフォルダがあります。
ここに授業資料の「php03」フォルダを移動してください!
### 内容は先週の復習
基本の登録と一覧表示
## セクション1 PHPからMySQLを操作(更新)
### まずは更新画面を表示する為のリンクを作成する。
#### 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. ブラウザの検証ツールから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><textarea name="naiyou" 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><textarea name="naiyou" rows="4" cols="40"><?= $result['naiyou'] ?></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"];
$naiyou = $_POST["naiyou"];
$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, naiyou = :naiyou, 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(':naiyou', $naiyou, 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');
}
```
## セクション2 PHPからMySQLを操作(削除)
### 削除ボタン(削除リンクを作成する)
#### 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>';
```
### 削除処理を実装する
#### 1. 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');
}
```
## さくらサーバーでのデプロイ方法
### 1. 作ったアプリのフォルダをFTPでさくらサーバーのwww直下にアップロード
*今回は授業で作成したphp03フォルダをアップしましょう。
### 2. ローカル(MAMP)のデータベースをエクスポートする
```
1:phpMyAdminにログインする
2:エクスポートしたいDBを左側の一覧から選択
3:上部のタブからエクスポートを選択
4:エクスポート方法の詳細にチェックを入れる
5:フォーマットはSQLのままにしておく
6:その他の設定は変更せず実行
7:〇〇.sqlというファイルが作成されます。
```
### 3. さくらサーバー上でデータベースを作成します。
ログイン後ホームからデータベースのショートカットをクリック。
新規追加からデータベース名を入力し作成します。
*契約者のユーザー名が接頭名としてデフォルトで付きます。
### 4. 先ほど作ったさくらサーバーのデータベースにインポートします。
```
1:phpMyAdminにログインする
2:インポートしたいDBを左側の一覧から選択
3:上部のタブからインポートを選択
4:ファイル選択フォームから先ほど作成した〇〇.sqlを選択して実行
```
これでデータベースは完成しているはずです。
### 5.最後にさくらサーバーに公開しているphp03フォルダ内のfuncs.phpのDB接続関数を編集します。
```
function db_conn(){
try {
$db_name = "****"; //データベース名
$db_id = "****"; //ユーザ名
$db_pw = "****"; //パスワード
$db_host = "mysql〇〇.契約名.sakura.ne.jp"; //DBホスト
$db_port = "3306"; //さくらサーバーのポート番号は3306です
$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());
}
}
```
