2018/09/12

MSSQLへPHPで接続(PDO接続)

表題の、PHPでMSSQLへの接続時のオボエガキ

もともとは、mssql_connectにてMS SQLServerに接続していたが、
サーバの仕様変更と、php7から利用できなくなることもありPDOPHP Data Objects の略)
接続へ切り替えた。

設定は、/etc/odbc.iniにてODBCのIDとfreetdsドライバーを関連付
/etc/odbcinst.iniに freetdsドライバーを追加
[freetds]
Description = MS SQL database access with Free TDS
Driver      = /usr/local/lib/libtdsodbc.so
UsageCount  = 1
Trace = Yes

freetdsをリポジトリからインストールするとSSLサポートされないので、
手動でインストールが必要だった。
https://stackoverflow.com/questions/39395548/how-to-configure-pymssql-with-ssl-support-on-ubuntu-16-04-lts/39395549
先駆者様ありがとうございます。
python-pip と libssl-dev をインストール後、
freeTDSは0.95のtar.gzを展開し、ディレクトリ内でmakeインストールする。

# ./configure --with-openssl=/usr/include/openssl --with-tdsver=7.3 
# make 
# make install


$ tsql -C
Compile-time settings (established with the "configure" script)
                            Version: freetds v0.95
             freetds.conf directory: /usr/local/etc
     MS db-lib source compatibility: no
        Sybase binary compatibility: no
                      Thread safety: yes
                      iconv library: yes
                        TDS version: 7.3
                              iODBC: no
                           unixodbc: yes
              SSPI "trusted" logins: no
                           Kerberos: no
                            OpenSSL: yes ←ここが重要
                             GnuTLS: no


freetdsで接続する際に参照される接続先の定義は、/home/ユーザ名/.freetds.confに記載する。
##.freetds.confの中身##

#   $Id: freetds.conf,v 1.12 2007-12-25 06:02:36 jklowden Exp $
#
# This file is installed by FreeTDS if no file by the same
# name is found in the installation directory.
#
# For information about the layout of this file and its settings,
# see the freetds.conf manpage "man freetds.conf".

# Global settings are overridden by those in a database
# server specific section
[global]
        # TDS protocol version
;       tds version = 4.2
        # Whether to write a TDSDUMP file for diagnostic purposes
        # (setting this to /tmp is insecure on a multi-user system)
;       dump file = /tmp/freetds.log
;       debug flags = 0xffff
        # Command and connection timeouts
;       timeout = 10
;       connect timeout = 10
        # If you get out-of-memory errors, it may mean that your client
        # is trying to allocate a huge buffer for a TEXT field.
        # Try setting 'text size' to a more reasonable limit
        text size = 64512
# A typical Sybase server
[hoge] ←この変数を 'odbc:hoge' で読み込む。
        host = hoge-sql.database.windows.net 
        port = 1433
        tds version = 7.3
        database = DEMODB
        encryption = require


【PHPの中身】

//MSSQLにPDO接続
//基本:$pdo = new PDO($dsn, $username, $password, $driver_options);
try {
    $pdo = new PDO('odbc:hoge','ログインユーザ名@hoge-sql.database.winwdows.net','パスワード');
    $pdo->exec('SET CHARACTER SET utf8');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
}catch(PDOException $Exception){
    die('接続エラー:' .$Exception->getMessage());

}

//クエリ取得
try{
    $sql= "select * from [テーブル名] where 条件";
    $stmh = $pdo->prepare($sql);
    $stmh->execute();
}catch(PDOException $Exception){
    die('接続エラー:' .$Exception->getMessage());
}

while($col = $stmh->fetch(PDO::FETCH_ASSOC)){
print($col['カラム名']);
//変数等を定義する場合も普通に行える。
}
}//クエリの取得終了

//sqlServerの接続を解除

 $pdo = null;