更新日:2022年4月19日
以前の記事、PHPでデータベースと連携してショッピングカートを作成する方法ではmysqliを使ってデータベースに接続しているのですが、今回はPDOを使ってデータベースに接続するパターンに書き直した記事になります。
機能は以前の記事同様で、ソースコードだけをPODに書き換えたものになります。
最終的な完成ファイル一式を公開していますので、ダウンロードすることですぐにカートシステムを実装出来ます。以下のリンクからダウンロードして下さい。
【PDO】PHPでデータベースと連携してショッピングカートを作成する方法【完成ファイル】
作成していくファイルは下記の7ファイルとなります。この7ファイルを使って簡易的なショッピングカートシステムを作成していきます。
上のphpファイルから順に作成していきますが、その前の下準備としてデータベースを用意する必要があります。
どのような仕様のデータベースを作るかから解説していきます。
開発環境はPHP5.5を想定しています。
まずはphpMyAdminにログインして、「shopping_carts」という名前のデータベースを作成します。
そしてその中に「goods」という名前のテーブルを作成し、下記のキャプチャと同様の情報を入力します。
テーブル内には「id」「goods_name」「send」「size」「number_of_copies」という5つのカラムを挿入し、そこに「走れメロス」「翌日」「A4」…等の情報を入れています。
データ型はidはintにし、それ以外は全てtextにして下さい。
注意点として「id」には必ずプライマリーキーを設定するようにして下さい。
これでデータベースの準備は完了です。
入力が面倒だという方は下記のSQLファイルをインポートして使ってみて下さい。
「shopping_carts」という名前のデータベースを作成した後に、goodsのSQLファイルをインポートして下さい。
goodsのSQLファイル(右クリックから名前をつけてリンク先を保存がおススメです)
dbconnect.phpという名前のphpファイルを作成して、下記のように記述します。
これはデータベースに接続する為の記述になります。
shopping_carts、localhost
'root'、'root'
の部分はお使いの環境によって違うかと思うので書き換えて下さい。
MAMPをお使いの方の場合はこの通りで大丈夫かと思います。
これがPODでのデータベースに接続する為の記述になりますが、db_connect()という名前の関数にした上でこの記述をdbconnect.phpに書いておくことで、他の各ファイルでデータベースに接続する必要がある際にいちいち同様の記述を書かずにdbconnect.phpを呼び出す(require関数)だけで良くなる為、管理性が高まります。
index.phpという名前のphpファイルを作成して、下記のように記述します。
index.phpやこれから作る他のphpファイルも全てdbconnect.phpと同階層に作って下さい。
require('dbconnect.php');
$dbh = db_connect();
でdbconnect.phpの情報を呼び出し、データベースに接続しています。
$sql = 'SELECT id, goods_name, send, size, number_of_copies FROM goods';
$stmt = $dbh->prepare($sql);
$stmt->execute();
ではprepareを使って「goods」テーブルからデータを取得しています。
while($table = $stmt->fetch(PDO::FETCH_ASSOC)){
では先程の$stmtの中身を、PDO::FETCH_ASSOCという結果の行を連想配列で取得する関数を使って取り出しています。
それをwhile文で繰り返し処理して「goods」テーブルのデータを全て書き出しています。
これでデータベースに登録された情報一覧が表示されるようになりました。編集や削除もこの画面からリンクされているので、ホーム画面ということになります。
input.phpという名前のphpファイルを作成して、下記のように記述します。
入力画面になります。
お客様がこの画面に情報を入力するイメージになります。
入力された情報はinput_do.phpへ送信されます。
input_do.phpという名前のphpファイルを作成して、下記のように記述します。
$sql = 'INSERT INTO goods SET goods_name = :goods_name,send = :send,size = :size, number_of_copies = :number_of_copies';
ではSQL文を組み立てています。
goods_name = :goods_name
という記述はプレースホルダと呼ばれるもので、SQLインジェクション対策として使われる記述方法になります。
$stmt = $dbh->prepare($sql);
$stmt->bindValue(':goods_name', $_POST['goods_name'], PDO::PARAM_STR);
$stmt->bindValue(':send', $_POST['send'], PDO::PARAM_STR);
$stmt->bindValue(':size', $_POST['size'], PDO::PARAM_STR);
$stmt->bindValue(':number_of_copies', $_POST['number_of_copies'], PDO::PARAM_STR);
$stmt->execute();
prepareで「goods」テーブルからデータを取得し、bindValue()でプレースホルダの値を受け取っています。
$stmt->bindValue(':goods_name', $_POST['goods_name'], PDO::PARAM_STR);
とすることで、SQL文のgoods_nameの値を受け取りますので、SQL文と同様の名前を入れます。
update.phpという名前のphpファイルを作成して、下記のように記述します。
$sql = 'SELECT * FROM goods WHERE id = :id';
$stmt = $dbh->prepare($sql);
$stmt->bindValue(':id', $_REQUEST['id'], PDO::PARAM_INT);
$stmt->execute();
index.phpからのリンクでURLパラメータを生成されているので、例えばupdate.php?id=1で表示してみると、id1に入っているデータベースの情報が呼び出されます。走れメロスが表示されるはずですね。そのidを取得し、どのidが入った列が選択されているかを判断しています。
$row = $stmt->fetch();
ではデータベースの情報を配列に入れています。
配列に入れることにより、$row[0]ならIDが、$row[1]なら商品名が取得出来るようになります。
input type="text" name="goods_name" id="goods_name" value="<?php print(htmlspecialchars($row[1], ENT_QUOTES)); ?>">
ではデータベースのテーブルの内容を表示しています。value属性に仕込んでおくことで、あらかじめ入力された状態になるということですね。
<input type="hidden" name="id" value="<?php print(htmlspecialchars($row[0], ENT_QUOTES)); ?>" /?>
ではhidden要素を使って、現在編集しているデータのidを渡しています。これをしないとどの情報が編集されたのかが分からなくなってしまう為です。この記述がないと全て情報が書き換えられてしまうので注意です。
update_do.phpという名前のphpファイルを作成して、下記のように記述します。
UPDATEのSQLを使い、データベースの情報を更新しています。UPDATEは必ずWHEREとセットで使う必要があり、WHEREにidをセットすることでどの情報を編集するのかを明確にしています。
ここでもprepareとプレースホルダを使って、bindValue()で受け取っています。
delete.phpという名前のphpファイルを作成して、下記のように記述します。
DELETEのSQLを使い、データベースの情報を削除しています。このDELETEは必ずWHEREとセットで使う必要があり、WHEREにidをセットすることでどの情報を編集するのかを明確にしています。
これにてPDO版でのショッピングカートの完成です!
mysqliからPDOにすると基本的な構造は変わらないものの、やはり書き換える場所が多く大変ですね…。
誰かの為になれば幸いです!