Foros del Web » Programando para Internet » PHP »

cuando getElementsByTagName esta vacia me da error

Estas en el tema de cuando getElementsByTagName esta vacia me da error en el foro de PHP en Foros del Web. Me da Fatal error: Call to a member function getAttribute() on a non-object in C:\Users\User\Documents\ElCapitolio\pruebas\notisi stema.php on line 45 la linea 45 dice $audio = ...
  #1 (permalink)  
Antiguo 14/01/2013, 15:19
Avatar de Capimaster  
Fecha de Ingreso: agosto-2004
Mensajes: 494
Antigüedad: 20 años, 3 meses
Puntos: 2
cuando getElementsByTagName esta vacia me da error

Me da Fatal error: Call to a member function getAttribute() on a non-object in C:\Users\User\Documents\ElCapitolio\pruebas\notisi stema.php on line 45

la linea 45 dice
$audio = $peliculas->item($i)->getElementsByTagName('audio')->item(0)->getAttribute('src');

El problema es que no siempre esta definida esa etiqueta
intente hacer un if (isset($audio = $peliculas->item($i)->getElementsByTagName('audio')->item(0)->getAttribute('src')))

pero de todos modos en la comprobacion me da el mismo error... soy nuevo con esto.. alguien me puede ayudar un poco.. muchas gracias!
__________________
http://www.elcapitolio.com.mx - Ocotlán, Jalisco, México
  #2 (permalink)  
Antiguo 14/01/2013, 15:23
Avatar de informacionsys  
Fecha de Ingreso: mayo-2011
Ubicación: Bogota D.C
Mensajes: 793
Antigüedad: 13 años, 6 meses
Puntos: 76
Respuesta: cuando getElementsByTagName esta vacia me da error

hola

que intentas hacer ???
  #3 (permalink)  
Antiguo 14/01/2013, 15:31
Avatar de Capimaster  
Fecha de Ingreso: agosto-2004
Mensajes: 494
Antigüedad: 20 años, 3 meses
Puntos: 2
Respuesta: cuando getElementsByTagName esta vacia me da error

Extraer las noticias de este sitio http://www.notisistema.com/noticias/?x=0&y=0&s=ocotlan

Código PHP:
Ver original
  1. <script type="text/javascript" src="../dewplayer/swfobject.js"></script>
  2. <?php
  3. date_default_timezone_set('America/Mexico_City');
  4.  
  5. /**
  6.  * Clase para actuar como logger
  7.  *
  8.  * @author Christopher Valderrama
  9.  */
  10. class Logger {
  11.     private $handle;
  12.  
  13.     public function __construct($logFile, $append = false)
  14.     {
  15.         $mode = ($append) ? 'a' : 'w';
  16.         $this->handle = fopen($logFile, $mode);
  17.     }
  18.  
  19.     public function log($info)
  20.     {
  21.         $str = "[" . date("Y/m/d h:i:s", time()) . "] " . $info . "\r\n";
  22.         fwrite($this->handle, $str);
  23.     }
  24.  
  25.     public function __destruct()
  26.     {
  27.         fclose($this->handle);
  28.     }
  29. }
  30.  
  31. $log = new Logger('log.txt', true);
  32. $log->log('algo');
  33.  
  34.  
  35. $doc = new DOMDocument();
  36. $doc->loadHTMLFile('http://www.notisistema.com/noticias/?x=0&y=0&s=ocotlan');
  37. $xpath = new DOMXPath($doc);
  38. $peliculas = $xpath->query('//div[@class="post"]');
  39. ?>
  40. <div style="width:1200px;">
  41.  <?php
  42. for ($i = 0; $i < 6; $i++) {
  43.     $titulo = $peliculas->item($i)->getElementsByTagName('a')->item(0)->nodeValue;
  44.     $cuerpo = $peliculas->item($i)->getElementsByTagName('p')->item(1)->nodeValue;
  45.     $audio = $peliculas->item($i)->getElementsByTagName('audio')->item(0)->getAttribute('src');
  46.     echo "<div style='width:570px; margin:10px; height:340px; float:left; padding:5px; background:#cc092f;   -webkit-border-radius: 8px;    -moz-border-radius: 8px;    border-radius: 8px;'>";
  47.     echo "<div style='font-size:22px;'>".utf8_decode($titulo)."</div>";
  48.     echo '<div id="dewplayer_content">
  49.                 <object data="../dewplayer/dewplayer.swf" width="200" height="20" name="dewplayer" id="dewplayer" type="application/x-shockwave-flash">
  50.                 <param name="movie" value="dewplayer.swf" />
  51.                 <param name="flashvars" value="mp3='.$audio.'" />
  52.                 <param name="wmode" value="transparent" />
  53.                 </object>
  54.             </div>';
  55.     echo "<p><div style='width:565px; color:#23fbe4; font-size:18px;'>".utf8_decode($cuerpo)."</div></p>";
  56.     echo "<div class='clear'></div>";
  57.     echo "</div>";
  58.  }
  59. ?>
  60. </div>
  61. <div style="clear:both;"></div>
__________________
http://www.elcapitolio.com.mx - Ocotlán, Jalisco, México
  #4 (permalink)  
Antiguo 14/01/2013, 15:39
Avatar de informacionsys  
Fecha de Ingreso: mayo-2011
Ubicación: Bogota D.C
Mensajes: 793
Antigüedad: 13 años, 6 meses
Puntos: 76
Respuesta: cuando getElementsByTagName esta vacia me da error

Y por que no mejor simplemente lees los RSS

http://www.notisistema.com/serviciorss.php
  #5 (permalink)  
Antiguo 14/01/2013, 15:41
Avatar de Capimaster  
Fecha de Ingreso: agosto-2004
Mensajes: 494
Antigüedad: 20 años, 3 meses
Puntos: 2
Respuesta: cuando getElementsByTagName esta vacia me da error

por que eso me daria noticias de todo el pais.. y yo solo estoy filtrando la palabra ocotlan y no tiene su propio feed esa palabra

ademas en el feed no puedo extraer el audio de la noticia
__________________
http://www.elcapitolio.com.mx - Ocotlán, Jalisco, México
  #6 (permalink)  
Antiguo 14/01/2013, 15:45
Avatar de informacionsys  
Fecha de Ingreso: mayo-2011
Ubicación: Bogota D.C
Mensajes: 793
Antigüedad: 13 años, 6 meses
Puntos: 76
Respuesta: cuando getElementsByTagName esta vacia me da error

Y si lo prueba asi, lees los RSS normal pero le pasas ademas el parametro que dices

por ejemplo

http://www.notisistema.com/noticias/...rtes&s=ocotlan
  #7 (permalink)  
Antiguo 14/01/2013, 15:46
Avatar de zalito12  
Fecha de Ingreso: noviembre-2011
Ubicación: Coruña, España
Mensajes: 430
Antigüedad: 13 años
Puntos: 67
Respuesta: cuando getElementsByTagName esta vacia me da error

Cita:
Iniciado por Capimaster Ver Mensaje
El problema es que no siempre esta definida esa etiqueta
intente hacer un if (isset($audio = $peliculas->item($i)->getElementsByTagName('audio')->item(0)->getAttribute('src')))

pero de todos modos en la comprobacion me da el mismo error... soy nuevo con esto.. alguien me puede ayudar un poco.. muchas gracias!
Creo que tú intento está bien pensado pero mal planteado, prueba esto:
Código PHP:
if (isset($audio $peliculas->item($i)->getElementsByTagName('audio')->item(0)))
      
$audio $audio->getAttribute('src');
else
      echo 
'No hay noticias'
Si no te va con un isset prueba con un empty
  #8 (permalink)  
Antiguo 14/01/2013, 15:53
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 13 años, 4 meses
Puntos: 793
Respuesta: cuando getElementsByTagName esta vacia me da error

Comprueba primero que exista una etiqueta audio en esa noticia, usando length:

Código PHP:
Ver original
  1. if ($peliculas->item($i)->getElementsByTagName('audio')->length > 0) {
  2.         $audio = $peliculas->item($i)->getElementsByTagName('audio')->item(0)->getAttribute('src');
  3. }

Define al inicio del bucle la variable audio $audio = '';

Edito: Tendrás que usar otra condición si no quieres que te salgan los MP3 vacíos.

Saludos.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP

Última edición por andresdzphp; 14/01/2013 a las 16:08
  #9 (permalink)  
Antiguo 14/01/2013, 16:12
Avatar de Capimaster  
Fecha de Ingreso: agosto-2004
Mensajes: 494
Antigüedad: 20 años, 3 meses
Puntos: 2
Respuesta: cuando getElementsByTagName esta vacia me da error

CORRECCION YA TE ENTENDI...
Era ponerlo dentro del bucle pero al principio, jeje!!!
yo lo habia puesto fuera


Lo he puesto de la siguiente manera y funciona bien... lo que ya no se me ocurrio que hacer... cada que se recorre pone el mismo archivo de audio obvio por que lo definimos fuera del bucle.. que me recomiendas hacer aqui para sacar el audio de cada nota.. en caso de que exista claro!

Código PHP:
<?php 
 
 
if ($peliculas->item($i)->getElementsByTagName('audio')->length 0) {
        
$audio $peliculas->item($i)->getElementsByTagName('audio')->item(0)->getAttribute('src');
}
for (
$i 0$i 12$i++) {
    
$titulo $peliculas->item($i)->getElementsByTagName('a')->item(0)->nodeValue;
    
$cuerpo $peliculas->item($i)->getElementsByTagName('p')->item(1)->nodeValue;
    echo 
"<div style='width:570px; margin:10px; height:340px; float:left; padding:5px; background:#cc092f;   -webkit-border-radius: 8px;    -moz-border-radius: 8px;    border-radius: 8px;'>";
    echo 
"<div style='font-size:22px;'>".utf8_decode($titulo)."</div>";
    echo 
'<div id="dewplayer_content">
                <object data="../dewplayer/dewplayer.swf" width="200" height="20" name="dewplayer" id="dewplayer" type="application/x-shockwave-flash">
                <param name="movie" value="dewplayer.swf" />
                <param name="flashvars" value="mp3='
.$audio.'" />
                <param name="wmode" value="transparent" />
                </object>
            </div>'
;
    echo 
"<p><div style='width:565px; color:#23fbe4; font-size:18px;'>".utf8_decode($cuerpo)."</div></p>";
    echo 
"<div class='clear'></div>";
    echo 
"</div>";
 }
?>
__________________
http://www.elcapitolio.com.mx - Ocotlán, Jalisco, México

Última edición por Capimaster; 14/01/2013 a las 16:14 Razón: correccion
  #10 (permalink)  
Antiguo 14/01/2013, 16:15
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 13 años, 4 meses
Puntos: 793
Respuesta: cuando getElementsByTagName esta vacia me da error

La condición debe ir dentro del bucle for, en este orden:

Código PHP:
Ver original
  1. for ($i = 0; $i < 6; $i++) {
  2.     $audio = '';
  3.     $titulo = $peliculas->item($i)->getElementsByTagName('a')->item(0)->nodeValue;
  4.     $cuerpo = $peliculas->item($i)->getElementsByTagName('p')->item(1)->nodeValue;
  5.     if ($peliculas->item($i)->getElementsByTagName('audio')->length > 0) {
  6.         $audio = $peliculas->item($i)->getElementsByTagName('audio')->item(0)->getAttribute('src');
  7.     }
  8.  
  9. // etc etc

y donde imprimes el audio compruebas:

Código PHP:
Ver original
  1. if ($audio != '') {
  2. echo 'audio blablabla';
  3. }
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP

Etiquetas: vacias
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 11:36.