Php 将RSS转换为数组,分解';说明';并在MySQL表中每行插入一个单词

Php 将RSS转换为数组,分解';说明';并在MySQL表中每行插入一个单词,php,mysql,rss,explode,Php,Mysql,Rss,Explode,我最近才接触到php和MySQL,我想获取一个RSS提要,将其转换为一个数组,只获取XML的描述部分,分解它并将其插入MySQL基础上的表中 我觉得这应该是可能的,但我现在有点不知所措。我尝试使用magpie作为解析器,但如果可能的话,我希望使用更简单的php代码 我要查找的结果将获取一个描述“This is a cat”,并将其插入一个包含两个字段的表中 ID术语 1这 2是 3A 4猫 这件事已经困扰了我好几天了。任何帮助都会很好 根据马特的帮助,我目前的情况就是这样。服务器似乎有一个“新M

我最近才接触到php和MySQL,我想获取一个RSS提要,将其转换为一个数组,只获取XML的描述部分,分解它并将其插入MySQL基础上的表中

我觉得这应该是可能的,但我现在有点不知所措。我尝试使用magpie作为解析器,但如果可能的话,我希望使用更简单的php代码

我要查找的结果将获取一个描述“This is a cat”,并将其插入一个包含两个字段的表中

ID术语
1这
2是
3A
4猫

这件事已经困扰了我好几天了。任何帮助都会很好

根据马特的帮助,我目前的情况就是这样。服务器似乎有一个“新MySQLi”标签的问题,所以我试图改变它,但它仍然没有存入任何东西到我的表


$host=“*******”;
$username=“**********”;
$password=“*******”;
$database=“**********”

mysql\u connect($host、$username、$password); @mysql_select_db($database)或die(“无法选择数据库”)

$parser=xml_parser_create('UTF-8'); $values=array(); xml_parse_进入_struct($parser,file_get_contents('********'),$values)

$query=“插入单词值(“”,$word)”

foreach($value作为$entry){ 如果($entry['tag']='SUMMARY'){ $words=preg_split('/\s+/',strtolower(preg_replace('/[^A-Za-z\s]+/','',strip_标签($entry['value']))); foreach($words作为$word){ $query->bind_参数('s',$word); $query->execute(); } } }

mysql_close();


谢谢大家

您可以使用RSS阅读器类,例如

它的使用非常简单:

include("./files_includes/RSSReader.inc.php"); 
$rss = new RSSReader("http://www.php.net/news.rss");
参见上的示例

我真的不明白你为什么想把描述中的所有单词都分解掉,但是有了这个类,你可以这样做:

explode(' ',$rss->getItemDescription("rsstext",$i));

请注意,该类依赖于FeedReader类:-因此您也需要下载该类。

您需要以
('word1'),('word2'),…
形式的
VALUES
子句结束,类似的内容应该可以工作:

$string="This is a cat";
$arr=explode(' ',$string);
array_walk($arr, function(&$v,$i){ $v="('$v')"; }); //php5.3 syntax only, use create_function() otherwise

$values=implode(','$arr);
$query="INSERT INTO mytable(term) VALUES $values";

只要RSS提要是有效的XML,就可以使用PHP来实现这一点

下面是一个针对堆栈溢出的简单示例

返回如下结果集:

+------+----------+
| word | count(*) |
+------+----------+
| the  |      127 |
| i    |       90 |
| to   |       74 |
|      |       60 |
| a    |       59 |
| is   |       45 |
| in   |       44 |
| and  |       41 |
| it   |       38 |
| have |       31 |

etc ...

到目前为止你得到了什么?你能把你试过的贴出来吗?你不明白哪一部分,你想得到什么帮助?我不认为这里有很多人会为您编写整个代码,但如果您有更具体的问题,我们很乐意提供帮助。请确保您在开发中有错误报告。如果您没有使用mysqli,您需要首先捕获并确保它使用$con_sql=mysql_connect($host,$username,$password)或die(mysql_error())正确连接;然后使用mysql\u query($query,$con\u sql)而不是$query->execute(),因为$query不是一个对象,只是一个字符串。然后相应地封装$word参数,并删除行$query->bind_param('s',$word);如果仍然不起作用,请尝试在xml解析成_struct()后打印_r($values),并查看是否在页面上输出了一些内容。然后检查输出的数组结构,看看它是否根据foreach和命名值正确格式化。如果所有这些仍然不起作用,请在@mysql\u之前删除@before\u db并检查错误。谢谢Matt,这与我正在尝试做的非常相似。我对代码做了一点修改,因为我在MySQLi上遇到了问题,但它仍然不起作用。
<?php
$parser = xml_parser_create('UTF-8');
$values = array();
xml_parse_into_struct($parser, file_get_contents('feed.xml'), $values);

$db = new MySQLi('localhost', 'root');
$db->select_db('test');
$db->query('create table if not exists words (id int unsigned primary key auto_increment not null, word varchar(255) not null)');
$stmt = $db->prepare('insert into words (word) values(?)');

foreach ($values as $entry) {
    if ($entry['tag'] === 'SUMMARY') {
        $words = preg_split('/\s+/', strtolower(preg_replace('/[^A-Za-z\s]+/', '', strip_tags($entry['value']))));
        foreach ($words as $word) {
            $stmt->bind_param('s', $word);
            $stmt->execute();
        }
    }
}
select word, count(*) from words
group by word
order by count(*) desc
+------+----------+
| word | count(*) |
+------+----------+
| the  |      127 |
| i    |       90 |
| to   |       74 |
|      |       60 |
| a    |       59 |
| is   |       45 |
| in   |       44 |
| and  |       41 |
| it   |       38 |
| have |       31 |

etc ...