Help us understand the problem. What is going on with this article?

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

More than 3 years have 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最後にひとこと…

言葉が難しい…。

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

tabo_purify
WEBに特化しています。 その他の言語は分かりません。 間違いを発見した方はご指摘くださいませ。
https://labo-iwasaki.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした