Сделать mysql fetch assoc автоматически обнаруживать возвращаемые типы данных?

при использовании mysql_fetch_assoc в PHP, как я могу заставить его вернуть правильные типы данных? Прямо сейчас он, похоже, преобразует все в строки, Я бы предпочел, чтобы он оставил Ints как Ints и как-то обозначил дату/время как объект или как-то отличается от строк.

причина этого в том, что я использую PHP в качестве бэкэнда для приложения Flex, а Flex имеет некоторые функции, такие как автоматическое обнаружение типов возврата, которые не работают так хорошо, если все приходит в качестве струны.

4 ответов


Я думаю, что хорошей стратегией здесь является программно определить тип данных каждого столбца в таблице и соответственно привести возвращаемые результаты. Это позволит вам взаимодействовать с вашей базой данных более согласованным и простым способом, предоставляя вам контроль, необходимый для хранения переменных правильного типа данных.

одно из возможных решений: вы можете использовать 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 (), чтобы вам не пришлось дублировать код.


просто вносит небольшое улучшение ответить 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);

возвращает ассоциативный массив строк с полями


вы можете создать MySQL-специфичный слой вокруг mdb2, который автоматически обнаруживает типы полей с помощью ПОКАЗАТЬ СТОЛБЦЫ команда, но это будет своего рода поражение цели использования mdb2.

имейте в виду, также, что mysql поддерживает целые числа далеко за пределами диапазона PHP, (UNSIGNED BIGINT-64 бита; PHP поддерживает, в лучшем случае, 64 бит подпись ints и менее на 32-битных платформах), поэтому автоматическое литье может быть нежелательным в некоторых контекстах. В тех случаях, вы действительно хотите сохранить большие ints в их Строковой форме и манипулировать ими с помощью 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