PDOで接続、SELECT、プリペアドステートメントとは(PHPでMySQLに接続)

  • 184
    Like
  • 9
    Comment
More than 1 year has passed since last update.

そもそもプリペアドステートメントって何なんだ…。
PHP5.5からmysql...系が非推奨となり、将来的には削除されると言うことで、急遽PDOに全部変更する事になったので、「それって何だよ」から色々調べたのでメモしておきます。
あんまり頭良くないからManual読んでも分からないんですよね。
全部自分なりの解釈なので分かりにくかったらすみません。
間違ってたら指摘してください。

こちらがメイン記事 ▶︎ LABO IWASAKI 「PDOで色々やる」
(他にも色々書いてます)

logo-qiita.png 半泣きで覚書 by Takayoshi.Iwasaki

目次 内容
PDOとは まずPDOって何?って所から
プリペアドステートメント もぅ意味分かんない言葉ばっか…。調べました。
PDOで接続する さっそく使ってみる。DBに接続
PDOでデータを呼び出す SELECT文です。間違い易い所の解説あり。
PDOでfetch mysql_fetchみたいなヤツです。
INSERTする PDOでINSERTのページで解説しています。
コードをまとめたヤツ こっちページにまとめてある。INSERT,UPDATE,DELETEなど
ログインフォーム 【PDOでログインとパスワードのハッシュ】

PDOって何なんだ。

PDOは「PHP Data Objects」の頭文字をとった名称です。
って言われても「何がどうなってんの?」と思い、なかなか分からなかった。
データアクセス抽象化レイヤとか言われてるけど、「いや、だからソレ何?」って感じです。
調べたので解説します。

データアクセス抽象化レイヤ

アプリケーションとDBMS(データベース管理システム)の間に入ってDBMSの違いを意識せずにアプリケーションを作成するもの。
要するに「色んなデータベースがあるけど、同じ様に書いても全部のデータベースに対応してますよ」って事です。(若干の差異はあるらしい)

つまりPDOって…

そのデータアクセス抽象化レイヤの一つで、PHP5.1からバンドルされてる(標準で使えるようになってる)ヤツです。
データベースを途中で変更しなければならない際などを考えると使いやすい。
プリペアドステートメントで結構動作が早いらしい。(自分では検証してない)

logo-star.png解説がややこしい。読んでて寝そう。

プリペアドステートメントって?

これも意味分からん。
何でこうも馴染みのない横文字がいっぱい出てくるのか…。
プリペアドステートメントってのは、SQLを使う際に、その条件とか値が異なる場合、それをパラメータ化して色んな値や条件で使い回し(言い方悪いか?)が出来るものです。

プリペアド

preparedは「用意された」とか「心構え」って意味です。
要するに実行する前に構文用意するよ。って事ですね。

ステートメント

statementは「陳述」とか「声明」って意味です。
プリペアドで用意したものを実行します。って意味になるのかな。

つまりどういう意味?

SQLを実行する前に、色々用意して、実行するって事。
そのSQLの条件とか値が異なる時は、そこだけ入れ替えて使えるもの。
これ、みんな理解して使ってるの?スゲーな。全然分からんかったわ。

logo-heart.pngではでは、DBに接続してみましょう。

PDOでMySQLに接続

PDOで接続する(DSN)

PDOでMySQLに接続してみます。
DSNって言うのはData Source Name(データソースネーム)で、接続とか送信する時のデータを色々書いてあるよ。って所です。

接続
<?php
try {
$pdo = new PDO('mysql:host=ホスト名;dbname=DB名;charset=utf8','ユーザー名','パスワード',
array(PDO::ATTR_EMULATE_PREPARES => false));
} catch (PDOException $e) {
 exit('データベース接続失敗。'.$e->getMessage());
}
?>

try に接続する情報を書いて catchでエラー情報を投げてます。
$pdo は変数名なので何でもイイ。$dbh とか $dsn とか書いてる人もいる。

PDO::ATTR_EMULATE_PREPARES

また難しいのが出てきやがったな。
エミュレートプリペアーズ??
EMULATEは「模倣する」とか「手本とする」みたいな意味です。
主にコンピュータシステムに関して使われてるみたい。
プリペアドステートメントは、文を用意して、値や条件をバインドして、実行。みたいな感じなので、通信を2回するみたいで、ちょっと効率よくないんだって。
そういうのを「無駄な事せずに効率よくやるよ」っていうヤツ。
これを設定してるとSQLを正しく実行してくれる。(PHP5.2以降はデフォルトなので設定しなくて大丈夫)
誰も教えてくれないからハマって調べてしまった…。

PDO
<?php
try {
$pdo1 = new PDO('mysql:host=ホスト名;dbname=DB名;charset=utf8','ユーザー名','パスワード');
} catch (PDOException $e) {
 exit('データベース接続失敗。'.$e->getMessage());
}
?>
PDOでデータを呼び出す(SELECT)文

PDOでデータを呼び出すSELECT文

SELECT
<?php
$stmt = $pdo->query("SELECT * FROM テーブル名 ORDER BY no ASC");
while($row = $stmt -> fetch(PDO::FETCH_ASSOC)) {
 $ttitle = $row["title"];
 $tr = $row["r"];
 $tk = $row["k"];
 $tt = $row["t"];
 $tm = $row["m"];
echo<<<EOF

ヒアドキュメント内の表示部分

EOF;
}
?>

今まで使ってたmysql...系とあんまり変わらないけど、注意点がひとつあります。
始めてPDO使う時は意味分からない状態だったのでメモしときます。

● -> query を使ってます。
● 前の項目で接続した $pdoで query 以降の構文をやっちゃうよ。って事。
● -> は「アロー演算子」って言って。日本語の「〜の」って考えると近いかもです。
● あとに出てくる「execute();」と間違って使わない事に注意。▶こっち INSERTの解説

PDO::FETCH_ASSOC

これは mysql_fetch_assoc($変数) みたいなヤツ。
色んな記事読んでると「カラム名で添字を付けた配列を返します。」とかManual丸写しみたいな言葉が書いてあるけど、これってみんな理解してるの?
バカだから分からんわ。
コレはつまり、そのSQLの中を連想配列で取得するよ。って事。
他にもPDO::FETCH_NUMとか色々あるけど、そいつらは次の機会に触れようと思っています。

cara.png最後にひとこと…

言葉が難しい…。

プログラマーの人達ってスゴイと思うわ。
まず言葉が分からん。日本語が難しいって思ってしまう。
でも、そんなに頭良くないけどプログラマーになりたい!とか、自分でサイト作りたい!とか、何か仕事でやる事になったから…。とか、そういう人もいる。
自分は頭悪いけど、自分で何でも作りたいし、理解したい。「何となく」は嫌だ。
そんな気持ちでまとめてます。