Edited at

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

More than 3 years have passed since last update.

そもそもプリペアドステートメントって何なんだ…。

PHP5.5からmysql...系が非推奨となり、将来的には削除されると言うことで、急遽PDOに全部変更する事になったので、「それって何だよ」から色々調べたのでメモしておきます。

あんまり頭良くないからManual読んでも分からないんですよね。

全部自分なりの解釈なので分かりにくかったらすみません。

間違ってたら指摘してください。

こちらがメイン記事 ▶︎ LABO IWASAKI 「PDOで色々やる」

(他にも色々書いてます)

半泣きで覚書 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からバンドルされてる(標準で使えるようになってる)ヤツです。

データベースを途中で変更しなければならない際などを考えると使いやすい。

プリペアドステートメントで結構動作が早いらしい。(自分では検証してない)

解説がややこしい。読んでて寝そう。


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

これも意味分からん。

何でこうも馴染みのない横文字がいっぱい出てくるのか…。

プリペアドステートメントってのは、SQLを使う際に、その条件とか値が異なる場合、それをパラメータ化して色んな値や条件で使い回し(言い方悪いか?)が出来るものです。


プリペアド

preparedは「用意された」とか「心構え」って意味です。

要するに実行する前に構文用意するよ。って事ですね。


ステートメント

statementは「陳述」とか「声明」って意味です。

プリペアドで用意したものを実行します。って意味になるのかな。


つまりどういう意味?

SQLを実行する前に、色々用意して、実行するって事。

そのSQLの条件とか値が異なる時は、そこだけ入れ替えて使えるもの。

これ、みんな理解して使ってるの?スゲーな。全然分からんかったわ。

ではでは、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とか色々あるけど、そいつらは次の機会に触れようと思っています。

最後にひとこと…


言葉が難しい…。

プログラマーの人達ってスゴイと思うわ。

まず言葉が分からん。日本語が難しいって思ってしまう。

でも、そんなに頭良くないけどプログラマーになりたい!とか、自分でサイト作りたい!とか、何か仕事でやる事になったから…。とか、そういう人もいる。

自分は頭悪いけど、自分で何でも作りたいし、理解したい。「何となく」は嫌だ。

そんな気持ちでまとめてます。