我想弄清楚如何构建我的脚本并需要一些帮助。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不加载数据。
感谢。我仍然没有得到任何负载到数据库中。也许我的代码有问题。我已经验证了我的数据库连接属性和表名,它都很好...所以它要么是MYSQL语句的格式不正确,要么上面建议的PHP代码没有正确循环。有什么建议么? – Tony 2013-02-17 16:55:56