# 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'); } ```