2013-02-17 128 views
0

我想弄清楚如何构建我的脚本并需要一些帮助。php5使用XML文件中的SimpleXML INSERT INTO ON DUPLICATE KEYS UPDATE mysql

我使用PHP 5和MySQL 67年5月1日

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

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

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

这里是MySQL结构:

类别MySQL使用只是用来组下方
ID的MySQL VARCHAR Latin1的
站点使用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和数据库了。

//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; 

从这一点来看,正确的格式化sql过程与MySQL 5适当的转义序列,以避免黑客入侵。

我想这样做的方法如下:

// 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不加载数据。

回答

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 
    } 
} 
+0

感谢。我仍然没有得到任何负载到数据库中。也许我的代码有问题。我已经验证了我的数据库连接属性和表名,它都很好...所以它要么是MYSQL语句的格式不正确,要么上面建议的PHP代码没有正确循环。有什么建议么? – Tony 2013-02-17 16:55:56

相关问题