【问题标题】:What is the best way to escape MySQL data to output to JSON?将 MySQL 数据转义以输出到 JSON 的最佳方法是什么?
【发布时间】:2011-11-09 12:29:05
【问题描述】:

我需要从 MySQL
为 javascript 输出数据(数组数组) 我正在使用此代码,除了 REPLACE 功能外,它工作正常
我需要修改进入 JS 数组的倒逗号“--”的所有文本按照 JS 格式。并且可以一次性用于所有领域。
我需要一个替换函数来转义所有数据,即 \ -> \\ ; ' -> \' ; newline -> \n

$sth=$dbh->prepare('
    SELECT GROUP_CONCAT(
        "\n[\'",
        CONCAT_WS("\',\'", d6id, REPLACE(d6name,"\'","\\\\\'"), d6date),
        "\']"
    )
    FROM d6lastdate
');
$sth->execute();($json)=$sth->fetchrow_array();

输出

['0000000001','CA\'T','2011-09-26'],
['0000000002','CWE','2011-09-23'],
['0000000003','MAT','0000-00-00'],

【问题讨论】:

  • 只对查询的裸结果进行 json_encode 不是更好吗?
  • 哇,你真的要从 SQL 中进行 json_encode 吗?
  • 我只是想看看我们是否可以直接从 SQL 生成 JSON,因为我的一半 SELECT 语句需要输出 JSON。虽然我没有尝试 DBIx::JSON。跨度>

标签: javascript mysql json perl escaping


【解决方案1】:

最好的方法可能是在 MySQL 之外执行此操作。

$data = $sth->fetchrow_arrayref();
$json = encode_json($data);

encode_json 由JSON::XS 提供。

【讨论】:

  • @Atul Gupta,已修复,现在只是 Perl。
【解决方案2】:
$sth=$dbh->prepare('
    SELECT d6id, d6name,d6date
    FROM d6lastdate
');
$sth->execute();
$json = encode_json($sth->fetchrow_arrayref());

encode_json 由JSON::XS 等提供。

【讨论】:

  • @CanSpice,我确定他的意思是encode_json,而不是json_encode。这两个响应最初都使用了fetchrow_array,而它们也应该使用fetchrow_arrayref。现在好点了吗?
【解决方案3】:

使用 PHP 并不总是一种选择(如果您希望存储过程在表中插入一行,其中一个或多个字段是 json 格式的字符串,该怎么办?)。

您的初始方法几乎是好的...如果您只是结果不是有效的 JSON:

  • 您需要使用双引号 (") 而不是单引号 (') 作为字符串分隔符
  • 不要忘记转义反斜杠 (\)
  • 如果您的字符串包含特殊字符,请确保它们以 UTF-8 编码
  • 最后一个逗号 (,) 会引起问题,需要删除

埃里克

编辑:您还需要转义回车、制表符和其他一些字符。查看此页面上的字符串定义:http://www.json.org。 您可以使用 http://jsonlint.com 验证生成的 json 字符串。

【讨论】:

  • 向表中添加一个字段来存储 json 格式的字符串是个好主意,这可以长期完成,因为目前我的数据库不是那么稳定,而且它的结构每天都在修改。跨度>
  • $sth=$dbh->prepare(' SELECT GROUP_CONCAT( json_string ) FROM d6lastdate '); $sth->execute();($json)=$sth->fetchrow_array();
【解决方案4】:
use Data::Dumper;
$Data::Dumper::Terse = 1;
$Data::Dumper::Indent = 0;

$sth=$dbh->prepare('
    SELECT d6tag, d6id, d6name, d6cat, d6date
    FROM d6lastdate
    ORDER BY d6date
');$sth->execute();

$json=Dumper($sth->fetchall_arrayref);

【讨论】:

    猜你喜欢
    • 2010-10-01
    • 1970-01-01
    • 2011-03-14
    • 2020-07-18
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多