Intereting Posts
Внедрить процесс оплаты с помощью Quickbook (Intuit Payment) PHP: почему моя дата сформирована на сервере по-разному? Регулярное выражение PHP для поиска букв, не поддерживаемых Как браузеру известно, какие файлы cookie отправляются на сервер при запросе? jQuery ajax возвращает ошибку 404 при передаче URL в качестве почтовых данных Как написать регулярное выражение для соответствия бесплатной учетной записи электронной почты? Повторно ввести $ HTTP_POST_VARS в PHP 5.3 Как мы можем сделать следующее утверждение в темах Controller с paginate? Почему эта транзакция SQLite с подготовленными операторами не работает? Howto цепочки объектов в PHP5: $ this-> foo-> bar-> baz () Как использовать корпус переключателя в шаблоне Mustache? SOAP-ответ на XML с помощью SimpleXML Установка PHP на Windows с помощью IIS Добавление пользовательского элемента формы в форму Adminhtml Как решить ошибку таймаута в Laravel 5

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

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

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

но:

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

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

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

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

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

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

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

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

EDIT (ответить на вопрос-вопрос от Казимира и Ипполита):

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

 result['intvalue1'] += 100; 

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

«50100», а не 150

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

Приведенный ниже код является лишь доказательством концепции. Он нуждается в инкапсуляции в функции / методе и некоторой полировке перед ее использованием в процессе производства (fe вызовите 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"); 

что-то вроде

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

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

Если вам не нужны серверные серверы, я просто передам 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 .