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.iniを編集してPDOを有効にする

PHPでPDO接続するスクリプトを書く

  1. c:\nginx\htmlがドキュメントルートのため、その下に pdo.php というテキストファイル(※)を用意
  2. 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のときしか意味がなくて、エミュレーションした場合はどうやっても数値を文字列にしちゃうみたい。それはそういうものとわかっていれば何とでもなるけれど。

ブラウザで開いて確認する

PDOの動作テスト

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++

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の記事なわりにテキストエディターの語りが一番熱かった気がしますが、プログラマーにエディターの話をさせると長くなるのは仕方がないってことでひとつ…(;´∀`)