web-dev-qa-db-ja.com

PHP PDO経由でMSSQLに接続ODBC

このコードを実行すると:

print_r(PDO::getAvailableDrivers()); 

odbcドライバーが利用可能であると書かれています。

Array ( [0] => mysql [1] => odbc [2] => sqlite )

ただし、次のように使用しようとすると:

$handle = new PDO("odbc:Server=dbServerIpAddress,myportnumber;Database=mydatabase", "myusername", 'mypassword');

それは何もしません-エラーもなく、まったく動作しません。それはその行を過ぎても実行されません!

PDOおよびODBCを介してこのMSSQLデータベースにPHPを接続するにはどうすればよいですか?

24
user1477388

設定が必要な構成ファイルがいくつかあります。 _/etc/odbc.ini_、_/etc/odbcinst.ini_、および_/etc/freetds/freetds.conf_(これらの場所はUbuntu 12.04で有効で、ほとんどの* nixでおそらく正しい)。

unixodbcfreetdsをインストールする必要があります(CentOSでのパッケージ名がわからない)。 Ubuntuでは、これは_apt-get install unixodbc tdsodbc_になります。

これらのインストールのヘルプについては、この質問をご覧ください Yum Package Manager)でFreeTDSをインストールできません

/etc/odbc.ini(このファイルは空の場合があります)

_# Define a connection to a Microsoft SQL server
# The Description can be whatever we want it to be.
# The Driver value must match what we have defined in /etc/odbcinst.ini
# The Database name must be the name of the database this connection will connect to.
# The ServerName is the name we defined in /etc/freetds/freetds.conf
# The TDS_Version should match what we defined in /etc/freetds/freetds.conf
[mssql]
Description             = MSSQL Server
Driver                  = freetds
Database                = XXXXXX
ServerName              = MSSQL
TDS_Version             = 7.1
_

/etc/odbcinst.ini

_# Define where to find the driver for the Free TDS connections.
# Make sure you use the right driver (32-bit or 64-bit).
[freetds]
Description = MS SQL database access with Free TDS
Driver      = /usr/lib/i386-linux-gnu/odbc/libtdsodbc.so
#Driver      = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup       = /usr/lib/i386-linux-gnu/odbc/libtdsS.so
UsageCount  = 1
_

/etc/freetds/freetds.conf(または/etc/freetds.confにあります)

_# The basics for defining a DSN (Data Source Name)
# [data_source_name]
#       Host = <hostname or IP address>
#       port = <port number to connect to - probably 1433>
#       tds version = <TDS version to use - probably 8.0>

# Define a connection to the Microsoft SQL Server
[mssql]
    Host = XXXXXX
    port = 1433
    tds version = 7.1
_

MSSQLのバージョンに応じて、上記の_tds version = 7.1_行を変更する必要がある場合があります。

これらの変更を行った後、Apacheを再起動する必要があります。

PHPコードで、次のようにPDOオブジェクトを作成します。

_$pdo = new PDO("dblib:Host=mssql;dbname=$dbname", "$dbuser","$dbpwd");
_

ユーザー名は_domain\username_の形式である必要があることに注意してください。

また、ページでphpinfo()を実行し、ライブラリバージョンとしてリストされたfreetdsを含むmssqlセクションを表示する「freetds」を検索すると、機能することがわかります。

33
Benny Hill

受け入れられた答えは、実際のPHP呼び出しまで正しいです。誰かが正しくコメントしているように、odbcドライバーを呼び出す必要があります。次に、データソース名(DSN)を使用していませんodbc.iniで設定されていますが、実際にはアドホックDSNを作成しています。

$pdo = new PDO("odbc:mssql", "$dbuser","$dbpwd");

mssqlは、odbc.iniのDSNオブジェクトを指します

次のようにアドホックDSNを作成できます。

$pd = new PDO('odbc:DRIVER=FreeTDS;SERVERNAME=mssql;DATABASE=' . $dbName,
              $dbuser, $dbpass);

ここで、mssqlfreetds.confのサーバーオブジェクトを参照し、FreeTDSのドライバーオブジェクトを参照しますodbcinst.ini

(これは本当にコメントになりますが、担当者がいません)。

37
JamesP

構成ファイルfreetds.confで指定せずに、FreeTDSドライバーを使用してMS SQLサーバーへのpdo odbc接続を直接セットアップする場合。

$connection_string = "odbc:DRIVER=FreeTDS;SERVER=$serverName;PORT=$portNo;DATABASE=$dbName"; 
$conn = new PDO($connection_string, $dbUser, $dbPass);

名前付きインスタンスを持つMSSQLサーバーがある場合、ポートnoを削除してから、server_ip\instance_nameの形式で$ serverNameを変更できます。例: "192.168.1.1\sqlexpress"ここで、sqlexpressはインスタンス名です。

$connection_string = "odbc:DRIVER=FreeTDS;SERVER=$serverName;DATABASE=$dbName"; 
$conn = new PDO($connection_string, $dbUser, $dbPass);

Odbcinst.iniでドライバーの場所を構成することに注意してください

[FreeTDS]
Description = TDS driver (Sybase/MS SQL)
Driver      = libtdsodbc.so
Setup       = libtdsS.so
2
Don