在PHP中使用mysql_fetch_assoc时,如何让它返回正确的数据类型?现在它似乎将所有内容转换为字符串,我更喜欢它将Ints作为Ints离开,并以某种方式将日期/时间指定为Object或以某种方式与字符串不同。
这样做的原因是我使用PHP作为Flex应用程序的后端,而Flex有一些功能,例如自动检测返回类型,如果所有内容都以字符串形式出现,则效果不佳。
答案 0 :(得分:14)
我认为这里的一个好策略是以编程方式确定表中每列的数据类型,并相应地转换返回的结果。这将允许您以更一致和简单的方式与数据库进行交互,同时仍然为您提供使变量存储正确数据类型所需的控件。
一种可能的解决方案:您可以使用mysql_fetch_field()来获取一个包含有关表列的元数据的对象,然后将您的字符串转换回所需的类型。
//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()方法中创建具有此功能的类,这样您就不必拥有重复的代码。
答案 1 :(得分:0)
你可以在mdb2周围构建一个特定于mysql的层,它可以使用SHOW COLUMNS命令自动检测字段类型,但这会破坏使用mdb2的目的。
请记住,mysql支持整数远远超出PHP的范围,(UNSIGNED BIGINT是64位; PHP最多支持64位签名整数,而32位平台则更少因此在某些情况下自动铸造可能是不合需要的。在这些情况下,您确实希望以字符串形式保留大量内容,并使用bcmath
对其进行操作答案 2 :(得分:0)
我想分享一个我为同样的问题写的函数。传递查询结果$rs
并获取转换数据的关联数组作为返回:
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