2022年7月27日 星期三

PHP 8.1 測試

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.


沒有留言:

張貼留言

網誌存檔