php5使用XML文件中的SimpleXML INSERT INTO ON DUPLICATE KEYS UPDATE mysql

时间:2013-02-17 15:28:30

标签: php mysql xml xml-parsing simplexml

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

我正在使用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,我的脚本中是否需要放置任何特殊编码?
  • 我是否使用适当的变量和函数来实现我的意图?

有关如何使这项工作的任何建议?我试过了,但是DB没有加载数据。

1 个答案:

答案 0 :(得分: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
    }
}