Google

NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.7">

第 47 章 データベースに関する問題

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

1. PHPはMicrosoft SQLサーバにアクセスできると聞きました。どうすれば よいのでしょうか?
2. Microsoft Accessデータベースにアクセスできますか?
3. PHP 4にアップグレードしたら、mysqlサーバが"Warning: MySQL: Unable to save result set in ..."という警告をしつづけます。何が 起こっているのでしょうか?
4. 共有MySQLサポートをインストールしたら、libphp4がロードされると同 時にApacheがコアダンプします。直りますか?
5. なぜこのようなエラーがでるのでしょうか?: "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>?

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

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

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

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

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

UnixでPHPを動作させてWindowsマシンで操作するMS Accessに接続した い場合にはUnix ODBCドライバが必要です。OpenLink SoftwareがUnixベース のODBCドライバを提供しています。このドライバには無期限の試用版が あり、また商用サポートバージョンが675ドル〜 で提供されています。

他には、Microsoft SQLサーバにODBCドライバを使用してデータを保存 するという手段もあります。これによって、Microsoft Access(ODBCを 使用します)とPHP(組み込まれているドライバを使用します)でデータに アクセスすることができます。また、Microsoft AccessとPHP両者共に 解釈可能な中間ファイル(例えば単層からなるファイルや、 dBaseデー タベース等)を使用する手もあります。これに関してはOpeLink SoftwareのTim Hayesが以下のように述べています:
PHPからじかにODBCドライバが使用できる場合(つまりOpenLinkのドラ
       イバを使用している場合)には、他のデータベースを中継手段として用
       いることはよいアイデアとは言えない。どうしても中間ファイルが必
       要な場合のために、OpenLinkはNT, Linux, そして他のUnix用の
       Virtuoso(仮想データベースエンジン)をリリースした。私たちの
       ウェブサイトを訪れても
       らえれば、無料でダウンロードできる。

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

  • MySQLを説明に従って任意のプラットフォームにインストールします。 最新バージョンはwww.mysql.com(ミラーを使うこと!) にあります。データベースを作成するとき、そしてユーザアカウン トを設定するときに、ホストフィールドに%か、MySQLを使ってアク セスするWindowsマシンのホスト名を入力する、ということ以外には 特別な設定は必要ありません。

  • MySQLサイトからWindows用MyODBCドライバをダウンロードします。 最新のリリースはmyodbc-2_50_19-win95.zipです(NT版、ソースコー ドも入手可能です)。これを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ソースを移動させ ることができます。

3. PHP 4にアップグレードしたら、mysqlサーバが"Warning: MySQL: Unable to save result set in ..."という警告をしつづけます。何が 起こっているのでしょうか?

一番に考えられるのはPHP 4を、MySQLへのパス指定なしに'-- with-mysql'オプションをつけてコンパイルしたという場合です。これ はPHPが組み込まれたMySQLクライアントライブラリを使用するというこ とを意味します。もしあなたのシステムで、PHP 3やauth-mysqlの apacheモジュールといった他のバージョンのMySQLクライアントを使用 するアプリケーションが同時に動作している場合には、各クライアント 間でバージョンの競合が発生してしまいます。

PHP 4を'--with-mysql=/your/path/to/mysql' というようにオプションにパスを記述して再コンパイルすることで通常 の場合は問題は解決されます。

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

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

5. なぜこのようなエラーがでるのでしょうか?: "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を使用する前に、クエリを送信したあとのエラーをチェック する必要があります。以下のようなコードが正しい方法です。
$result = mysql_query("SELECT * FROM tables_priv");
if (!$result) {
    echo mysql_error();
    exit;
}
もしくは
$result = mysql_query("SELECT * FROM tables_priv")
    or die("Bad query: ".mysql_error());