我试图弄清楚如何构建我的脚本并需要一些帮助。
我正在使用 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,是否需要在脚本中放置任何特殊编码?
- 我是否使用适当的变量和函数来实现我的意图?
关于如何使这项工作的任何建议?我试过了,但数据库不加载数据。