0

在我的 PHP 文件中,我正在使用如下查询读取大量信息:

SELECT  GROUP_CONCAT(CONCAT('<comment><body><![CDATA[',body,']]></body>','<replier>',if(screen_name is not null and !anonymous,screen_name,''),'</replier>','<created>',created,'</created></comment>') SEPARATOR '')
                        FROM   idiscussion
                        LEFT JOIN
                               users
                        ON     idiscussion.uid=users.id
                        WHERE  idiscussion.iask_id = 1

是的,它就像 xml 格式,但似乎在 PHP 中解析并不容易,

关于使用哪种格式以便以后轻松解析的任何建议?

至于我的我需要将它们连接在一起,

您可以考虑这种情况:一次检索1个主题和该主题下的讨论。1 个主题对应多个讨论。如何在 1 个查询中完成而不将其连接在一起?

4

4 回答 4

2

如果您从 SQL 数据库中获取数据,那么不使用 SQL 将其转换为某种文本格式会容易得多,而是执行常规查询并使用 SQL 函数来处理给定的结果。

如果您最终需要将数据序列化到其他 PHP 客户端,我会推荐PHP 的标准序列化格式

于 2009-05-27T21:17:22.767 回答
0

您可以使用DOMSimpleXML来解析 XML 文件,也可以使用JSONYAML。所有这些都非常易于使用,因为您可以依赖 PHP 的高级解析器。它们各有优缺点,具体取决于您要如何使用该格式。

于 2009-05-27T20:49:15.913 回答
0

取决于数据结构,但值列表可以使用 join() 轻松保存为分号分隔的条目列表,然后使用 split() 轻松解析。

这非常简单,但对于稍微复杂的数据可能并不理想。

回复评论:如果数据包含分号,则需要适当转义。

于 2009-05-27T20:44:52.957 回答
0

我能问一下为什么你不只是检索数据而不将它们连接在一起吗?

SELECT body,
       IF(screen_name IS NOT NULL AND !anonymous, screen_name, '') AS replier,
       created
FROM   idiscussion
LEFT JOIN
       users
ON     idiscussion.uid = users.id
WHERE  idiscussion.iask_id = 1

这应该与您的原始查询一样快地执行,并且您可以像访问任何其他结果集一样访问其数据。假设您使用的是 MySQL 而不是 PDO:

$result = mysql_query($sql);
if ($result) {
    while ($row = mysql_fetch_assoc($result)) {
        // $row is an associative array containing the current row's data.
    }
}

如果您需要创建 XML 但又想访问原始形式的数据,只需在 PHP 中创建即可。

$xml =
    '<comment>' .
         '<body><![CDATA[' . $row['body'] . ']]></body>' .
         '<replier>' . $row['replier'] . '</replier>' .
         '<created>' . $row['created'] . '</created>' .
    '</comment>';

如果尚未清理数据,您可能需要转义数据。您还可以使用XMLWriter等 XML 构建器,但这超出了本问题的范围。

于 2009-05-27T23:42:48.730 回答