0

我在 Wordpress 中使用了一个表单构建器插件,它将表单输入作为 XML 数据提交到数据库。现在我想获取该数据并将其显示在另一个页面中。我已经开始尝试 simpleXML 来实现这一点,但现在我遇到了困难。

出现在数据库每一行中的 XML 数据遵循以下格式:

<form>
    <FormSubject>Report</FormSubject>
    <FormRecipient>****@***.com</FormRecipient>
    <Name>admin</Name>
    <Department>test</Department>
    <Value>1000</Value>
    <Comments>test</Comments>
    <Page>http://***.com</Page>
    <Referrer>http://****.com</Referrer>
</form>

我以前曾设法使用 simpleXML 从数据库中相同标记的 XML 字符串中获取我需要的数据,但现在我的问题是,如何对数据库中的每一行进行循环?

运行以下代码时,wordpress 会显示一个空白页,表示存在错误:

<?php
global $wpdb;
$statistics = $wpdb->get_results("SELECT * FROM wpformbuilder_results WHERE form_id = '00000000000000000001';");
echo "<table>";
foreach($statistics as $statistic){
$string = $statistic->xmldata
$xml = simplexml_load_string($string);
$Name = (string) $xml->Name;
$Department = (string) $xml->Department;
$Value = (string) $xml->Value;
$Comments = (string) $xml->Comments;

echo "<tr>";
echo "<td>".$statistic->timestamp."</td>";
echo "<td>".$Name."</td>";
echo "<td>".$Department."</td>";
echo "<td>".$Value."</td>";
echo "<td>".$Comments."</td>";
echo "</tr>";
}
echo "</table>";

?>
4

2 回答 2

2

你不见了;在第 5 行

$string = $statistic->xmldata

应该

$string = $statistic->xmldata;

您应该考虑在 wp-config.php 文件中启用 WP_DEBUG 常量。将以下代码插入到您的 wp-config.php 中,就在 /* 之前,就是这样,停止编辑!快乐的博客。*/

define('WP_DEBUG', true);

/* That's all, stop editing! Happy blogging. */

有关调试的更多提示,请阅读codex

Formbuilder 用户自定义函数在 formbuilder_xml_db_results 类中提取 XML 数据:

function xmltoarray($xml)
    {
        $xml = trim($xml);

        $match = "#<([a-z0-9_]+)([ \"']*[a-z0-9_ \"']*)>(.*)(</\\1>)#si";
        $offset = 0;

        if(!preg_match($match, $xml, $regs, false, $offset)) {
            return($xml);
        }

        while(preg_match($match, $xml, $regs, false, $offset))
        {
            list($data, $element, $attribs, $content, $closing) = $regs;
            $offset = strpos($xml, $data) + strlen($data);

            $tmp = $this->xmltoarray($content);
            $result[$element] = $tmp;

        }

        return($result);
    }

在您的代码中定义该函数(在全局 $wpdb 之前;您不必害怕与 Class 中定义的该函数同名),然后以这种方式修改您的代码:

<?php
global $wpdb;
$statistics = $wpdb->get_results("SELECT * FROM wpformbuilder_results WHERE form_id = '00000000000000000001';");
echo "<table>";
foreach($statistics as $statistic){
$xml = xmltoarray( $statistic->xmldata );
$Name = (string) $xml['form']['Name'];
$Department = (string) $xml['form']['Department'];
$Value = (string) $xml['form']['Value'];
$Comments = (string) $xml['form']['Comments'];

echo "<tr>";
echo "<td>".$statistic->timestamp."</td>";
echo "<td>".$Name."</td>";
echo "<td>".$Department."</td>";
echo "<td>".$Value."</td>";
echo "<td>".$Comments."</td>";
echo "</tr>";
}
echo "</table>";

?>

编辑:将 $xml['Comments'] 编辑为 $xml['form']['Comments'] 和类似的

于 2013-01-27T09:25:22.657 回答
0

我通过使用从 XML 字符串中去除反斜杠来修复它stripslashes()

于 2013-01-27T10:59:45.197 回答