使mysql_fetch_assoc自动检测返回数据类型?

时间:2009-06-01 19:30:10

标签: php mysql database types

在PHP中使用mysql_fetch_assoc时,如何让它返回正确的数据类型?现在它似乎将所有内容转换为字符串,我更喜欢它将Ints作为Ints离开,并以某种方式将日期/时间指定为Object或以某种方式与字符串不同。

这样做的原因是我使用PHP作为Flex应用程序的后端,而Flex有一些功能,例如自动检测返回类型,如果所有内容都以字符串形式出现,则效果不佳。

3 个答案:

答案 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