Error odbc_connect() SQL Error - Can't Open lib 'SQL Server'

Issue

Ketika hendak membuka koneksi ke database Microsoft SQL Server dengan PHP muncul error seperti berikut.

PHP Warning:  odbc_connect(): SQL error: [unixODBC][Driver Manager]Can't open lib 'SQL Server' : file not found, SQL state 01000 in SQLConnect in 
/home/user/public_html/tes.php on line 8

Hal tersebut kemungkinan karena driver belum ada sehingga perlu diinstall terlebih dahulu.

Solution

CloudLinux

Login ke server sebagai root user.

Jika memakai Cloudlinux/CageFS, Install driver dengan perintah

/opt/alt/alt-php-config/install_odbc

Atur supaya user CloudLinux dapat mengakses package ODBC.

cagefsctl --addrpm unixODBC

Lalu update CageFS.

cagefsctl --force-update && cagefsctl -M

Untuk memastikan driver telah terinstall, gunakan perintah berikut.

# odbcinst -q -d
[PostgreSQL]
[MySQL]
[FreeTDS]
[MariaDB]
[ODBC Driver 17 for SQL Server]

RHEL/CentOS

Jika memakai RHEL/CentOS Anda dapat mengeksekusi script berikut.

#!/bin/sh

# add repo conf
#curl https://packages.microsoft.com/config/rhel/${dist_ver}/prod.repo > /etc/yum.repos.d/mssql-release.repo
cat << EOF > /etc/yum.repos.d/mssql-release.repo
[packages-microsoft-com-prod]
name=packages-microsoft-com-prod
baseurl=https://packages.microsoft.com/rhel/\$releasever/prod/
enabled=1
gpgcheck=1
gpgkey=https://packages.microsoft.com/keys/microsoft.asc
EOF

# install packages
ACCEPT_EULA=Y yum -y install msodbcsql17

Untuk memastikan driver telah terinstall, gunakan perintah berikut.

# odbcinst -q -d
[PostgreSQL]
[MySQL]
[FreeTDS]
[MariaDB]
[ODBC Driver 17 for SQL Server]

cPanel

Install driver menggunakan skrip berikut.

#!/bin/sh

# add repo conf
#curl https://packages.microsoft.com/config/rhel/${dist_ver}/prod.repo > /etc/yum.repos.d/mssql-release.repo
cat << EOF > /etc/yum.repos.d/mssql-release.repo
[packages-microsoft-com-prod]
name=packages-microsoft-com-prod
baseurl=https://packages.microsoft.com/rhel/\$releasever/prod/
enabled=1
gpgcheck=1
gpgkey=https://packages.microsoft.com/keys/microsoft.asc
EOF

# install packages
ACCEPT_EULA=Y yum -y install msodbcsql17

Pastikan driver telah terinstall.

# odbcinst -q -d
[PostgreSQL]
[MySQL]
[FreeTDS]
[MariaDB]
[ODBC Driver 17 for SQL Server]

Untuk menggunakan modul PHP sqlsrv dan pdo_sqlsrv, Anda perlu menginstall package unixODBC-devel agar proses kompilasi dengan PECL tidak error.

yum install unixODBC-devel

Selanjutnya install modul dengan perintah.

/usr/bin/ea-php81-pecl install sqlsrv
/usr/bin/ea-php81-pecl install pdo_sqlsrv

Restart service Apache dan PHP-FPM.

/scripts/restartsrv_httpd
/scripts/restartsrv_apache_php_fpm

Untuk memastikan modul telah terinstall.

# /opt/cpanel/ea-php74/root/usr/bin/php -i | grep -i sqlsrv
Registered PHP Streams => https, ftps, compress.zlib, php, file, glob, data, http, ftp, compress.bzip2, phar, zip, sqlsrv
PDO drivers => mysql, odbc, sqlite, sqlsrv
pdo_sqlsrv
pdo_sqlsrv support => enabled
pdo_sqlsrv.client_buffer_max_kb_size => 10240 => 10240
pdo_sqlsrv.log_severity => 0 => 0
pdo_sqlsrv.report_additional_errors => 1 => 1
pdo_sqlsrv.set_locale_info => 2 => 2
sqlsrv
sqlsrv support => enabled
sqlsrv.ClientBufferMaxKBSize => 10240 => 10240
sqlsrv.LogSeverity => 0 => 0
sqlsrv.LogSubsystems => 0 => 0
sqlsrv.SetLocaleInfo => 2 => 2
sqlsrv.WarningsReturnAsErrors => On => On

Jika memerlukan modul terinstall di versi PHP lama, Anda dapat mengecek versi modul sqlsrv dan pdo_sqlsrv yang disupport oleh versi PHP lama link berikut.

Contoh.

  • Untuk PHP 7.2
/usr/bin/ea-php72-pecl install pdo_sqlsrv-5.8.1
  • Untuk PHP 7.3
/usr/bin/ea-php73-pecl install pdo_sqlsrv-5.9.0
  • Untuk PHP 7.4
/usr/bin/ea-php74-pecl install pdo_sqlsrv-5.10.0

Testing

Berikut adalah skrip PHP yang dapat digunakan untuk pengetesan MSSQL.

Function sqlsrv_connect().

<?php
    $serverName = "IP Address MSSQL";

// jika menggunakan custom port
//    $serverName = "IP Address MSSQL,PORT";

$connectionInfo = array( "Database"=>"testdb", "UID"=>"myuser", "PWD"=>"strongpassword");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

if( $conn ) {
     echo "Connection established.<br />";
}else{
     echo "Connection could not be established.<br />";
     die( print_r( sqlsrv_errors(), true));
}

Function odbc_connect.

<?php

// Configuration Settings for connection to Database
$host = 'IP Address MSSQL';
$user = 'myuser';
$pass = 'strongpassword';
$db   = 'testdb';
$conn = "DRIVER={/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.10.so.6.1};SERVER=$host;PORT=1433;DATABASE=$db";

// Open connection
$db_connect = odbc_connect($conn, $user, $pass);

// Check for successful connection
if ($db_connect) {
    echo 'Connection established.<br />';
} else {
    echo "Connection could not be established.<br />";
    echo "ODBC Error: " . odbc_errormsg($db_connect) . "<br />";
    exit; // Stop script execution
}

// Close connection
odbc_close($db_connect);

?>

Referensi: