---
# System prepended metadata

title: webプログラミング講座10回目

---

#  webプログラミング講座10回目
### 授業資料のダウンロードと解凍
Teams上にアップロードした資料をダウンロードしてください。
Zipファイルですので解凍してください。

### php05フォルダをMAMPのhtdocs階層に移動させてください。
先ほどCドライブにダウンロードしたMAMPの中にhtdocsというフォルダがあります。
ここに授業資料の「php05」フォルダを移動してください！


## セクション1　投稿者が判別できるアンケートシステムの構築
### データベースに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 主テーブル.キー = 子テーブル.キー 
```



## セクション2 fileUpload(ファイルアップロード)
#### 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();

//４．データ登録処理後
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();

//２．データ登録SQL作成
$stmt = $pdo->prepare("SELECT * FROM gs_img_table");
$status = $stmt->execute();

//３．データ表示
$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>
```