IBMi DB2 for iにPHP(UBUNTU環境）から接続する。

# はじめに
DB2のデータを使用したwebアプリ(マスタや発注データなどの検索、更新を行うアプリ）を作製した際の作業の備忘録です。
今回は接続までの手順です。
OSはubuntu22.04.3でありPHPのパッケージは
```
$ sudo apt update
$ sudo apt install -y php php-cli php-common php-dev php-gd php-imap php-json php-ldap php-mbstring php-mysql php-odbc php8.1-common php-pdo php-pear php-apcu php-soap php-xml php-xmlrpc
```
でインストールが完了していることを前提としています。

詳細は[過去記事](https://qiita.com/bistro_56/items/f3c9e7db8b2ff3564152)とほぼ同一環境なのでそちらをご参考ください。

#ODBCドライバーマネージャのインストールを行う

以下コマンドを実行してください。
```
$sudo apt update
$sudo apt install -y unixodbc unixodbc-dev
```

# ODBCドライバの設定
#### (1)IBMi公式ページからODBCドライバーをダウンロード
[こちらのリンク](https://www.ibm.com/support/pages/ibm-i-access-client-solutions)にアクセスし、Downloads for IBM i Access Client Solutionsのページに進んでください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4003510/c2a28ac1-548d-4d64-b3ce-ed195e9038b0.png)

#### (2)IBMにログインする
IDとPWを打ち込んでサインインしてください。もしアカウントがない場合はIBMidの作製からアカウントを作成してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4003510/a8c52dc2-3686-47a5-beb5-19e9829bd889.png)

#### (3)Zipファイルをダウンロードする
ACS Linux App PkgのDownloadを押し、zipファイルを落とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4003510/42c43986-2fc2-4b09-9b55-79b9612feeec.png)

#### (4)debファイルをサーバー上に置きます。
zipを解凍すると、x86_64フォルダの中にibm-iaccess-1.1.0.28-1.0.amd64.debがあるかと思います(バージョンは変動します）。debファイルをUbuntuサーバーのお好きな場所に置きましょう。ホームディレクトリに置くのが楽です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4003510/537e4730-127f-45f8-84b9-051a60fa13f6.png)

#### (5)インストールします。
以下コマンドでODBCドライバーをインストールします。ホームディレクトリ以外にdebを置いている場合はその置いている場所に移動しましょう
```
$ sudo dpkg -i ibm-iaccess-1.1.0.28-1.0.amd64.deb
```
＊場合によってはエラーが発生し`$ sudo apt install -f`で依存関係の解決を行う必要があります。

正常にインストールできていれば/etc/odbcinst.iniに以下の記述が追加されているかと思います。
```
[IBM i Access ODBC Driver]
Description=IBM i Access for Linux ODBC Driver
Driver=/opt/ibm/iaccess/lib/libcwbodbc.so
Setup=/opt/ibm/iaccess/lib/libcwbodbcs.so
Driver64=/opt/ibm/iaccess/lib64/libcwbodbc.so
Setup64=/opt/ibm/iaccess/lib64/libcwbodbcs.so
Threading=0
DontDLClose=1
UsageCount=1

[IBM i Access ODBC Driver 64-bit]
Description=IBM i Access for Linux 64-bit ODBC Driver
Driver=/opt/ibm/iaccess/lib64/libcwbodbc.so
Setup=/opt/ibm/iaccess/lib64/libcwbodbcs.so
Threading=0
DontDLClose=1
UsageCount=1
```

#### (6)DSNを作成します。
```
# sudo vim /etc/odbc.ini
```
空のodbc.iniファイルの中身を↓↓みたいな感じで編集します。
```
[任意のDSNを設定]
Description = DSNについての説明。
Driver = IBM i Access ODBC Driver 64-bit
System = 接続先ホスト名 or IPアドレスを設定
UserID = 接続に使用するユーザーID
Password = 接続に使用するPW
Naming = 0
DefaultLibraries = QGPL
Database = 任意のライブラリ
ConnectionType = 0
CommitMode = 2
ExtendedDynamic = 0
DefaultPkgLibrary = QGPL
DefaultPackage = A/DEFAULT(IBM),2,0,1,0,512
AllowDataCompression = 1
LibraryView = 0
AllowUnsupportedChar = 0
ForceTranslation = 0
Trace = 0
CCSID = 943...接続に使用する文字コード。ここで943(SHIFT_JIS)を設定しないと、漢字・カナのデータが取り出せない。
```
CCSIDは忘れやすいポイントなのでご注意ください。

#### (6)接続の確認
以下のコマンドで、ODBCを用いた接続を行います。
```
$ isql [DSN]
```

connected!と表示されれば、接続成功です。


# 補足
HTMLでのデータの取り扱い。
・PHP等で、HTMLにデータ出力を行う際、SHIFT_JISのままだと文字化けが発生する。
    そのため、あらかじめUTF-8に変換した上で出力する。

[PHPでの例]
文字列のエンコードをSHIFT_JISからUTF-8に変換
$string…変換する文字列
```
$string = mb_convert_encoding($string,'UTF-8','SJIS-win')
```

配列に格納された文字列のエンコードをSHIFT_JISからUTF-8に変換
$str_array...変換する文字列を含む配列
```
mb_convert_variables('UTF-8','SJIS-win',$str_array);
```

フォーム入力した文字列等をSQL文で使用する際は、逆にUTF-8からSHIFT_JISへの変換を行う。