🐼

PHP学習②->CRUD(クラッド)の理解と実装1

2023/09/26に公開

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~様より引用
https://bituse.info/php/35

実際のコードは以下のようになる

create.php
$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で配列をすべて出力する
read.php
<?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(_GET['keyword'])を記述し、keywordパラメータの値が存在すればその値を変数keywordに代入する

    prepare()メソッドを使い、パラメータを:keyword)に置き換えたSQL文を用意する

    変数keywordの値を%で囲み(部分一致)、変数partial_matchに代入する

    bindValue()メソッドを使って変数$partial_matchをプレースホルダ(:keyword)に割り当てる

    SQL文を実行し、その結果を配列で取得する
read.php
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