PHP Laravel透過 PDO 取的資料的型態
在公司的專案
某個判斷我寫這樣
$data = 從資料庫拉回來的某欄位資料
if (array_search($data ,[54,94,87]) === false)
{
//假如變數不是這三個數字時執行
}
在我本地端執行是正確的
在公司的測試伺服器卻執行不了
這時候我以為是git有衝突沒推成功
所以先檢查測試機環境的git log 看
诶明明程式碼一樣!!
前輩說話了
:程式碼一樣那就是環境的問題囉
於是我開始比對差異
發現:
我所抓的某欄位值在測試伺服器端是"123"
在我自己Bulid的環境值是 123
去資料庫看看該欄位的型態是int
前輩又說話了
:試看看在你本地環境用mysqli去撈資料回來看看是什麼
結果是"123"
抓到熱心的傢伙了,
Laravel是透過PDO去連資料庫
但在PDO版本不支援情況下取回來的資料將都是String
後來公司的案子有些我在本地端執行不了
又想到是不是這個問題
去查了一下
改Laravel DB對PDO的設定如下
MSSQL
/vendor/laravel/framework/src/Illuminate/Database/Connectors/SqlServerConnector.php
@19行
PDO::ATTR_STRINGIFY_FETCHES => false,
改為
PDO::ATTR_STRINGIFY_FETCHES => true,
Mysql
/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php
@23、24行
PDO::ATTR_STRINGIFY_FETCHES => false,
PDO::ATTR_EMULATE_PREPARES => false,
改為
PDO::ATTR_STRINGIFY_FETCHES => true,
PDO::ATTR_EMULATE_PREPARES => true,
這樣我本地的環境就跟公司的環境一樣了
反而取得資料庫欄位型別
才是符合強型別