2009-06-01 17 views
7

在PHP中使用mysql_fetch_assoc時,如何才能使其返回正確的數據類型?現在它似乎將所有東西都轉換爲字符串,我寧願將它作爲Ints離開Ints,並以某種方式將Date/Time指定爲Object或與字符串不同。讓mysql_fetch_assoc自動檢測返回的數據類型?

原因是我使用PHP作爲Flex應用程序的後端,Flex具有一些功能,如自動檢測返回類型,如果所有內容都以字符串形式出現,則返回類型不起作用。

+0

很好的問題,有時弱類型語言可以是一個痛苦,當你真正需要保護你的數據類型的關聯數組。 – 2009-06-09 19:48:21

+0

我的解決方案適合您嗎?另外,如果你喜歡我的回答,你是否可以將其標記爲已接受? SO系統接受了它,但我只獲得一半的賞金,即使它顯示爲已被接受。謝謝 – 2009-06-11 14:08:40

+0

好的,謝謝你,對不起,這不是你正在尋找的。祝你的問題好運。 – 2009-06-11 17:45:05

回答

14

我認爲一個好的策略是編程式地確定表中每列的數據類型,並將返回的結果因此。這將允許您以更加一致和簡單的方式與數據庫進行交互,同時仍然允許您控制您需要讓變量存儲正確的數據類型。

一個可能的解決方案:你可以使用mysql _取_場()來獲取包含有關表列的元數據的對象,然後投出您的字符串返回所需的類型。

//run query and get field information about the row in the table 
$meta = mysql_fetch_field($result, $i); 

//get the field type of the current column 
$fieldType = $meta->type 

完整的例子可以在這裏找到:http://us2.php.net/manual/en/function.mysql-fetch-field.php

由於PHP是弱類型,你應該有一個相對容易的時間與此有關。

如果您使用OO(面向對象)技術,您可以在setter()方法中使用此功能創建一個類,這樣您就不必重複代碼。

0

你可以在mdb2周圍建立一個使用SHOW COLUMNS命令自動檢測字段類型的特定於mysql的圖層,但這樣做可能會損害使用mdb2的目的。

請記住,也即MySQL的suports井外PHP的範圍的整數,(UNSIGNED BIGINT是64位; PHP支持,充其量64位簽署整數,而較少在32位平臺),以便自動地投射在某些情況下可能不合需要。在這些情況下,你真的想保持大字符串的字符串形式,並操縱它們bcmath

0

我想分享我爲同樣的問題寫的一個函數。通過查詢結果$rs並獲得鑄造數據作爲回報assoc命令數組:

function cast_query_results($rs) { 
    $fields = mysqli_fetch_fields($rs); 
    $data = array(); 
    $types = array(); 
    foreach($fields as $field) { 
     switch($field->type) { 
      case 3: 
       $types[$field->name] = 'int'; 
       break; 
      case 4: 
       $types[$field->name] = 'float'; 
       break; 
      default: 
       $types[$field->name] = 'string'; 
       break; 
     } 
    } 
    while($row=mysqli_fetch_assoc($rs)) array_push($data,$row); 
    for($i=0;$i<count($data);$i++) { 
     foreach($types as $name => $type) { 
      settype($data[$i][$name], $type); 
     } 
    } 
    return $data; 
} 

用法示例:

$dbconn = mysqli_connect('localhost','user','passwd','tablename'); 
$rs = mysqli_query($dbconn, "SELECT * FROM Matches"); 
$matches = cast_query_results($rs); 
// $matches is now a assoc array of rows properly casted to ints/floats/strings 
1

就貢獻了小的改進到mastermind202的回答來處理更多的數據類型。謝謝mastermind做繁重的工作!

function cast_query_results($rs) { 
    $fields = mysqli_fetch_fields($rs); 
    $data = array(); 
    $types = array(); 
    foreach($fields as $field) { 
     switch($field->type) { 
      case MYSQLI_TYPE_NULL: 
       $types[$field->name] = 'null'; 
       break; 
      case MYSQLI_TYPE_BIT: 
       $types[$field->name] = 'boolean'; 
       break; 
      case MYSQLI_TYPE_TINY: 
      case MYSQLI_TYPE_SHORT: 
      case MYSQLI_TYPE_LONG: 
      case MYSQLI_TYPE_INT24: 
      case MYSQLI_TYPE_LONGLONG: 
       $types[$field->name] = 'int'; 
       break; 
      case MYSQLI_TYPE_FLOAT: 
      case MYSQLI_TYPE_DOUBLE: 
       $types[$field->name] = 'float'; 
       break; 
      default: 
       $types[$field->name] = 'string'; 
       break; 
     } 
    } 
    while($row=mysqli_fetch_assoc($rs)) array_push($data,$row); 
    for($i=0;$i<count($data);$i++) { 
     foreach($types as $name => $type) { 
      settype($data[$i][$name], $type); 
     } 
    } 
    return $data; 
} 

用法示例:

$db = mysqli_connect(...); 
$rs = mysqli_query($db, "SELECT ..."); 
$results = cast_query_results($rs); 

返回行,在正確輸入字段