一直有一個問題,就是PHP用mysqli還是pdo,查詢出來的結果都是int類型的資料會自動變成string類型,PHP本身弱類型。但是現在寫api,直接從資料庫裡查出來的結果,然後json_encode 返回給用戶端是不行的。java 和 oc 都是強型別 數字就是數字,字串就是字串。123 != "123"
這個是程式碼,用的mysqli類
這個是表結構
這個是查詢 出來的結果
google 了好多說法,pdo倒是有解決的方法pdo查詢int轉換成string的問題。但是mysqli沒找到,而且不知道這個究竟是什麼問題。或者是有沒有一些現成的類庫,可以自動轉換的。
回複內容:
一直有一個問題,就是PHP用mysqli還是pdo,查詢出來的結果都是int類型的資料會自動變成string類型,PHP本身弱類型。但是現在寫api,直接從資料庫裡查出來的結果,然後json_encode 返回給用戶端是不行的。java 和 oc 都是強型別 數字就是數字,字串就是字串。123 != "123"
這個是程式碼,用的mysqli類
這個是表結構
這個是查詢 出來的結果
google 了好多說法,pdo倒是有解決的方法pdo查詢int轉換成string的問題。但是mysqli沒找到,而且不知道這個究竟是什麼問題。或者是有沒有一些現成的類庫,可以自動轉換的。
關閉類比預先處理時,能保持資料類型,但某些類型,輸出的資料跟資料庫裡的值不一致:
比如float(9,2)類型的欄位,欄位內容為32.10,PDO關閉類比預先處理時讀到的值為32.099998474121,類型為float.
也就是說開啟PDO類比預先處理(預設),返回的資料類型都是string,值跟資料庫儲存的內容一致.
MySQL伺服器沒有使用預先處理時,返回的是string類型的資料.
MySQLi不使用prepare查詢返回的欄位類型全部是string,值跟資料庫儲存的內容一致.
使用prepare時跟pdo_mysql關閉類比預先處理一樣,返回對應類型的資料(decimal類型依舊是字串),而且float類型的值也存在不一致.
所以,資料庫中帶有小數點的資料,建議使用字串類型或decimal類型儲存.
類型轉換:
settype($foo, "array");
settype($foo, "bool");
settype($foo, "boolean");
settype($foo, "float");
settype($foo, "int");
settype($foo, "integer");
settype($foo, "null");
settype($foo, "object");
settype($foo, "string");
$foo = (array)$foo;
$foo = (b)$foo; // from PHP 5.2.1
$foo = (binary)$foo; // from PHP 5.2.1
$foo = (bool)$foo;
$foo = (boolean)$foo;
$foo = (double)$foo;
$foo = (float)$foo;
$foo = (int)$foo;
$foo = (integer)$foo;
$foo = (object)$foo;
$foo = (real)$foo;
$foo = (string)$foo;
可以用mysqli_result
對象的fetch_field
方法來獲得欄位的中繼資料。參見:PHP: mysqli_result::fetch_field - Manual。
相關方法還有fetch_fields
、fetch_field_direct
。
給個樣本吧:
//擷取到$result之後$types = array();while ( $finfo = $result->fetch_field() ) { if ( in_array( $finfo->type, array( MYSQLI_TYPE_BIT, MYSQLI_TYPE_TINY, MYSQLI_TYPE_SHORT, MYSQLI_TYPE_LONG, MYSQLI_TYPE_LONGLONG, MYSQLI_TYPE_INT24 ) ) { $type = 'int'; } else if ( in_array( $finfo->type, array( MYSQLI_TYPE_FLOAT, MYSQLI_TYPE_DOUBLE, MYSQLI_TYPE_DECIMAL, MYSQLI_TYPE_NEWDECIMAL ) ) { $type = 'float'; } else { //其他需要轉換的類型請自行研究 //類型常量請參見http://php.net/manual/zh/mysqli.constants.php,MYSQLI_TYPE開頭的那些就是 $type = 'string'; } $types[$finfo->name] = $type;}$result = $result->fetch_assoc();foreach ( $result as $name => &$value ) { settype($value, $types[$name]);}//現在$result裡的資料類型已經符合要求了