# 【MC-Innovation-Lab】PHP5回目
### 授業資料のダウンロードと解凍
Teams上にアップロードした資料をダウンロードしてください。
Zipファイルですので解凍してください。
### php05フォルダをMAMPのhtdocs階層に移動させてください。
先ほどCドライブにダウンロードしたMAMPの中にhtdocsというフォルダがあります。
ここに授業資料の「php05」フォルダを移動してください!
## セクション2 投稿者が判別できるアンケートシステムの構築
### データベースに1対多のリレーションを組む為のカラムを追加する
#### 1. gs_dbを選択した状態でgs_an_tableをクリック
#### 2. gs_an_tableを選択した状態で構造タブをクリック
#### 3. 中段あたりにあるカラム追加フォームからカラムを追加
`1個のカラムを追加するidの後へ`で実行
#### 4. カラムを追加
```
user_id
int(10)
```
#### 5. 事前に登録済みのデータのuser_idは全て0になっているので1~3の任意の数字に変更
#### 6. gs_user_tableのnameの部分をuser_nameに変更
### データ登録時のログインユーザーidを保存する処理を追加
#### 1. insert.phpでまずはログインユーザーのidを取得
```
<?php
session_start();//追記!!!
//1. POSTデータ取得
省略
//ログインユーザーidを取得
$user_id = $_SESSION["user_id"];
```
#### 2. insert.phpのSQLを変更
```
INSERT INTO gs_an_table(user_id,name,email,naiyou,indate)VALUES(:user_id,:name,:email,:naiyou,sysdate())
```
bind変数も追加
```
$stmt->bindValue(':user_id', $user_id, PDO::PARAM_INT); //Integer(数値の場合 PDO::PARAM_INT)
```
#### 3.実際にformからデータ登録してデータベースに保存されているかチェック
別のアカウントでもログインして2~3個ほどデータを登録
### アンケート一覧で投稿者名を横に表示する(リレーション先のデータ取得)
#### 1.Select.php のSQL文をアップデート
```
SELECT * FROM gs_an_table INNER JOIN gs_user_table ON gs_an_table.user_id = gs_user_table.id
```
ちなみに文法的には
```
SELECT * FROM 主テーブル INNER JOIN 子テーブル ON 主テーブル.キー = 子テーブル.キー
```
*詳しく知りたい方はこの新卒の子が書いてるQiitaが初心者にわかりやすいのでおすすめ
https://qiita.com/SuguruOoki/items/e83da54b6c78cc58e40d
#### 2.select.phpに表示処理のwhile文内を編集
```
$view .= $r["id"]."|".$r["name"]."|".$r["email"];
```
↓↓↓↓↓↓↓↓
```
$view .= $r["id"]."|".$r["name"]."|".$r["email"].$r["user_name"];
```
#### 3.カラム名重複対策のAS区
```
SELECT 主テーブル.id AS main_id 子テーブル.id AS sub_id FROM 主テーブル INNER JOIN 子テーブル ON 主テーブル.キー = 子テーブル.キー
```
## セクション3 Ajax(非同期通信)
AjaxとはJavascriptによってブラウザ上での動作を主に必要なデータのみをサーバー側とやりとりを行い通信量の負担を減らす。
よく見る機能:インクリメンタルサーチ(インスタグラムのユーザー検索)
### ajax.htmlからjQueryを使ってデータを送る処理を見てみる
#### 1.ajax.htmlの処理を追記
```
$.ajax({
type: 'POST', //GET,POST
url: 'ajax.php', //通信先URL
data: { //Dataプロパティはデータを送信(渡す)役目
id: 1,
name: '名前',
age: '27',
sleep: 2 //Timeoutテスト用
},
dataType: 'json', //text, html, xml, json, jsonp, script
timeout: 5000,//データの返答を待つ時間(ミリ秒)
success: function(data) {
$("#ajax_status").text("通信完了!");
console.log(data);
},
error: function(error) {
console.log(error); //戻り値Allオブジェクト
},
complete: function() {
//成功&エラー処理後に必ず実行したい処理を記述する
$("body").append("完了"); //戻り値Allオブジェクト
}
});
```
#### 2.ajax.phpにてデータを受け取る
```
//POSTパラメータを取得
$id = $_POST["id"];
$name = $_POST["name"];
$age = $_POST["age"];
$sleep = $_POST["sleep"];
sleep($sleep); //Timeoutテスト用
echo "<div>$id</div><div>$name</div><div>$age</div>";
```
#### 3.ajax.htmlの検証ツールでconsoleを確認するとHTMLが受け取れているはずです。
#### 4.ajax.phpのHTMLのechoをコメントアウトしてjson変数のコメントアウト解除
```
$json = '[
{
"id":"'.$id.'",
"mode":"'.$mode.'",
"type":"'.$type.'"
},
{
"id":"'.$id.'",
"mode":"'.$mode.'",
"type":"'.$type.'"
}
]';
echo $json;
```
### ajax_inputでajaxを使ったデータ登録を実装
#### 1.index.phpのajax処理の部分を設定しdataの部分をformのデータをjsで取得
```
type: "post",
url: "insert.php",
data: {
name: $("#name").val(),
email: $("#email").val(),
naiyou: $("#naiyou").val()
},
```
#### 2.insert.phpでデータを取得
```
//1. POSTデータ取得
$name = $_POST["name"];
$email = $_POST["email"];
$naiyou = $_POST["naiyou"];
```
#### 3.登録の処理は通常と同じです
## セクション4 fileUpload(ファイルアップロード)
まずは「gs_img_table」をデータベースに作成
```
カラムは2つだけ
id:int(10)
img:varchar(256)
```
#### 1.fileupload.htmlのformを作成する
```
<form method="POST" action="fileupload.php" enctype="multipart/form-data">
<input type="file" name="upfile">
<input type="submit" class="btn btn-success btn-sm" value="Fileアップロード">
</form>
```
#### 2.fileupload.phpで受け取ったファイルを保存する
```
if (isset($_FILES["upfile"] ) && $_FILES["upfile"]["error"] ==0 ) {
//ファイル名を取得
$file_name = $_FILES["upfile"]["name"];
//一時保存パス作成
$tmp_path = $_FILES["upfile"]["tmp_name"];
//拡張子取得
$extension = pathinfo($file_name, PATHINFO_EXTENSION);
//ユニークなファイル名を生成
$file_name = date("YmdHis").md5(session_id()) . "." . $extension;
// FileUpload [--Start--]
$img="";//空の変数
$file_dir_path = "upload/".$file_name;//uploadフォルダにファイルを移動
if ( is_uploaded_file( $tmp_path ) ) {
if ( move_uploaded_file( $tmp_path, $file_dir_path ) ) {
chmod( $file_dir_path, 0644 );
$img = '<img src="'.$file_dir_path.'">';
} else {
// echo "Error:アップロードできませんでした。";
}
}
}else{
$img = "画像が送信されていません";
}
//[FileUploadCheck--END--]
```
#### 3.fileupload.phpにDBへファイル名の保存処理を追記
```
chmod( $file_dir_path, 0644 );//ファイルの権限を設定
require_once("funcs.php");
//2. DB接続します
$pdo = db_conn();
$sql = "INSERT INTO gs_img_table(id,img)VALUES(null,:img)";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':img', $file_name, PDO::PARAM_STR); //Integer(数値の場合 PDO::PARAM_INT)
$status = $stmt->execute();
//4.データ登録処理後
if ($status == false) {
sql_error($stmt);
} else {
$img = '<img src="'.$file_dir_path.'">';
}
```
#### 4. file_view.phpに画像取得処理を記述
```
// 1. DB接続
require_once('funcs.php');
$pdo = db_conn();
//2.データ登録SQL作成
$stmt = $pdo->prepare("SELECT * FROM gs_img_table");
$status = $stmt->execute();
//3.データ表示
$view="";
if($status==false) {
sql_error();
}else{
while( $r = $stmt->fetch(PDO::FETCH_ASSOC)){
$view .= '<p><img src="upload/'.$r["img"].'"></p>';
}
}
```
#### 4. file_view.phpのphotoareaに表示
```
<div id="photarea">
<!-- ここにPHPの変数を記述 -->
<?=$view?>
</div>
```