4

我将图像 URL 的数组编码为 json 字符串并将它们存储在数据库中。(utf8_general_ci)。

当我将数据插入表并检索它时, json_decode() 能够对其进行解码。

但是,当我将数据从一个表复制到另一个表(INSERT INTO ... SELECT 语句)时,从数据库检索后的数据无法再解码。

相反,我得到损坏的 json ENCoded 字符串。即使是空数组[]也无法正确解码。

它从http://pl.tinypic.com/r/fwoiol/8 转换为http://pl.tinypic.com/r/bgea05/8

(必须制作图像,因为这些方块不能作为文本复制)。

编辑,在检查了更多之后,我尝试 bin2hex() 数据库中的两个字符串。

两者似乎完全相同。

但是,一个解码,一个不解码。这

5b22687474703a5c2f5c2f7777772e
changes into
0022687474703a5c2f5c2f7777772e

因此, json_decode 仅将字符串中的 5b 更改为 00 。

就像它在某处丢失编码一样?

编辑 2

static public function jsonDecodeFieldsArray($entries, $fields = array('features','images')){
    foreach($entries as $key => $entry){
        $entries[$key] = self::jsonDecodeFields($entry, $fields);
    }
    return $entries;
}
static public function jsonDecodeFields($entry, $fields = array('features','images')){
    foreach($fields as $field){
        if(isset($entry[$field])){
            $entry[$field] = json_decode((string) $entry[$field], true);
        }
    }
    return $entry;
}

我正在使用上面的代码来解码 $fields 指定的数组键。但是,它不仅解码错误。但也会影响 $fields 中未列出的键。破坏他们的编码。

更多要添加。如果我不使用这些函数并且只在字段上使用 json_decodejson_decode($array[0][images], true)它工作正常。

4

2 回答 2

1

为了澄清我找到了答案/解决方案,我写了这个答案

此错误背后的原因不是 SQL 错误并且数据正确。我有一个示例数组:

$many_entries = array(
    array(
        'features' = > 'json_encoded_string'
        'images' = > 'json_encoded_string'
    ),
    array(
        'features' = > 'json_encoded_string'
        'images' = > 'json_encoded_string'
    )

);
// And 
$one_entry = array(
    'features' = > 'json_encoded_string'
    'images' = > 'json_encoded_string'
);

现在我有 2 个功能。一个解析$many_entries( jsonDecodeFieldsArray) 数组,一个解析$one_entry数组结构 ( jsonDecodeFields)。

问题是我用jsonDecodeFieldsArray$one_entryjsonDecodeFields迭代字符串。

于 2014-07-24T03:59:27.327 回答
0

奇怪的是,字符编码在传输过程中发生了变化。我会说检查你在 PHP 中的字符集,但你说问题只发生在表 => 表 SQL 传输中。我仍然会检查列/表的字符集。

您可以通过在解码时运行 str_replace() 来解决此问题。例如:

$DB_ARRAY = $DB_QUERY->fetch_array();
$CORRECT_ENCODING = json_decode(str_replace('0x93', '[', $DB_ARRAY['urlstring']), true);

当然,您需要知道错误编码的字符是什么。或者它的 ASCII 码等价物。

于 2014-07-22T23:37:15.433 回答