mysqli 和 pdo 查詢出來的類型轉換

來源:互聯網
上載者:User
  1. 一直有一個問題,就是PHP用mysqli還是pdo,查詢出來的結果都是int類型的資料會自動變成string類型,PHP本身弱類型。但是現在寫api,直接從資料庫裡查出來的結果,然後json_encode 返回給用戶端是不行的。java 和 oc 都是強型別 數字就是數字,字串就是字串。123 != "123"

這個是程式碼,用的mysqli類

這個是表結構

這個是查詢 出來的結果

  1. google 了好多說法,pdo倒是有解決的方法pdo查詢int轉換成string的問題。但是mysqli沒找到,而且不知道這個究竟是什麼問題。或者是有沒有一些現成的類庫,可以自動轉換的。

回複內容:

  1. 一直有一個問題,就是PHP用mysqli還是pdo,查詢出來的結果都是int類型的資料會自動變成string類型,PHP本身弱類型。但是現在寫api,直接從資料庫裡查出來的結果,然後json_encode 返回給用戶端是不行的。java 和 oc 都是強型別 數字就是數字,字串就是字串。123 != "123"

這個是程式碼,用的mysqli類

這個是表結構

這個是查詢 出來的結果

  1. 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_fieldsfetch_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裡的資料類型已經符合要求了
  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.