PHP 7.1.0 Alpha 2 Released

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

このセクションでは 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 ソースを 移動させることができます。

10 年前からずーっと MySQL 拡張モジュール (ext/mysql) を使ってきました。なぜ今さら「使ってはいけない」と言われるのですか? 廃止されちゃうんですか? 私はいったいどうすればいいの? 今までのコードはどうなるの?

現在、MySQL 用の拡張モジュールは 3 種類用意されています。 MySQL API の選択 にあるとおりです。 古い API は使ってはいけません。PHP 5.5.0 以降では非推奨になっており、PHP 7.0.0 から本体に同梱されなくなって PECL に移ります。 でも、今後新しく書くコードでは mysqliPDO_MySQL を使うことを強く推奨します。

今までのコードの移行用スクリプトは、今のところ用意されていません。 しかし、mysqli の API には手続き型とオブジェクト指向型の 2 種類が用意されており、 手続き型の API は ext/mysql と似ています。

複数の拡張モジュールを混ぜて使うことはできません。つまり、 たとえば mysqli のコネクションを PDO_MySQL や ext/mysql に渡しても動作しないということです。

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());
?>

add a note add a note

User Contributed Notes 5 notes

up
9
knb at gfz-potsdam dot de
11 years ago
This is a crucial piece of information for SYBASE users:

If you are using the free, but old, 11.x client libs from sybase,
then compile with option  "--with-sybase-ct=$SYBASE"
substitute $SYBASE with the appropriate directory name.

option --with-sybase (without ct) can somehow be used to talk to old MS-SQL servers, but only with the 11.x client libs.

If you are using free, or have legally obtained, 12.x client libs from sybase, then compile with option  "--with-sybase-ct=$SYBASE/$SYBASE_OCS"
substitute $SYBASE/$SYBASE_OCS with the appropriate directory name.
up
1
plandis98 at yahoo dot com
10 years ago
If one is using PHP on Windows to connection to MS SQL Server and does not want to pass credentials via the mssql_connect but instead use MS Connectionless NT Authentication, what is the proper syntax/usage? 

I believe you want to turn on secure_connection in php.ini file:
; Use NT authentication when connecting to the server
mssql.secure_connection = On
up
0
Anonymous
11 years ago
Just a quick note which may help Windows users setting up PHP/Apache/MySQL.  I was receiving these two error messages on Apache startup: 1) "The procedure entry point mysql_thread_end could not be located in the dynamic link library LIBMYSQL.dll" and 2) "PHP Startup: Unable to load dynamic library '<my php installation dir>/ext/php_mysql.dll' - The specified procedure could not be found".  After checking that libmysql.dll did exist in my root PHP install dir, and that this dir was in my path, I determined that the problem was an older version of libmysql.dll.  My solution was to search all harddrives for this file (I found 6 copies of 5 different versions), and rename all of them except my PHP install dir copy.  PHP, Apache and MySQL all function as expected after making this change.
up
-1
djlopez at gmx dot de
10 years ago
How to compile PHP5 when you have installed mysql, but
- you can't find the "mysql header files" or
- get this error: Cannot find MySQL header files under /usr/

If you want to use mysql 4.0 (*not* 4.1 or even higher!) just download & extract the latest mysql4.0 binary distribution to e.g.
/root/mysql40/

but don't start it (it even should not work, if you have a mysql server already running)

Then use --with-mysql=/root/mysql4 within your php5 configuration.

After compiling/installing (make, make install), you may delete the /root/mysql40/ directory, or keep it for later versions of php5.
up
-6
ashay dot chaudhary at microsoft dot com
6 years ago
Q: I heard it's possible to access Microsoft SQL Server from PHP. How?

"On Windows machines, you can simply use the included ODBC support and the correct ODBC driver."
There is a better solution now, download the SQL Server Driver for PHP from Microsoft's Download Center, it is officially supported by Microsoft.

Source code: sqlsrvphp.codeplex.com
To Top