プログラミング初心者が説明するPDOを使ったデータベースへの接続方法

ウェブカツ
こんにちは!

ウェブカツでプログラミング学習を始めて57日経ちました。

いままでは割と順調に進んでいたのですが、ウェブカツ最初の難関といわれるWEBサービス部で停滞しています。
これまでの部ではウェブカツの動画を見て、そして鬼練に取り組めばすんなり理解できていたのですが、WEBサービス部はそうはいきませんでした。

理解していたと思っていた変数や関数の理解不足を突きつけられ、日々ぐぐりまくっています。

そんな状況なので進捗が思わしくなく、あっという間に女性割引の条件であるウェブカツ進捗報告ブログの締切日がやってきました。

「ブログ書く時間をWEBサービス部の学習時間に使いたい」と思うのが正直なところですが、せっかく時間をかけるのだから、すこしでもプログラミング学習のアウトプットとなるようなブログを書くことにしました。

どれを題材にするかを考え、一番理解が難しかったPDOを使ったデータベース接続についてまとめることにしました。
※あくまでもプログラミング初心者が自分がどのように理解したかを書いていますので、適切ではない表現や誤った解釈も含まれていると思いますので、あしからず。。。

PDOオブジェクトを作成し、SQL実行結果を得るまでの手順

❶PDOオブジェクト作成

❷SQL文作成

❸SQL文実行準備

❹SQL文実行

❺SQL実行結果取得

PHPでデータベースに接続し、SQL実行結果を取得するには上記5つの手順を踏む必要があります。
プログラミング初学者にとっては、5つも手順があることにびっくりです。

ウェブカツのサンプルソースでは❶❸❹は関数化されています。

❶オブジェクト作成 ・・・function.php 関数「dbConnect」

❷SQL文作成

❸SQL文実行準備  ・・・function.php 関数「queryPost 」

❹SQL文実行        ・・・function.php 関数「queryPost 」

❺SQL実行結果取得

❶PDOオブジェクト作成

プログラミング用語で解釈

PDOクラスをインスタンス化して、PDOオブジェクトを作成します。
PDOクラスはPHP とデータベースサーバーの間の接続を表します。

プログラミング初心者なりの解釈

「クラス」は設計図、「インスタンス化」は設計図を見ながら「オブジェクト」を作ること。

PDOという設計図はPHPであらかじめ準備されている設計図で、データベースの情報、ユーザー名、パスワードなど材料にオブジェクトを作っておくと、PDOオブジェクトがある間はそのデータベースと接続できるようになる。

オブジェクトを作るための呪文は 「new PDO」。
オブジェクトを作るときに必要な材料はデータベースの情報、ユーザー名、パスワード、オプション。
ウェブカツのサンプルソースではそれぞれが$dsn $user $password $optionsという変数になっている。

 

 

 

プログラミング用語で解釈

インスタンス化すると、クラスに定義されていたメソッドが使える状態になります。

インスタンス化するとオブジェクトが変数に返ってきます。

プログラミング初心者なりの解釈

設計図通りにオブジェクトを作ると、便利な道具ができる。

出来た道具は箱に入れておく方があとあと使い勝手がよいので、箱に入れておく。

箱の名前は誰が見ても中身が分かるような分かりやすい名前にする。

ウェブカツのサンプルソースでは$dbhという変数名が使用されている。dbhはデータベースハンドラの略。

❷SQL文作成

プログラミング用語で解釈

SQL文をプレースホルダーを使って作成します。

プログラミング初心者なりの解釈

SQL文を作って、あとで使いやすように箱に入れておく。
ウェブカツのサンプルソースでは$sqlという箱に入れている。

この時点でSQL文で細かい条件をしてしまうと、その都度SQL文を書き直さないといけないので、あとで変わる可能性のある場所は空欄にしておいて、SQL文を実行するときに穴埋めする。

❸SQL文準備

プログラミング用語で解釈

prepareメソッドを使ってSQL文を準備します。

プログラミング初心者なりの解釈

SQL文を実行するためには準備が必要。

SQL文を実行するためには、PDOという設計図に書かれているprepareという道具を使う必要がある。

この時点でPDOという設計図から作ったPDOオブジェクトと道具は$dbhという箱に入っているので、箱の中からprepareという道具を取り出して使うというイメージ。

箱の中から道具を取り出すときに使うのはアロー関数。$dbh->prepareというように書く。

プログラミング用語で解釈

prepareを実行するとPDOStatementクラスがインスタンス化され、$stmtに代入されます。

プログラミング初心者なりの解釈

PDOStatementもPHPであらかじめ準備された設計図。

PDOに準備されているsqlという道具を使ってSQL文を実行することはできるけど、この道具はただSQL文を実行するだけしかできない。SQL文の一部を空白で作っておいてあとで空白を埋めて実行するといったことができない。

なので、SQL実行のための便利な道具がたくさん使えるようになるPDOStatementという設計図を使える状態にして、箱に入れておく。

prepareという道具を使うときに穴あき状態のSQL文を材料にすると、executeという道具に穴あき状態のSQL文がくっついた状態になる。

ウェブカツのサンプルソースでは$stmtという変数名になっています。stmtはステートメントの略。

❹SQL文実行

プログラミング用語で解釈

executeにパラメータを渡し、SQL文を実行する。

SQL文を実行すると、実行結果の入ったオブジェクトが返ってくる。

初心者なりの解釈

PDOStatementにあらかじめ定義されているexecuteという道具を使うとクエリ文が実行できる。
この時点でPDOStatementをオブジェクト化したものは$stmtという箱に入っているので、$stmt->execcuteというアロー関数を使って取り出す。
executeには虫食い状態になっているSQL文がくっついているので、穴を埋める情報を渡すと空白にしていたところを埋めてSQL文が実行される。
ウェブカツのサンプルソースでは$dataという変数に情報が入っている。

executeという道具を使用するとクエリが成功した場合にオブジェクトが戻ってくるので、それを一旦$stmtの箱に戻す。
この時はクエリの実行結果の内容までは分からない。

「合格だったら手紙でお知らせします。詳細な結果については封筒を開封して確認してください」というイメージ。

❺SQL結果取得

プログラミング用語で解釈

結果を取得する時はPDOStatementで定義されているfetchメソッドを使用する。

呼び出し元にどの行を返すのかパラメーターで制御する。

 

初心者なりの解釈

結果の入った封筒を開封するにはPDOStatementのfetchという道具を使う。

fetchを使うときはどういう結果が欲しいかを指定できる。

この時、$stmtにPDOStatementをオブジェクト化したものが入っているので、$stmt->fetchというアロー関数を使ってfetchを使う。

$result=$stmt->fetch(PDO::FETCH_ASSOC)とすると、封筒が開封され、$resultにクエリ実行結果が全部入る。

最後に

こうやって図にしたり、文章で表現するとどこが分かっていないかが明確になり、理解が深まりました。

ブログを書くのは想像以上に大変でしたが、こりずにまたチャレンジしたいと思います!

このブログが私と同じ初心者で、同じところでつまづいている方の少しでも助けになれば、うれしいです!

    コメント