PHPのPDOでMariaDB(MySQL)への接続テスト
MariaDB※1への接続テスト自体はHeidiSQLで十分ですが、PHPでPDOを使えるようにしておいたほうが良いよね、ってことで。
この記事で使っているソフトのバージョン情報
- Windows 10 Pro (Version 1803)
- nginx 1.14.0
- PHP 7.2.11
- MariaDB 10.3.10
php.iniを編集し、PDOを使えるようにする
c:\php\php.iniの extension=pdo_mysql の部分が#でコメントアウトされているため、これを外すだけでPDOが使えるようになります。
PHPでPDO接続するスクリプトを書く
- c:\nginx\htmlがドキュメントルートのため、その下に pdo.php というテキストファイル(※)を用意
- UTF8 (BOMなし)で下記のようなPHPスクリプトを記述する
■PDOでMariaDBへ接続する例
<?php
//PDO設定
$pdo_dsn = 'mysql:host=localhost;dbname=test;charset=utf8;';
$pdo_user = 'root';
$pdo_pass = '********';
$pdo_option = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_STRINGIFY_FETCHES => false
);
//データベース接続
try {
$pdo = new PDO($pdo_dsn, $pdo_user, $pdo_pass, $pdo_option);
} catch (Exception $e) {
header('Content-Type: text/plain; charset=UTF-8', true, 500);
exit($e->getMessage());
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>PDO接続テスト</title>
</head>
<body>
<?php
//SQL発行
$stmt = $pdo->query("SELECT @@version");
while ($row = $stmt->fetch()) {
print_r($row);
}
?>
</body>
</html>
■補足説明
$pdo_dsn = 'mysql:host=localhost;dbname=test;charset=utf8;';
この部分はPDOの接続情報で、データベースはMySQLを使ってますよー、接続先はlocalhost、データベース名はtestで、文字コードはutf8を使いますよー、という意味。
$pdo_user/$pdo_passはデータベース接続に使うユーザー名とパスワード。
$pdo_optionについては下記のとおり。
- PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION PDO関連でエラーが発生した際、例外が発生するようになる。try~catchでエラー処理するならこれ一択。
- PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC レコード取得時($stmt->fetch())のデータは連想配列にするという意味。これがないと列名が使えない。
- PDO::ATTR_EMULATE_PREPARES => false プリペアドステートメントのエミュレーションを行う(true)か行わない(false)かのオプション。ここは正直悩ましい。エミュレーションしたほうがパフォーマンスは高いけれど、細かい部分で挙動(型のキャストや複数SQLの実行等)が違ったりするので慣れないうちはエミュレーションなしのほうが良い、のかなぁ。
- PDO::ATTR_STRINGIFY_FETCHES => false レコードを取得した際、数値を文字列化する(true)か、数値として扱う(false)か。でもこれ、上のエミュレーションfalseのときしか意味がなくて、エミュレーションした場合はどうやっても数値を文字列にしちゃうみたい。それはそういうものとわかっていれば何とでもなるけれど。
ブラウザで開いて確認する
SELECT @@version;の結果が表示されていればOK。
PHPエディターとしてはNotepad++がけっこうおすすめ
PHPってHTMLに埋め込むことを前提として発展してきた言語だと思うので、スクリプト全体をphpで囲ってhtml出力は全部echoで行う、というのはちょっと違うと思うのですよ。
もちろんテンプレート用のhtmlを外部に用意しといて、それをphpで読み込んで出力するとか、そういうのはまた別の話しとして。
ともあれ、htmlとphpが混在するテキストはそのままでは読みづらく、背景色で見分けられるのが大事だとぼくは考えるわけです。
そこで、長年Peggy Proという色分けエディターを愛用してきたのですが、2014年に開発が終了してしまいました…。
古い設計のテキストエディターだったため、内部がUnicode化されておらず、扱えない文字コードがけっこう増えてきて、早いとこUnicode対応してくれないかなぁーと思っていたらまさかの開発終了に涙目ですよ。
そこで別のエディターを探しはじめたのですが、Eclipseとかの統合環境でPHPの開発をする人が多いのか、あんまりPHPに特化したテキストエディターって見つからないんですよねえ。
関数やキーワードの色分け程度はできても、タグで囲った部分の背景色を変えて、しっかりくっくりとhtmlとphpの分かれ目を表現してくれるようなエディターを探していたわけです。
そしてようやく見つけたのが Notepad++
こんなふうにhtml部分とphp部分の背景色が違って見えるのでとてもイイ。
EUC-JPが扱えなかったり、ShiftJISオンリーのファイルを開くと文字化けすることがあったり、ちょっと日本語の扱いに不安なところもありますが、UTF-8を使う限り問題は起きていません。
PHP用のテキストエディターをお探しの方はぜひ一度お試しあれ。
https://notepad-plus-plus.org/
まとめ
- PDOを使うにはphp.iniを編集し、pdo_mysqlを有効にする
- PDOには大きな特徴としてプリペアドステートメントがある
- プリペアドステートメント含め、PDOの接続オプションはよく吟味する
- PHPスクリプトはUTF8のBOMなしで記述する
- 色分けエディタなら Notepad++ がけっこうオススメ
なんかちょっといまいち綺麗にまとまりませんでしたし、PDOの記事なわりにテキストエディターの語りが一番熱かった気がしますが、プログラマーにエディターの話をさせると長くなるのは仕方がないってことでひとつ…(;´∀`)