Преобразовать результат 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);