Foros del Web » Programando para Internet » PHP »

Importar Rss a MySql

Estas en el tema de Importar Rss a MySql en el foro de PHP en Foros del Web. Buenas a todos, estoy intentando importar desde un Rss a una Base de Datos MySql, llegué a un punto en que estoy bloqueado y no ...
  #1 (permalink)  
Antiguo 10/10/2010, 11:10
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Exclamación Importar Rss a MySql

Buenas a todos,
estoy intentando importar desde un Rss a una Base de Datos MySql, llegué a un punto en que estoy bloqueado y no le encuentro la vuelta.

El php, lee y extrae los datos del Rss correctamente (como ejemplo estoy usando los feed del Foro HTML de Foros del Web), sin embargo, cuando hago el insert, no consigo que se agregue a la BD más que un solo registro, exactamente el último, el más antiguo. No sé que se me está pasando por alto

el php

Código PHP:
Ver original
  1. <?php
  2. include('cnx.php'); // parametros de conexión a BD
  3. $rssUrl = 'http://www.forosdelweb.com/external.php?type=RSS2&forumids=4';
  4.  $documento = new DOMDocument();
  5.  $documento->load($rssUrl);
  6.  $arrayRss = array();
  7.  foreach ($documento->getElementsByTagName('item') as $nodo) {
  8.   $itemRSS = array (
  9.    'title' => $nodo->getElementsByTagName('title')->item(0)->nodeValue,
  10.    'desc' => $nodo->getElementsByTagName('description')->item(0)->nodeValue,
  11.    'link' => $nodo->getElementsByTagName('link')->item(0)->nodeValue,
  12.    'date' => $nodo->getElementsByTagName('pubDate')->item(0)->nodeValue
  13.    );
  14.   array_push($arrayRss, $itemRSS);
  15. //echo "<pre>";
  16.   //print_r($arrayRss);
  17. //echo "</pre>";
  18.   foreach($arrayRss as $arrayItem)
  19.   {
  20.   $title = $arrayItem['title'];
  21.   $desc = $arrayItem['desc'];
  22.   $link = $arrayItem['link'];
  23.   $date = $arrayItem['date'];
  24.   }
  25.  
  26. // la salida en pantalla muestra todos los registros
  27. // por lo que el foreach me esta recorriendo perfectamente los items
  28. // del Rss
  29. echo "<p><span class='tit'>$title</span> - <a href='$link'>detalles</a></p><p>Descripción:<br />$desc<br /><br />$date</p><hr />";
  30.  
  31. // sin embargo esto solo me hace el insert del último item
  32. $sql="INSERT INTO rss (title,description,link,pubdate) VALUES ('$title','$desc','$link','$date')";
  33.  }
  34.  
  35.  if (!mysql_query($sql,$conec_bd))
  36.  {
  37.   die('Error: ' . mysql_error());
  38.  }
  39.      mysql_close($conec_bd);
  40. ?>


la estructura de la tabla vacia

Código SQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `rss` (
  2.   `id` INT(11) NOT NULL AUTO_INCREMENT,
  3.   `title` VARCHAR(200) NOT NULL,
  4.   `description` text NOT NULL,
  5.   `link` VARCHAR(200) NOT NULL,
  6.   `pubdate` VARCHAR(50) NOT NULL,
  7.   PRIMARY KEY (`id`)
  8. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


aquí les dejo una demo funcionando imprimiendo en pantalla los items del Rss del Foro HTML de foros del Web ( http://www.forosdelweb.com/external....SS2&forumids=4 )

La demo está en
http://foros.emprear.com/php/rss-mysql/importar.php


MySql no es mi fuerte, por ahi se me esta pasando algo que permita hacer inserts múltiples, si algún experto me da la respuesta, desde ya gracias

Saludos


la porrista me saca
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #2 (permalink)  
Antiguo 11/10/2010, 06:04
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: Importar Rss a MySql

La posición del insert es incorrecta para las variables que estás tomando, prueba esto:

Código PHP:
<?php

include('cnx.php'); // parametros de conexión a BD
$rssUrl 'http://www.forosdelweb.com/external.php?type=RSS2&forumids=4';
$documento = new DOMDocument();
$documento->load($rssUrl);
$arrayRss = array();
foreach (
$documento->getElementsByTagName('item') as $nodo) {
    
$itemRSS = array (
    
'title' => $nodo->getElementsByTagName('title')->item(0)->nodeValue,
    
'desc' => $nodo->getElementsByTagName('description')->item(0)->nodeValue,
    
'link' => $nodo->getElementsByTagName('link')->item(0)->nodeValue,
    
'date' => $nodo->getElementsByTagName('pubDate')->item(0)->nodeValue
    
);
    
array_push($arrayRss$itemRSS);
    
//echo "<pre>";
    //print_r($arrayRss);
    //echo "</pre>";
    
foreach($arrayRss as $arrayItem)
    {
        
$title $arrayItem['title'];
        
$desc $arrayItem['desc'];
        
$link $arrayItem['link'];
        
$date $arrayItem['date'];

        
$sql="INSERT INTO rss (title,description,link,pubdate) VALUES ('$title','$desc','$link','$date')";
        if (!
mysql_query($sql,$conec_bd))die('Error: ' mysql_error());
    }

    
// la salida en pantalla muestra todos los registros
    // por lo que el foreach me esta recorriendo perfectamente los items
    // del Rss
    
echo "<p><span class='tit'>$title</span> - <a href='$link'>detalles</a></p><p>Descripción:<br />$desc<br /><br />$date</p><hr />";

    
// sin embargo esto solo me hace el insert del último item

}

mysql_close($conec_bd);

?>
saludos
  #3 (permalink)  
Antiguo 11/10/2010, 06:18
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años
Puntos: 1517
Respuesta: Importar Rss a MySql

Lo que debes hacer es colocar el insert dentro del foreach para que mientras vaya recorriendo vaya ingresando la información.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #4 (permalink)  
Antiguo 11/10/2010, 09:20
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: Importar Rss a MySql

Les cuento, si ven bien, hay dos foreach, uno dentro del otro, puesto el INSERT dónde me sugirió repara2, consegui agregar registros, pero en lugar de los 15 (es el numero de salida real del Rss de foros del Web), se crearon 120. no fue la solución .pero me dio la pista.

el lugar correcto del INSERT es dentro del foreach() primario, como estaba originalmente, pero ahí tambien tiene que ir el condicional por si no se cumple mysql_query .

Además tenia el problema que los datos recogidos no estaban correctamente filtrados para agregarlos a la base de tados, yo me concentraba en la "descripción" de cada item y limpiaba eso, pero me di cuenta de que algunos usuarios habían utilizados caracteres (', "; etc.) en el mismo título lo que producía un error en la sintáxis del SQL.

finalmente la script debe quedar
Código PHP:
Ver original
  1. <?php
  2. include('cnx.php'); // parametros de conexión a BD
  3. $rssUrl = 'http://www.forosdelweb.com/external.php?type=RSS2&forumids=18';
  4.  $documento = new DOMDocument();
  5.  $documento->load($rssUrl);
  6.  $arrayRss = array();
  7.  foreach ($documento->getElementsByTagName('item') as $nodo) {
  8.   $itemRSS = array (
  9.    'title' => $nodo->getElementsByTagName('title')->item(0)->nodeValue,
  10.    'desc' => $nodo->getElementsByTagName('description')->item(0)->nodeValue,
  11.    'link' => $nodo->getElementsByTagName('link')->item(0)->nodeValue,
  12.    'date' => $nodo->getElementsByTagName('pubDate')->item(0)->nodeValue
  13.    );
  14.   array_push($arrayRss, $itemRSS);
  15. //echo "<pre>";
  16.   //print_r($arrayRss);
  17. //echo "</pre>";
  18.  
  19. ######### quitamos comas, comillas simples y dobles de todos los datos recogidos
  20. $e = "'";
  21.   foreach($arrayRss as $arrayItem)
  22.   {
  23.   $title = $arrayItem['title'];
  24.   $title2 = str_replace(array(',', '"', $e), '', $title);
  25.  
  26.   $desc = strip_tags($arrayItem['desc']);
  27.   $desc2 = str_replace(array(',', '"', $e), '', $desc);
  28.  
  29.   $link = $arrayItem['link'];
  30.   $link2 = str_replace(array(',', '"', $e), '', $link);
  31.  
  32.   $date = $arrayItem['date'];
  33.   }
  34. $sql="INSERT INTO rss (title,description,link,pubdate) VALUES ('$title2','$desc2','$link2','$date')";
  35. if (!mysql_query($sql,$conec_bd)){die('Error: ' . mysql_error());}
  36. echo "<p><span class='tit'>$title2</span> - <a href='$link'>detalles</a></p><p>Descripción:<br />$desc2<br /><br />$date</p><hr />";
  37.  
  38.  }
  39.  mysql_close($conec_bd);
  40. ?>

Gracias colegas por la ayuda

saludos



para la más sexy del foro
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.

Etiquetas: mysql, rss
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:18.