さて、長い何時もの様に前置きから、
読むのが面倒な人は<本題>から読んでね!
それでももっと面倒な人は<結論>だけ見てね!
では以下長々と・・・
プログラミング言語の多くのマニュアルを書いた人は
プログラミング言語を作った人本人であろうとなかろうと
どうも全部羅派し忘れている節がある。
私もそうだが作ることの方がメインで、説明をしたりするのがサブ的な役割に
なってしまうこともある、それはモチベーションや目的、立場によって変わるのだろう。
物事を追求しなければ物事が解決できないとして、
疑問を持って追求しているのは暇人だからではない、
性格もあるとして、それをしなければ先に進まないからだ。
そして案外疑問に思ってもやってみていないことってある。
しかしその疑問を解決する事が、プログラミング言語と言う道具を使う方法が
上手くなる方法であるのも現実として間違えなく、
それこそが私は「ノウハウ」と言うのだと思う。
一見オタク要素満載であるが、職人気質な人はオタク要素があるのか、
それともオタク要素がある人は職人気質なのか、結局極めることと興味を持つことは
紙一重であり、続けなければもったいない事だと思う。
たとえ周りが色を付け、理解しなくとも気にする事も余り無いのかもしれない。境遇にもよるが。
私の部屋に貼ってあるメモ書き、戒めと言うかモチベーションの向上の為に貼ってある言葉がある。
「考えていても
やってみなければ
実感できないよ」
まぁ、考えることの割合が多く、実際にやってみる事の方が後になる私にはぴったりな文句。
今回も思ったらすぐにしてみれば終わる話だったのだが、その悪い私らしい所が
結果的にこのブログと成っている。このブログの99%は迷い悩みから生まれた物ですw(当社比率100%)
で、何について疑問に思って、今回は何を述べたいのか?
以下本題に入ります。
<本題>
PHP でMySQL を用いる時に、PDO を使った場合、データベースの操作、DMLについては
簡単に説明が見つかる、しかしDDLについては説明がない。
PDO をPHP公式のマニュアル を見る限り、どう見ても初めからMySQL のルート権限で
MySQL に接続してデータベース本体を作ったり、権限を操作する関連の説明を簡単に見つけられない。
唯一見つけたのは、ログインした後でDDLを操作する説明が、
MySQL 関数 (PDO_MYSQL)
これを読んでいると、一度データベース選択と共に接続しDMLが操作できる状況になった上で、
DDLのクエリーを発行すれば良いと書いてある気がする。
しかしこれでは、落ち度があるのだ。
もしMySQL に操作できるデータベースが1つも無かった場合には、ログイン出来ない様に感じてしまう。
つまりPDOでは空っぽのMySQL にログインしてデータベースを名前を付けて1から構築して
いくスクリプトは書けないんじゃないか?と思わせてしまう。
それはこの公式マニュアルの何処に原因があるのか?
それはこの説明
PDO::__construct と接続、および接続の管理にあるパラメータdsn の説明不足に問題がある。
<結論>
PDO のデータベース接続インスタンスの生成方法で
一見DML用途にしか接続インスタンスを生成出来ない様に見えるが、
実際はdsnパラメータはPHP公式マニュアルにかかれていない省略形の形を用いると
DDLを初めから操作できる。
例えばPHP公式マニュアルなどや他のサイトには、
dsnパラメータはこの以下2つのどちらの書き方でも使えるが、
データベースサーバへ接続するときにデータベース名が省略していいかどうか書いていない。
dsnの例
'mysql:dbname=testdb;host=127.0.0.1'や
'mysql:host=127.0.0.1;dbname=testdb'
である。
これは元々データCスに'testdb'が存在しているのが前提である。
しかし全く空な場合の使い方がかかれていない。
これを試しにdbname=testdbなしに記述し、ルートの名前とパスワードでMySQLに接続してみた。
そして'CREATE DATABASE PDO_sample_db'というクエリーを発行して確認してみた。
そうするとDDLの操作がMySQL(データベースサーバ)に接続した直後から何も意識せずにDDLが使える。
つまり
上の例で言えば、dbname=testdbなしにした
'mysql:host=127.0.0.1;'
をdsnに指定すれば、データベースを指定しない形でログインできた。
勿論ルート権限のIDとパスワードで試した。
<?php
$user='rootxxx';
$pass='passxxx';
$dsn='mysql:host=localhost;';
//DDL操作を念頭に入れない場合はいきなり以下の様に前に用意したデータベースを指定すれば良い
//$dsn='mysql:host=localhost;dbname=test';
try {
$dbh = new PDO($dsn, $user, $pass);
//データベースを作る
$dbh->query('CREATE DATABASE PDO_sample_db');
foreach($dbh->query('show databases') as $row) {
print_r($row);
echo '<br>';
}
$dbh = null;
} catch (PDOException $e) {
print "エラー!: " . $e->getMessage() . "<br/>";
die();
}
?>
なんだかPHP のインストールを説明している本で、
MySQL を使うために以下の設定を見かけた覚えがある。
extension=php_mysql.dll
extension=php_mysqli.dll
これってどう違うんだろう?って思っていた覚えがある。
他にも疑問はあった
extension=php_pdo_mysql.dll
これも何かわからなかったが、今回は
extension=php_mysql.dll つまり、mysql
extension=php_mysqli.dll つまり、mysqli
についてはわかったのでメモしておく。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 23.3 MySQL PHP API
「PHPは実際に2つの異なったMySQL APIエクステンションを提供します」と書いてある、
この2つとは、mysql とmysqli の事。
mysql:
PHPのバージョン4と5の要件を満たすこのエクステンションは、
MySQL 4.1より前のバージョンのMySQLと一緒に使用することを目的としたものです。
この拡張子はMySQL5.1に使われている改良認証プロトコールも、
準備されたステートメントあるいは複数のステートメントもサポートしません。
mysqli:
「改良されたMySQL」をサーポートし、MySQL.1.1およびそのその後バージョンで
使用するよう意図されています。
このエクステンションはMySQLとその現シリーズの中で使用される
検証プロトコル5.1並びに準備されたステートメント用APIとマルチステートメント用APIを
完全にサポートしています。
これに加え、このエクステンションは
進歩したオブジェクト指向のプログラミングインタフェースをも提供します。
こんな感じの事が書かれていました。