【问题标题】:Updating a Mysql database from XML从 XML 更新 Mysql 数据库
【发布时间】:2012-08-30 02:19:27
【问题描述】:

我正在使用以下 php 代码从 xml 文件加载数据以插入到 Mysql 中,我想在本网站中有新文章时更新此 rss 提要。

<?php
mysql_connect("localhost","root","");
mysql_select_db("rss") ;

$feeds = array('http://mywebsite.com/index.php?format=feed&type=rss');
foreach( $feeds as $feed ) {
$xml = simplexml_load_file($feed);

foreach($xml->channel->item as $item)
{
$date_format = "j-n-Y"; // 7-7-2008




 echo '<style type="text/css">.style1 { direction: rtl;</style><p class="style1">';
 echo $item->pubDate;  
 echo '<br><a href="'.$item->link.'" target="_blank">'.$item->title.'</a><br>';
 echo '<div>' . $item->description . '</div><br><br><br><hr><br>';
 echo '<div>' . $item->content . '</div><br><br><br>';             
 echo '</p>';




mysql_query("INSERT INTO rss_feeds (id, title, description, link, category, pubdate,  facebook_pub, website) 
VALUES (
    '', 
    '".mysql_real_escape_string($item->title)."', 
    '".mysql_real_escape_string($item->description=htmlspecialchars(trim($item->description)))."', 
    '".mysql_real_escape_string($item->link)."', 
    '".mysql_real_escape_string($item->category)."', 
    '".mysql_real_escape_string($item->pubDate)."',
    'No', 
    'almourassel.com')");    
    }
    }
    ?>

但是,当我加载此脚本时,它会重新插入之前添加的数据。我怎样才能更新新文章。

我认为脚本应该添加新项目,直到它通过比较 Pubdate 来满足表中添加的 las 元素。

【问题讨论】:

  • 大家好,我发现这里问题的最佳解决方案是使用 INSERT IGNORE INTO 提要,因为它非常快并且只需更新丢失的数据。需要注意的是,我将标题列更改为唯一,谢谢大家。

标签: php mysql xml simplexml


【解决方案1】:

最简单的方法是使用 MySQL replace into 命令

REPLACE INTO table_name(column_name1,column_name2,…) VALUES(value1,value2,…)

MySQL REPLACE 语句是对 SQL 标准的 MySQL 扩展。 MySQL REPLACE 的工作方式类似于 INSERT 语句,具有以下规则:

  • 如果正在插入的记录不存在,MySQL REPLACE 将插入一条新记录。
  • 如果要插入的记录存在,MySQL REPLACE 会先删除旧记录,然后插入具有新值的新记录。

基本上,您只需在 SQL 语句中将 INSERT INTO 替换为 REPLACE INTO

但是,如果您有auto-increment primary keys,例如,replace into 可能不是一个好主意,因为它删除和插入记录,将为相同的记录创建新的 PK id,从而导致 FK 约束问题。.

另一个选项是使用INSERT ... ON DUPLICATE KEY UPDATE,这将再次检查唯一键字段上的重复项。如果您可以确定每篇文章的 pubdate 都是唯一的,则可以使用此语法代替 replace into

或者你可以走传统的路线,你做一个select from table where db_pubdate = rss_pubdate,如果没有匹配的记录你做一个insert into table

【讨论】:

  • 非常感谢 Raidenace 的回答,它非常有用。但是,如果网站包含很多文章,这种方法执行起来会不会花费很多时间?也许,它会更好地查找并插入当天的文章。
  • 在内部,这个方法所做的也是检查记录是否存在。可能会有性能下降,但我认为只有当记录集真的很大时。当然,您可以执行select where db_pubdate = rss_pubdate,然后只对那些不匹配的记录执行插入操作,但这意味着为您在 rss 提要中获取的每条记录运行select - where。话虽如此,您可以做一个简单的基准测试来查看速度的差异。 replace into 是一种将记录合并到数据库中的便捷方法。总之,万事如意!
  • 当我实现这个方法时,它总是添加所有文章,因为 id 字段总是不同的。请帮忙
  • 哦,天哪,如果您有 auto_increment 字段,那么使用 replace into 可能不是一个好主意 - 因为如上所述,它 deletes and inserts 从而创建新的 PK id 并破坏现有的 FK 关系,如果有的话。您可以使用INSERT ... ON DUPLICATE KEY UPDATE,但考虑到您要在这里实现的目标,我认为执行select - where 然后在不存在匹配的pupdate 时插入似乎是最好的解决方案。抱歉,替换成似乎不是最好的方法。我会更新答案以反映这一点!
  • 非常感谢您的回答。我认为第二种解决方案更好。我现在可以通过 skkype 或 msn 直接与您联系,如果您当然不介意,您可以帮我解决这个问题吗?我的Skype是nizar.b78。非常感谢提前
【解决方案2】:

您还可以编写两个不同的查询,一个用于删除表的现有数据,然后点击您的插入查询。 或者你可以使用替换到mysql的命令。 我以前用非常简单的方法做过,请参阅:

mysql_query("DELETE FROM `wp_property`") or die(mysql_error());   
echo "Old data deleted !: <br /><br />";
$xmls = simplexml_load_file('my_file_location.xml');
foreach($xmls->Property as $xml)
{
$ID = $xml->ID;  
$ManagementCompanyID = $xml->ManagementCompanyID;
$MarketingName = $xml->MarketingName;
}

$sql = "INSERT INTO `wp_property` SET`ID`='".mysql_real_escape_string(trim($ID))."',   `ManagementCompanyID`='".mysql_real_escape_string(trim($ManagementCompanyID))."', `MarketingName`='".mysql_real_escape_string(trim($MarketingName))."'";

if (!mysql_query($sql))
{
die('Error: ' . mysql_error());
}

}
echo "New Records added successfully ! <br /><br />";

希望对您有所帮助。 编码愉快!

【讨论】:

  • 谢谢高拉夫。这很有帮助。但是请你告诉我如何修改我的代码以便从当天发布的 xml 文件中获取项目?
  • @NizarBarkallah 你可以用不同的方式解析 xml 文件。这是最简单的一种。我没有正确理解您的观点,对此感到抱歉,但是如果您想删除以前的数据并每天插入新数据,那么您必须为此使用“cronjob”。如果对你有帮助,请给我投票:)
  • 您好,我发现这里问题的最佳解决方案是使用 INSERT IGNORE INTO 提要,因为它非常快并且只需更新丢失的数据。需要注意的是,我将标题列更改为唯一,谢谢大家。
猜你喜欢
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
  • 2020-09-22
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多