# 【InFiNiTO Club】プログラミング講座9回目 ## 初期準備 ### 授業資料のダウンロードと解凍 Teams上にアップロードした資料をダウンロードしてください。 Zipファイルですので解凍してください。 本日使う授業フォルダphp02に入っているもの。 ``` cssフォルダ fontsフォルダ jsフォルダ SQLフォルダ index.php insert.php funcs.php detail.php delete.php select.php update.php ``` ### php02フォルダをMAMPのhtdocs階層に移動させてください。 先ほどCドライブにダウンロードしたMAMPの中にhtdocsというフォルダがあります。 ここに授業資料の「php02」フォルダを移動してください! ## セクション1 データベース作成 ### まずはphpMyAdminとMySQLの場所を知る #### 1. MAMPを起動 #### 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. 実行してみる ## セクション2 PHPからMySQLを操作(登録と取得表示) PHP(サーバー言語)からMySQLにデータを送って保存したり取得したりしてみる。 ### PHPからデータ登録 #### 1. まずはfuncs.phpの中のdb_conn()関数を完成させてDB接続処理を作る ``` function db_conn(){ try { $db_name = "gs_db"; //データベース名 $db_id = "root"; //アカウント名 $db_pw = "root"; //パスワード:XAMPPはパスワード無しに修正してください。 $db_host = "localhost"; //DBホスト $db_port = "8889"; $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(); //3.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{ //5.index.phpへリダイレクト header('Location: index.php');//ヘッダーロケーション(リダイレクト) } ``` ### PHPからデータ取得と表示 #### 1. selsect.phpでデータ取得 ``` //1. DB接続します require_once('funcs.php'); $pdo = db_conn(); //2.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['text'].' '.$result['email']; $view .= "</p>"; } } ``` #### 3. select.phpの表示用HTMLにviewを呼び出す ``` <div> <div class="container jumbotron"><?= $view ?></div> </div> ``` ## セクション3 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'); } ``` ## セクション4 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'); } ```