在PHP中使用mysql_fetch_assoc時,如何才能使其返回正確的數據類型?現在它似乎將所有東西都轉換爲字符串,我寧願將它作爲Ints離開Ints,並以某種方式將Date/Time指定爲Object或與字符串不同。讓mysql_fetch_assoc自動檢測返回的數據類型?
原因是我使用PHP作爲Flex應用程序的後端,Flex具有一些功能,如自動檢測返回類型,如果所有內容都以字符串形式出現,則返回類型不起作用。
在PHP中使用mysql_fetch_assoc時,如何才能使其返回正確的數據類型?現在它似乎將所有東西都轉換爲字符串,我寧願將它作爲Ints離開Ints,並以某種方式將Date/Time指定爲Object或與字符串不同。讓mysql_fetch_assoc自動檢測返回的數據類型?
原因是我使用PHP作爲Flex應用程序的後端,Flex具有一些功能,如自動檢測返回類型,如果所有內容都以字符串形式出現,則返回類型不起作用。
我認爲一個好的策略是編程式地確定表中每列的數據類型,並將返回的結果因此。這將允許您以更加一致和簡單的方式與數據庫進行交互,同時仍然允許您控制您需要讓變量存儲正確的數據類型。
一個可能的解決方案:你可以使用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()方法中使用此功能創建一個類,這樣您就不必重複代碼。
你可以在mdb2周圍建立一個使用SHOW COLUMNS命令自動檢測字段類型的特定於mysql的圖層,但這樣做可能會損害使用mdb2的目的。
請記住,也即MySQL的suports井外PHP的範圍的整數,(UNSIGNED BIGINT是64位; PHP支持,充其量64位簽署整數,而較少在32位平臺),以便自動地投射在某些情況下可能不合需要。在這些情況下,你真的想保持大字符串的字符串形式,並操縱它們bcmath
我想分享我爲同樣的問題寫的一個函數。通過查詢結果$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
就貢獻了小的改進到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);
返回行,在正確輸入字段
很好的問題,有時弱類型語言可以是一個痛苦,當你真正需要保護你的數據類型的關聯數組。 – 2009-06-09 19:48:21
我的解決方案適合您嗎?另外,如果你喜歡我的回答,你是否可以將其標記爲已接受? SO系統接受了它,但我只獲得一半的賞金,即使它顯示爲已被接受。謝謝 – 2009-06-11 14:08:40
好的,謝謝你,對不起,這不是你正在尋找的。祝你的問題好運。 – 2009-06-11 17:45:05