PHP 8.1 使用 VS 2016 來編譯的。
ODBC 的考量
參考 Microsoft 的 [Docs/SQL 連線/ODBC/Windows] 的 系統需求、安裝和驅動程式檔案
SQL 的版本相容性,因為不曉得連結那時會失效,擷圖如下
支援的作業系統,擷圖如下。測試的結果,在 Windows 7 和 Windows 10 上都可以用。
但是在使用 sqlsrv_connect() 來連 SQL Server 2008 時,還是碰到一些問題。
連接的程式片段如下。注意必須指定語言編碼,不然 SQL 丟回的錯誤訊息會變一堆亂碼。
$serverName = "10.161.86.186";
$connectionInfo = array(
"UID" => 'sa', "PWD" => 'abcd1234', "Database"=>"db_test" ,
"CharacterSet" => "UTF-8"
);
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false )
{
echo "Could not connect.\n";
echo '<pre>'.print_r( sqlsrv_errors(), true).'</pre>';
exit;
}
由瀏覽器觀看結果如下
Could not connect.Array
(
[0] => Array
(
[0] => IM006
[SQLSTATE] => IM006
[1] => 0
[code] => 0
[2] => [Microsoft][ODBC 驅動程式管理員] 驅動程式的 SQLSetConnectAttr 失敗
[message] => [Microsoft][ODBC 驅動程式管理員] 驅動程式的 SQLSetConnectAttr 失敗
)
[1] => Array
(
[0] => 01000
[SQLSTATE] => 01000
[1] => 5701
[code] => 5701
[2] => [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]已將資料庫內容變更為 'NTU_test'。
[message] => [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]已將資料庫內容變更為 'NTU_test'。
)
[2] => Array
(
[0] => 01000
[SQLSTATE] => 01000
[1] => 5703
[code] => 5703
[2] => [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]已將語言設定變更為 繁體中文。
[message] => [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]已將語言設定變更為 繁體中文。
)
)
搜尋得到的解答,最快的方法是升級 ODBC driver 的版本,但升級之後就不支援 SQL Server 2008 了,但有人提供一個簡單的作法,請參照 Cannot connect to SQL Server with PHP script。
作法是在程式開頭加上 sqlsrv_configure('WarningsReturnAsErrors', 0); 。因為 sqlsrv_connect() 傳回的只是 warning,並非 error。
後來又測了 pdo_sqlsrv,就很正常,不會出現上面的錯誤。
關於 null array 的 element
到現在才知道,在 PHP 中,存取 null array 的 element 並不會出錯,直到 PHP 7.4 之後 ...
Actually, John Vargo was correct. If a variable is null, accessing it as if it were an array will simply return null without notices. This will change in the upcoming 7.4 version, then it will produce a notice.
Notice: Trying to access array offset on value of type null
The actual output is still the same.