2015-07-08 2 views
-4

Я использую MySQL GROUP_CONCAT() для генерации строки JSON. Затем я расшифровываю его на PHP с помощью json_decode().JSON Безопасные значения от MySQL

Я уже спасаясь двойные кавычки в значениях, как это:

REPLACE(COALESCE(`column_name`, ''), '"', '\\\\"') 

Моя проблема заключается в том, что есть какой-то другой символ в записи, что недействительным и вызывая JSON_ERROR_SYNTAX (4) при попытке декодирования. Вместо того, чтобы отслеживать специфический характер, который вызывает эту проблему, я хотел бы применить более общее решение, которое делает ценности «безопасными».

This blog решает эту проблему с помощью HEX() функции MySQL, чтобы закодировать значение, а затем это PHP функция на декодировании конца для каждого значения:

function hexToStr($hex) 
{ 
    $string = ''; 
    for ($charIter = 0; $charIter < strlen($hex) - 1; $charIter += 2) 
    { 
     $string .= chr(hexdec($hex[$charIter] . $hex[$charIter + 1])); 
    } 
    return $string; 
} 

Я ищу решение, которое требует меньше работы по конец декодирования. Идеально выполняет всю работу в MySQL.


После трех downvotes и закрытого голосования я не уверен, как лучше структурировать свой вопрос. Я просто хочу избежать значений в MySQL, чтобы они были «безопасными JSON».

+0

Почему вы хотите сгенерировать строку json с помощью GROUP_CONCAT()? GROUP_CONCAT() сделает запрос медленным. почему бы не выполнить простой запрос? – vasilenicusor

+0

Вам никогда не приходило в голову, что то, что вы делаете, в основном глупо? Вы создаете строку JSON в MySQL, а затем расшифровываете ее на PHP - что не так с тем, чтобы вытащить материал из MySQL, а затем делать что-то с ним на PHP - преобразовывая его и кодируя/расшифровывая его? Базы данных не являются языками программирования, которые преобразуют данные в различные форматы, у них простая работа, и они делают это хорошо. Вы хотите использовать молот, чтобы съесть с ним суп. Хотя выполнимо, имеет ли смысл делать это? В качестве альтернативы вы всегда можете использовать JSON UDF и уйти от проблемы, но глупая часть все равно останется. –

ответ

0

Обновление: Я переключился на MariaDB, и использую функцию COLUMN_JSON, которая заботится о двойном кавычках, но не управляет символами. Here's my new solution.


Старый Solutiong

Держите двойные кавычки спасаясь в запросе:

REPLACE(COALESCE(`column_name`, ''), '"', '\\\\"') 

Добавьте эту функцию для выхода обратного слэша и управляющие символы, но оставив уже бежал двойные кавычки нетронутыми :

/** 
* Makes sure the JSON values built by GROUP_CONCAT() in MySQL are safe for json_decode() 
* Assumes that double quotes are already escaped 
* 
* @param string $mysql_json 
* @return string 
*/ 
function mysql_json_escape($mysql_json) 
{ 
    $rtn = ''; 
    for ($i = 0; $i < strlen($mysql_json); ++$i) { 
     $char = $mysql_json[$i]; 
     if (($char === '\\') && ($mysql_json[$i + 1] !== '"')) { 
      // escape a back slash, but leave escaped double quotes intact 
      $rtn .= '\\\\'; 
     } elseif (($ord = ord($char)) && ($ord < 32)) { 
      // hex encode control characters (below ASCII 32) 
      $rtn .= '\\u' . str_pad(dechex($ord), 4, '0', STR_PAD_LEFT); 
     } else { 
      $rtn .= $char; 
     } 
    } 
    return $rtn; 
} 

Назовите это так:

$data = json_decode(mysql_json_escape($mysql_json)); 
Смежные вопросы