忍者ブログ

カウンター

プロモーション

カレンダー

07 2019/08 09
S M T W T F S
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

AntinomyMy の実験室

   私のWEBアプリ実験室です!

ブログ内検索

楽天でお買い物

twitter

最新トラックバック

最新コメント

忍者アナライズ

ウェザーニュース

バーコード

本を買う

アクセス解析

Google+

[PR]

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


No Image

PDO でDDL を使う。

PHP と SQL の調べ物

さて、長い何時もの様に前置きから、
読むのが面倒な人は<本題>から読んでね!
それでももっと面倒な人は<結論>だけ見てね!
では以下長々と・・・

プログラミング言語の多くのマニュアルを書いた人は
プログラミング言語を作った人本人であろうとなかろうと
どうも全部羅派し忘れている節がある。

私もそうだが作ることの方がメインで、説明をしたりするのがサブ的な役割に
なってしまうこともある、それはモチベーションや目的、立場によって変わるのだろう。

物事を追求しなければ物事が解決できないとして、
疑問を持って追求しているのは暇人だからではない、
性格もあるとして、それをしなければ先に進まないからだ。

そして案外疑問に思ってもやってみていないことってある。
しかしその疑問を解決する事が、プログラミング言語と言う道具を使う方法が
上手くなる方法であるのも現実として間違えなく、
それこそが私は「ノウハウ」と言うのだと思う。

一見オタク要素満載であるが、職人気質な人はオタク要素があるのか、
それともオタク要素がある人は職人気質なのか、結局極めることと興味を持つことは
紙一重であり、続けなければもったいない事だと思う。

たとえ周りが色を付け、理解しなくとも気にする事も余り無いのかもしれない。境遇にもよるが。

私の部屋に貼ってあるメモ書き、戒めと言うかモチベーションの向上の為に貼ってある言葉がある。

「考えていても
   やってみなければ
       実感できないよ」

まぁ、考えることの割合が多く、実際にやってみる事の方が後になる私にはぴったりな文句。
今回も思ったらすぐにしてみれば終わる話だったのだが、その悪い私らしい所が
結果的にこのブログと成っている。このブログの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();
}
?>
 


結果:
 ・・・略・・・
Array ( [Database] => pdo_sample_db [0] => pdo_sample_db ) 
 ・・・略・・・

しっかりDDLが動いていました。
同様にクエリーを'DROP DATABASE PDO_sample_db'にして試しても、
しっかり消える挙動が成立しました。

私がなぜDDLに拘るかと言うと、わざわざ他の環境にデータベースを操作するPHPスクリプトや
環境ごと移管しようとした時に、データベースを再び作る煩わしさから逃れる為などがあります。

他の人にスクリプトごと差し上げるとしたら、データベースの構築設定無しでは動かないのに、
他の人にわざわざDDLのコマンドを教えたりしてデータベースを構築させるなんて言うほど手間な事が
無いと思うからです。

何かの理由で1から構築したり復旧する場合も同様だと思います。
ただ簡単にDROP DATABASE でデータベースが消えてしまうので、消す場合には
幾つかの注意と警告を促し、誤ってデータベースを消してしまわないスクリプトにしておくべきだと
思います。

※※※ それとレンタルサーバはデータベースの数の制限があるレンタルサーバがある気がします。 ※※※
なのでその辺もしっかり調べておかなければ、レンタルサーバを提供している側が意図しない数の
データベースをユーザーが扱っているのを知ったら問題が発生する恐れもあります。
その辺も調べておく必要があると思います。

それ以前に、レンタルサーバでデータベース数に制限がある所では、
ルート権限のIDとパスワードを教えてくれないかもしれませんが。
それでも'CREATE DATABASEができなくてもDROP DATABASE
はデータベースを作成した後の話なので、出来てしまう気がします。
その辺もきをつけなければいけないと思います。

とりあえず、PDOでもDDLが使えた! わーい。
あとGRANTの設定で、
$setUser_php_to_php_sample_db =<<<DDL
 GRANT ALL PRIVILEGES ON php_sample_db.*
 TO php@xxx IDENTIFIED BY 'passwordxxx';
DDL;

このクエリーを発行して権限も設定できるかどうか試してみるべきだと思いますが、
これは後回しにしようと思います、多分できるでしょう。
またこれもレンタルサーバなどの設定によっては、下手な設定にしない方が
良いかもしれません。

拍手[0回]

PR

No Image

PHP の抽象DBアクセス方法

PHP と SQL の調べ物

 まぁ何時もの個人的なメモです。
物事を名前で覚えないで雰囲気で覚えている人なので、
ここに残しておこうと思います。

PHP はライブラリとしては

・PHP 本体に含まれる物
・PHP 本体と一緒になって付いてくるPHP で書かれた純正のPEAR
・PHP 本体と一緒になって付いてくるC言語 で書かれた純正のExtension
・PHP 本体と一緒になっていない任意で導入するC言語 で書かれたPECL

があり、データベースに限っては、抽象化や、
用途や可搬性を取るかなどや、スピードにより選んだり、
バージョンによって対応具合が違うなどがある。

またデータベースの扱いとしては、現バージョンのPHP 5.3では

・PEAR の抽象化されているがスピード的にはCで書かれた物に劣るPHP で書かれたDB やMDB2、DB_DataObject  などなど
・標準のExtension となったアクセスの仕方の抽象化されたPDO(ドライバモジュールが必要)
・標準のExtension にあるアクセスの仕方の抽象化されないベンダー固有もの(Windows Extensions のMySQL の場合はphp_mysql.dll など)
・PECL へとなり標準PHP コアより削除された dbx

がある様だ。


拍手[0回]


No Image

php.ini の設定で見かけたmysql とmysqli

PHP と SQL の調べ物

 なんだか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を
完全にサポートしています。
 これに加え、このエクステンションは
進歩したオブジェクト指向のプログラミングインタフェースをも提供します。

こんな感じの事が書かれていました。

拍手[1回]


  • Home
[PR]