International PHP Conference 2019 - Spring Edition

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

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

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

Unix マシン上では、PDO_ODBCUnified ODBC API が使えます。

Windows マシン上では、PDO_SQLSRVSQLSRV も使えます。

次の質問に対する回答も参照してください。

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 に渡しても動作しないということです。

"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 2 notes

up
8
knb at gfz-potsdam dot de
14 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
-2
doug at unlikelysource dot com
1 year ago
To enable SQL Server access from ubuntu 16.04:

* Run these commands:
```
sudo curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > mssql-release.list
sudo mv mssql-release.list /etc/apt/sources.list.d
sudo apt-get update
sudo ACCEPT_EULA=Y apt-get install msodbcsql unixodbc-dev
sudo apt-get install php7.1-dev
sudo apt-get install autoconf
sudo pecl install pdo_sqlsrv-4.1.6.1
```

*  Confirm ODBC driver installation:
```
odbcinst -q -d -n "ODBC Driver 13 for SQL Server"
```

* Update the php.ini file: run` php --ini` to find the path to your php.ini file
* Add this line to /path/to/php.ini
```
extension=pdo_sqlsrv.so
```
* Run `php -i` to confirm SQLSRV support was added
* NOTE: extensions (on my computer) were installed here:
`/usr/local/lib/php/extensions/no-debug-non-zts-20160303/`

* Test user access directly on the Windows server running MSSQL:
```
sqlcmd -S ip_address -U username -P password -d database -q "select * from table_name"
```
* On the Windows server: open port 1433 in your firewall

* Install the FreeTds utils to test the connection:
```
sudo apt-get install freetds-bin
tsql -H mssql.host.ip.address -U username -P password -D database -p 1433
```

* Formulate the correct DSN (Data Source Name):
    See: http://php.net/manual/en/ref.pdo-sqlsrv.connection.php

* Sample PHP Code:
```
<?php
// Database params
$tcp  = '192.168.3.126';
$port = 1433;
$user = "test";
$password = "Password123";
$database = "test";

// Open connection
try {
   
// Database connect -- use one of the two statements below
   
$dsn 'sqlsrv:Server=tcp:' . $tcp . ',' . $port . ';Database=' . $database;
   
$dbh = new PDO( $dsn, $user, $password, array());
   
// SQL prepare
   
$sql = "SELECT * FROM prospects";
   
$sth = $dbh->prepare($sql);
   
// Execute
   
$sth->execute();
   
// Fetch results
   
$row = $sth->fetch(PDO::FETCH_ASSOC);
    if (
$row) {
       
$output = '<pre>';
       
$output .= implode("\t", array_keys($row)) . PHP_EOL;
       
$output .= implode("\t", $row) . PHP_EOL;
        while (
$row = $sth->fetch(PDO::FETCH_NUM)) {
           
$output .= implode("\t", $row) . PHP_EOL;
        }
    }
} catch (
PDOException $e) {
   
$output .= $e->getMessage();
}
$output .= '</pre>';
echo
$output;
```
To Top