Преобразовать результат mysql в json с правильными типами

Я знаю, как получить строку mysql и преобразовать ее в json:

$row = mysqli_fetch_assoc(mysqli_query($db, "SELECT * FROM table WHERE id=1"));
echo json_encode($row); // it an ajax-call

а

строка db имеет разные типы, такие как int, float, string. путем преобразования его с помощью json_encode() все результаты являются строками.

Есть ли лучший способ исправить типы, чем это:

$row['floatvalue1'] = 0+$row['floatvalue1'];
$row['floatvalue2'] = 0+$row['floatvalue2'];
$row['intvalue1'] = 0+$row['intvalue1'];

Я хотел бы пройти через ключи и добавить 0, потому что:

  • первое правило кодирования: DRY - не повторяйтесь

но я не могу, потому что:

  • строка имеет также другие типы, кроме чисел (строка, дата)
  • существует много столбцов
  • дизайн находится в dev, поэтому имена колонок часто меняются

Спасибо заранее и извините мой плохой английский: -)

ИЗМЕНИТЬ (ответить на вопрос-вопрос от Казимира и Ипполита):

Я вызываю этот php-код, используя ajax, чтобы получить динамически sql-значения. в моем javascript-коде я использую следующие результаты:

result['intvalue1'] += 100;

позволяет сказать, что json-результат intval1 равен 50, вычисленный результат:

"50100", а не 150

Ответ 1

Приведенный ниже код является лишь доказательством концепции. Он нуждается в инкапсуляции в функции/методе и некоторой полировке перед ее использованием в процессе производства (например, вызов mysqli_fetch_field() в цикле и сохранение возвращаемых объектов перед обработкой любой строки, а не один раз для каждой строки).

Он использует функцию mysqli_fetch_field() для получения информации о каждом столбце набора результатов и конвертирует в номера те столбцы, которые имеют числовые типы. Значения констант MYSQLI_TYPE_* можно найти на странице документации предопределенных констант Mysqli.

// Get the data
$result = mysqli_query($db, "SELECT * FROM table WHERE id=1");
$row    = mysqli_fetch_assoc($result);

// Fix the types    
$fixed = array();
foreach ($row as $key => $value) {
    $info = mysqli_fetch_field($result);
    if (in_array($info->type, array(
            MYSQLI_TYPE_TINY, MYSQLI_TYPE_SHORT, MYSQLI_TYPE_INT24,    
            MYSQLI_TYPE_LONG, MYSQLI_TYPE_LONGLONG,
            MYSQLI_TYPE_DECIMAL, 
            MYSQLI_TYPE_FLOAT, MYSQLI_TYPE_DOUBLE
    ))) {
        $fixed[$key] = 0 + $value;
    } else {
        $fixed[$key] = $value;
    }
}

// Compare the results
echo('all strings: '.json_encode($row)."\n");
echo('fixed types: '.json_encode($fixed)."\n");

Ответ 2

Если вы просто пытаетесь удостовериться, что ваши значения работоспособны по отношению к их типу, вам нужно сначала правильно их напечатать.

Если вам не нужны серверные серверы, я просто передам json прямо в интерфейс и выполняю там работу.

В Javascript вы можете сделать так, чтобы лить числа:

function tryNumber(string){

    return !isNaN( parseInt(string) ) ? parseInt(string) : string;

}

function tryDate(string){

    return !isNaN( new Date(string).getTime() ) ? new Date(string) : string;

}

tryNumber('foo'); // "hello"
tryNumber('24'); // 24
tryDate('bar'); // "bar"
tryDate('December 17, 1995'); // "Sun Dec 17 1995 00:00:00 GMT+0000 (GMT)"

Эти две строки пытаются передать значения как Date/Number. Если они не могут быть брошены, они останутся String.

Ответ 3

что-то вроде

$row['floatvalue1'] = reset( sscanf ( $row['floatvalue1']  , "%f" ));
$row['floatvalue2'] = reset( sscanf ( $row['floatvalue2']  , "%f" ));
$row['intvalue1'] = reset( sscanf ( $row['intvalue1']  , "%d" ));
json_encode($row);