PHP学習②->CRUD(クラッド)の理解と実装1
CRUDとは?
世の中のデータを扱うアプリにおいて必須の機能
それぞれ以下英語の頭文字をとってCRUD(クラッド)という
- データの作成(Create)
- 読み取り(Read)
- 更新(Update)
- 削除(Delete)
CRUDは扱うデータの数だけ必要!
usersとproductsという2つのデータを扱い場合、それぞれにCRUDが必要となる
CRUDの実装
以下のようなデータがあるとして、CRUDを実装する際のコードについて考えてみる
テーブル名:fruits
id | name | price |
---|---|---|
123 | apple | 120 |
555 | banana | 100 |
Create(作成)
新たに作成(create)するデータはformタグで受け取る
<form action="create.php" method="post" class="create-form">
<label for="id">ID</label>
<input type="number" name="id" min="0" max="1000" required>
<button type="submit" class="submit-btn" name="submit" value="create">登録</button>
</form>
※form補足
・labelタグのfor属性とフォーム<input>のid属性を関連付ける
→関連づいていることで、labelをクリックすると、入力欄がアクティブになったり、ラジオボタンにチェックが入るため、ユーザーにとって使いやすくなる。
★なんでfor属性とid属性を紐づけるのか理由がいまいち分からなかったけど、色々調べて利点が分かりスッキリ!
・formのmethod
GET:URLの末尾にパラメータをくっつけて送る方法
POST:パラメータをURLにくっつけずにサーバーに送る方式
パラメータを隠したい場合(個人情報、パスワード、大きいデータ等)は、POSTがよい!
動的に変わるデータを扱うため、SQL文はPDOのprepareメソッドを使用する
prepareメソッドはプリペアドステートメントと呼ばれるものを利用するための関数です。
プリペアドステートメントとは、SQL文を最初に用意しておいて、その後はクエリ内のパラメータの値だけを変更してクエリを実行できる機能のことです。
使い方は下記の通り
PDOオブジェクトの作成
↓
prepareメソッドでSQL文をセット
↓
bindValue or bindParamでパラメータに値をセット
↓
executeメソッドでクエリを実行
↓
fetch or fetchAllメソッドで結果を配列で取得
プログラミング入門~bituse~様より引用
実際のコードは以下のようになる
$sql_insert = 'INSERT INTO fruits (id, name, price) VALUES (:id, :name, :price,)';
$stmt_insert = $pdo->prepare($sql_insert);
$stmt_insert->bindValue(':product_code', $_POST['product_code'], PDO::PARAM_INT);
$stmt_insert->execute();
ポイントとしては
- SQL文を用意する際にパラメータを':パラメータ名'で用意していること
- bindValueでformタグから送信された値をパラメータに割り当てていること
Read(読み取り)
- 純粋にすべてのデータを取得し表示する場合
データベースに接続
↓
SQL文を用意
↓
queryメソッドでSQL文を実行
↓
実行結果を配列で受け取る(後での出力表示のため)
↓
foreachで配列をすべて出力する
<?php
try {
//PDOクラスを使ってデータベースに接続する
$pdo = new PDO($dsn, $user, $password);
$sql = 'SELECT * FROM fruits';
//SQL文の実行
$stmt = $pdo->query($sql);
//SQLの実行結果を配列で受け取る
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
//例外処理(比較的失敗しやすい処理の場合は例外処理も用意しておく)
}catch(PDOException $e){
exit($e->getMessage());
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<table class="column">
<tr>
<th>id</th>
<th>name</th>
<th>price</th>
</tr>
<?php
foreach($results as $result){
$table_row = "
<tr>
<td>{$result['id']}</td>
<td>{$result['name']}</td>
<td>{$result['price']}</td>
</tr>";
echo $table_row;
}
?>
</table>
</body>
</html>
- 検索値(keyword)に該当するもののみ取得し表示する場合(発展.ver)
データベースに接続する
↓
isset( keywordに代入する_GET['keyword'])を記述し、keywordパラメータの値が存在すればその値を変数
↓
prepare()メソッドを使い、パラメータを:keyword)に置き換えたSQL文を用意する
↓
変数 partial_matchに代入するkeywordの値を%で囲み(部分一致)、変数
↓
bindValue()メソッドを使って変数$partial_matchをプレースホルダ(:keyword)に割り当てる
↓
SQL文を実行し、その結果を配列で取得する
if(isset($_GET['keyword'])){
$keyword = $_GET['keyword'];
}else{
$keyword=NULL;
}
$sql_keyword = 'SELECT * FROM fruits WHERE name LIKE :keyword
$stmt_keyword = $pdo->prepare($sql_keyword);
$partial_match="%{$keyword}%";
$stmt_keyword->bindValue(':keyword', $partial_match, PDO::PARAM_STR);
$stmt_keyword->execute();
$results = $stmt_keyword->fetchAll(PDO::FETCH_ASSOC);
就職活動をしていたら前記事投稿から少し時間が経過してしまいました…。
中小の企業さんは中々外部に情報が出ていないので、情報収集が難航しています。
結局入社してみないと分からないことばかりだよなぁ、という感じです。
とにかく色んな方とお話して、会社の雰囲気を感じていきたいと思います。
CRUDについては理解できてきました。あとはひたすら実装です。
簡易的なアプリ作成も出来たので、近いうちにフレームワークを用いたWebアプリ開発学習に取り組んでいきます。
プログラミングはやっぱり楽しいなぁ、と思う今日この頃です。
ただやみくもに興味のあるものを進めている状況なので、
たまに本当にこの進め方でいいのかな、と不安になります。
Discussion