0

我试图弄清楚如何构建我的脚本并需要一些帮助。

我正在使用 PHP 5 和 MySQL 5.1.67

我的目标是能够从数据库中提取某些字段,用 PHP 重新格式化它们并将它们显示为列表。重新格式化将包括 HTML 序列。我的目标是有一个自动化的 CRON 脚本,它将自动更新网页。

我对这些语言的经验很少。所以任何帮助都会很好。

我的逻辑是我应该将所有内容加载到一个(mysql)表中。我的 XML 使用 latin1 字符集。类别、id、标题和描述是表中的每一列。

这是mysql的结构:

类别 mysql 使用 VARCHAR Latin1
站点刚刚用于分组
id mysql 使用 VARCHAR Latin1
标题 mysql 使用 VARCHAR Latin1
描述 mysql 使用 VARCHAR Latin1

XML结构如下:

// XML Structure
// 23 categories to loop through
// hunderds of sites to loop through per category
//
<catalog>
<category>
<name>Category_Name</name>
<site>
<id>UR545665U</id>
<pagerank>1</pagerank>
<title>Title_Name</title>
<description>Description_of_the_site</description>
</site>
</category>
</catalog>
//
//

我已经到了使用下面的代码加载我的 XML 和 DB 的地步。

//mysql connection
$con2 = mysql_connect("www.hosting.com","db_username","db_password");
if (!$con2) {
    die('Could not connect: ' . mysql_error());
}

$dbcon1 = mysql_select_db("database_name", $con2);
if (!$dbcon1) {
    die ('Can\'t use database_name : ' . mysql_error());
}


//simplexml load xml file with simplexml
$library=  simplexml_load_file('feed.xml');
    if ($xml === false) {
        echo "Failed loading XML\n";
        foreach(libxml_get_errors() as $error) {
            echo "\t", $error->message;
        }
    }

那么这就是我遇到麻烦的地方......我需要遍历类别并在其中遍历站点。我遇到的麻烦是我不能使用 getName() 函数,因为<category>并且<site>没有在 xml 中命名。所以我用<name>它来识别类别,因为它是唯一的,并且<id>识别站点也是唯一的。

所以我在这里的逻辑是在其内部有一个 foreach() 函数。遍历类别并遍历其类别中的每个站点。

//begin loop each category and each site
foreach($library->xpath('/Catalog/Category/Name') as $category) {
    foreach($library->xpath('/Catalog/Category/Name/Site/Id') as $id) {
        $site = $library->xpath('//Site');
        $title = $site->Title;
        $description = $site->Description;

从这一点来看,是用 mysql 5 正确的转义序列来正确格式化 sql 进程以避免黑客攻击。

我正在考虑这样做的方式如下:

// Format Query String into a variable
// Note: VALUES are in "" because they may contain strings
// sprintf() will run on each loop to format the new <site> string

        $mynewquery = sprintf('REPLACE INTO Table_Name (id, title, description, category) VALUES (\"%4$s\",\"%6$s\",\"%7$s\",\"%3$s\")');
        if ($mynewquery === false) {
            echo "Failed formatting query string\n";
            foreach(libxml_get_errors() as $error) {
                echo "\t", $error->message;
            }
        }   


//Run Query String to load data into DB

        mysql_query($mynewquery);
        if (!$mynewquery) {
            die ('Error running Query: ' . mysql_error());
        }
//
// close the loops and database connection after this.

我使用了 echo 语句(未显示)来获取有关该过程的反馈。它一直通过加载 XML 没有错误。我的猜测是我在循环过程中遇到了语法问题。所以我有几个问题:

  • 我的逻辑正确吗?
  • 如果 XML 在其中引用了 DTD,是否需要在脚本中放置任何特殊编码?
  • 我是否使用适当的变量和函数来实现我的意图?

关于如何使这项工作的任何建议?我试过了,但数据库不加载数据。

4

1 回答 1

0

您正在循环遍历 xml 元素,但根本没有引用循环变量。你需要更多这样的东西:

foreach($library->Category as $category) {
    foreach($category->Site as $site) {
        $id = $site->Id;
        $title = $site->Title;
        $description = $site->Description;

        //- insert into db here
    }
}
于 2013-02-17T15:33:20.080 回答