Сделать mysql_fetch_assoc автоматически обнаруживать возвращаемые типы данных? - PullRequest
7 голосов
/ 01 июня 2009

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

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

Ответы [ 4 ]

14 голосов
/ 09 июня 2009

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

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

Если вы используете ОО (объектно-ориентированные) методы, вы можете создать класс с этой функциональностью в методах setter (), чтобы вам не нужно было дублировать код.

1 голос
/ 09 мая 2015

Просто внесение небольшого улучшения в ответ mastermind202 для обработки большего количества типов данных. Спасибо, вдохновитель, за тяжелую работу!

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);

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

0 голосов
/ 15 июля 2014

Я хотел поделиться функцией, которую написал для этой же проблемы. Передайте результат запроса $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
0 голосов
/ 02 июня 2009

Вы можете создать специфичный для mysql слой вокруг mdb2, который автоматически определяет типы полей с помощью команды SHOW COLUMNS , но это отчасти отразило бы цель использования mdb2.

Имейте также в виду, что mysql поддерживает целые числа вне пределов диапазона PHP (UNSIGNED BIGINT составляет 64 бита; PHP поддерживает в лучшем случае 64-битные знаковые int и меньше на 32-битных платформах) поэтому автоматическое приведение может быть нежелательным в некоторых контекстах. В этих случаях вы действительно хотите сохранить большие целые в их строковой форме и манипулировать ими с помощью bcmath

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...