データベースに関する問題

このセクションでは PHP とデータベースとの関係に関する一般的な質問を 扱います。なんと! PHP は事実上あらゆるデータベースにアクセスすることが できます。

PHP は Microsoft SQL Server にアクセスできると聞きました。どうすれば よいのでしょうか?

Windows マシン上では、ODBC サポートと適切な ODBC ドライバを 使用すればよいだけです。

Unix マシン上では、Sybase-CT ドライバを使って Microsoft SQL Server にアクセスすることができます。なぜなら(ほとんど完全に)プロトコル 互換だからです。Sybase は » 必要な Linux 用ライブラリのフリーな実装 を作成しました。他の Unix システムでは適切なライブラリを手に入れるために Sybase と連絡を取る必要があります。 次の質問に対する回答も参照してください。

Microsoft Access データベースにアクセスできますか?

はい。もし全て (PHP と Microsoft Access) を Windows9x/Me/NT/2000 上で動作させるのであり、ODBC と Microsoft が提供する Microsoft Access 用 ODBC ドライバ が使用できる状態ならば、 すべての必要なツールは揃っています。

Unix で PHP を動作させて Windows マシンで動作する MS Access に接続したい場合には Unix ODBC ドライバが必要です。» OpenLink Software が Unix ベースの ODBC ドライバを提供しています。

他には、Microsoft SQL Server に ODBC ドライバを使用してデータを 保存するという手段もあります。これによって、Microsoft Access (ODBC を使用します) と PHP (組み込まれているドライバを使用します) でデータに アクセスすることができます。また、Microsoft Access と PHP 両者共に 解釈可能な中間ファイル(例えば単層からなるファイルや、dBase データベース等)を使用する手もあります。これに関しては OpenLink Software の Tim Hayes が以下のように述べています。

PHP からじかに ODBC ドライバが使用できる場合(つまり OpenLink の ドライバを使用している場合)には、他のデータベースを中継手段として 用いることはよいアイデアとは言えない。どうしても中間ファイルが 必要な場合のために、OpenLink は NT、Linux、そして他の Unix 用の Virtuoso(仮想データベースエンジン)をリリースした。私たちの » ウェブサイトを 訪れてもらえれば、無料でダウンロードできる。

うまくいくことが分かってるもう一つの方法は、MySQL と Windows 用の MyODBC ドライバを利用してデータベースを同期する方法です。Steve Lawrence が言うには、

  • MySQL を説明に従って任意のプラットフォームにインストールします。 最新バージョンは » http://www.mysql.com/ にあります。データベースを作成するとき、そしてユーザアカウントを を設定するときに、ホストフィールドに % か MySQL を使って アクセスする Windows マシンのホスト名を入力する、ということ以外には 特別な設定は必要ありません。 使用するサーバ名、ユーザ名、パスワードを書きとめておいてください。
  • MySQL サイトから Windows 用 MyODBC ドライバをダウンロードします。 それを Windows マシンにインストールします。 アーカイブに含まれるユーティリティプログラムで、 テストを行うことができます。
  • コントロールパネルの ODBC administrator を使用して、ユーザ もしくはシステム DSN を作成します。DSN 名を決定して、Step1 で MySQL に設定したホスト名、ユーザ名、パスワード、ポート等を入力します。
  • Access をフルインストールでインストールします。これは適切な アドインをインストールするためです。少なくとも ODBC サポートと リンクテーブルマネージャが必要です。
  • ここからがお楽しみです。新規データベースを作成しましょう。 テーブルウィンドウで右クリックしてリンクテーブルを選択します。 もしくはファイルメニューから外部データの取り込みを選び リンクテーブルを選択します。ファイルブラウザが表示されたら ファイルタイプから ODBC を選択します。次にシステム DSN で 選択肢 STEP3 で作成した DSN 名を選択します。リンクするテーブルを 選んで OK ボタンを押しましょう。MySQL サーバでテーブルを オープンできるようになっていて、データの追加/削除/編集ができるように なっています。さらに、クエリの構築、テーブルのインポート/エクスポート、 フォームやレポートの構築等が可能です。

Tips and Tricks(役に立つヒント):

  • Access でテーブルを作成してそれを MySQL へエクスポートします。 それを再度アクセスからリンクすれば素早くテーブルを作成すること ができます。
  • Access でテーブルを作成するときは、そのテーブルに書き込み権限を もたせるためにプライマリキーを設定しておく必要があります。 Access とテーブルをリンクする前に MySQL にプライマリキーを設定 しておくことも忘れないでください。
  • MySQL 側でテーブル(の構成)を変更した場合、再度 Access とリンクする 必要があります。ツール>アドイン>リンクテーブルマネージャから 適切な ODBC DSN を選んで再リンクが必要なテーブルを選択します。 また、ここで OK ボタンを押す前に「リンク先を更新するための プロンプトを毎回表示する」をチェックしておけば DSN ソースを 移動させることができます。

PHP 5 では MySQL クライアントライブラリがバンドルされません。これは 私にとってどのような意味がありますか? PHP を MySQL とともに使用する ことはできるのですか? MySQL を使用しようとすると "function undefined" エラーが出るのですが、どうしたらいいのですか?

はい。どのような意味においても PHP は常に MySQL をサポートしています。 PHP 5 で変わったことといえば、クライアントライブラリをバンドルしなく なったということだけです。以下に、順不同で理由を挙げます。

  • 最近のシステムにはすでにクライアントライブラリがインストールされています。

  • 上と関連して、複数バージョンのライブラリを共存させると環境がおかしく なりがちです。たとえば、mod_auth_mysql と PHP をそれぞれ別のバージョンの ライブラリとリンクさせ、Apache でそれら両方を有効にすると、いとも簡単に クラッシュすることでしょう。また、バンドルされているライブラリが インストールされているサーバとうまく動作するとは限りません。もっとも ありがちな症状は、Unix ドメインソケットのファイル mysql.socket を探す場所の不一致です。

  • 保守がとどこおりがちで、現在リリースされているバージョンに どんどん遅れをとってしまいます。

  • 将来のバージョンのライブラリは GPL の元で配布されます。そのため、 私たちはアップグレードの手段を提供することができません。なぜなら 私たちのような BSD/Apache スタイルのライセンスを採用している プロジェクトは、GPL のライブラリをバンドルできないからです。 PHP 5 でバンドルをやめたことは最善の方法だと考えます。

このことがそんなに多くの人々に影響することはないでしょう。 Unix ユーザ、少なくとも自分が何をしているかを把握している人たちは、 PHP をビルドする際には常に --with-mysql=/usr してシステムの libmysqlclient ライブラリを使用するようにしているでしょう。 Windows ユーザは、php.iniphp_mysql.dll を有効にしていることでしょう。 インストール手順の詳細は、MySQL リファレンス を参照ください。また、libmysql.dll が システムの PATH が通った場所にあることを確認してください。その方法に ついては、FAQ の Windows のシステム PATH を設定する を参照ください。 libmysql.dll(やその他多くの PHP 関連ファイル)が PHP フォルダにあることから、このフォルダをシステムの PATH に追加 したくなるかもしれません。

共有 MySQL サポートをインストールしたら、libphp4 がロードされると 同時に Apache がコアダンプします。直りますか?

もしあなたのシステムの MySQL ライブラリが pthreads とリンクされて いる場合にはこの現象が発生します。ldd コマンドを使用してチェック してください。もし pthreads がリンクされている場合は、MySQL の tarball を展開してソースからコンパイルしなおしてください。もしくは SRPM の SPEC ファイルのスレッドクライアントコードの箇所を削除してコンパイル しなおしてください。いずれかの方法で問題を解決できます。その後、 PHP を新しい MySQL ライブラリでコンパイルしなおしてください。

"Warning: 0 is not a MySQL result index in <file> on line <x>" もしくは "Warning: Supplied argument is not a valid MySQL result resource in <file> on line <x>" のようなエラーが出るのはなぜでしょうか?

あなたは値が 0 である結果(result)ID を指定しようとしています。0 は あなたのクエリが何らかの理由で失敗したことを示しています。結果 (result)ID を使用する前に、クエリを送信したあとのエラーをチェック する必要があります。以下のようなコードが正しい方法です。

<?php

$result 
mysql_query("SELECT * FROM tables_priv");
if (!
$result) {
    echo 
mysql_error();
    exit;
}
?>
もしくは
<?php

$result 
mysql_query("SELECT * FROM tables_priv")
    or die(
"Bad query: " mysql_error());
?>


PHPやMySQLを使った開発はPHPやMySQLの開発実績