• 24-07-2010, 09:45:25
    #1
    Merhaba arkdaşlar. Bir fonksiyon hazırladım. Çalışıyor ama tam olarak düşündüğüm gerçekleşmiyor.

    Bu bir RSS'den bilgi alma fonksiyonu. Kısaca şunları yapmaya çalışıyorum:

    1. birden fazla (10-15 tane felan) rss i dizi içine alıp,
    2. dizideki toplam rss sayısını buluyor ve alınan bu sayı kadar her bir rss URLsinden gelen verilerdeki (xml'den) title ve link elementlerini bulup,
    3. Eğer bu verilerden link verilerinin aynısı veri tabanında varsa kaydetme, yoksa kaydet.


    Ama şu şekilde sorunlu.

    1. tüm verileri çekip sadece en son rss URLsindeki verilerin veritabanında olup olmadığını kontrol ediyor, önceki 9 url den gelen veri veritabanında olmasada pass geçip kaydetmiyor.
    2. Gelen verilerin veritabanında olup olmadığını yanlış test ettiğimi düşünüyorum


    Bu fonksiyonu doğru yazmama yardımcı olursanız çok sevinirim. Anladığım kadarıyla bir işlem kontrolü gibi bişi olması lazım.


    Yaptığım kod altta:

    function rss_getir() 
    	{ 
    		global $option;
    		
    		
    		$config =& JComponentHelper::getParams( 'com_bilesenadi' );
    		$load_rss_url = $config->get( 'load_rss_url' );
    		$divided_rss_names = explode(',',$load_rss_url);
    		$rss_quantity = count($divided_rss_names);
    
    		$doc = new DOMDocument();
    
    	for($i=0; $i<$rss_quantity; $i++)
    	{ 
    
    	
    		$doc->load( 'http://www.siteadi.com/rss/'.$divided_rss_names[$i].'.html' );
        	$items = $doc->getElementsByTagName( "item" );
    		
    			foreach( $items as $item )
    			{
    	
    			$titles = $item->getElementsByTagName( "title" );
    			$links = $item->getElementsByTagName( "link" );
    
    			$ex_title = substr($titles->item(0)->nodeValue,0,4);
    			$title =  explode($ex_title,$titles->item(0)->nodeValue);
    			$links = trim($links->item(0)->nodeValue);
    	
    			$like = mysql_query("SELECT url FROM tablo WHERE url LIKE '%$links%' ");
    			
    				while ($row = mysql_fetch_assoc($like)) 
    				{
    					$aa = $like;
    				}
    			
    							if ( empty($aa) ) 
    							{
    							$sql = "INSERT INTO tablo VALUES ('','$title[1]', '$links', '1')";
    							@mysql_query($sql);
    							} 
    			}
    
    	}
    
    		$this->setRedirect( 'index.php?option=' . $option );
    	
    	}
  • 24-07-2010, 10:04:10
    #2
    kontrol için ayrı bir fonksiyon yaz tabi bakmadım kodlamana ama mantıken daha sağlıklı olur ilk önce hepsini kontrol ettir sonra gerekn işlemleri yaptır... fikir için konuşuyorum sadece kolay gelsin
  • 24-07-2010, 10:21:41
    #3
    Teşekkürler @ByTriSLaSiS. Oyle denyeceğim bakalım. Çözmeliyim bu işi.
  • 24-07-2010, 14:10:07
    #4
    Beceremedim bu işi Help..
  • 24-07-2010, 19:24:09
    #5
    BEn biraz çalıştım. Arama mantığını aşağıdaki şekilde değiştirdim. Bu sefer doğru şekilde kaydediyor. Sadece veritabanında olmayanlar kaydoluyor. Ama birden fazla rss çekildiği zaman aynı şekilde son rss veritabanına kaydediyor. Öncekileri kaydetmiyor.

    Tek bir rss adresinden veri alırken sorun yok. Ama çoklu olduğunda olmuyor.
    Yardımınıza ihtiyaç var.

    function rss_getir() 
    	{ 
    		global $option;
    	
    	  $database =& JFactory::getDBO();
    	  $sql = 'SELECT url FROM tablo';
    	  $database->setQuery( $sql );
    	  $last_50_urls_in_database = $database->loadResultArray();
    
    		
    		$config =& JComponentHelper::getParams( 'com_bilesenadi' );
    		$load_rss_url = $config->get( 'load_rss_url' );
    		$divided_rss_names = explode(',',$load_rss_url);
    		$rss_quantity = count($divided_rss_names);
    
    		$doc = new DOMDocument();
    
    	for($i=0; $i<$rss_quantity; $i++)
    	{ 
    
    	
    		$doc->load( 'http://www.site.com/rss/'.$divided_rss_names[$i].'.html' );
        	$items = $doc->getElementsByTagName( "item" );
    		
    			foreach( $items as $item )
    			{
    	
    			$titles = $item->getElementsByTagName( "title" );
    			$links = $item->getElementsByTagName( "link" );
    
    			$ex_title = substr($titles->item(0)->nodeValue,0,4);
    			$title =  explode($ex_title,$titles->item(0)->nodeValue);
    			$links = trim($links->item(0)->nodeValue);
    			
    				
    					// Search values in Database, if no...
    					 if ( !in_array($links, $last_50_urls_in_database) ) {
    						
    							// Save values into database
    							$save_sql = "INSERT INTO tablo VALUES ('','$title[1]', '$links', '1')";
    							@mysql_query($save_sql);
    					}  
    
    			} 
    			
    	}
    
    		$msg = 'Items have been saved.';
    		
    		$this->setRedirect( 'index.php?option=' . $option, $msg );
    		
    		
    	
    	}
  • 24-07-2010, 22:59:09
    #6
    Üyeliği durduruldu
    function rss_getir() 
        { 
            global $option;
            
            
            $config =& JComponentHelper::getParams( 'com_bilesenadi' );
            $load_rss_url = $config->get( 'load_rss_url' );
            $divided_rss_names = explode(',',$load_rss_url);
            $rss_quantity = count($divided_rss_names);
    
            $doc = new DOMDocument();
    
        for($i=0; $i<$rss_quantity; $i++)
        { 
    
        
            $doc->load( 'http://www.siteadi.com/rss/'.$divided_rss_names[$i].'.html' );
            $items = $doc->getElementsByTagName( "item" );
            
                foreach( $items as $item )
                {
        
                $titles = $item->getElementsByTagName( "title" );
                $links = $item->getElementsByTagName( "link" );
    
                $ex_title = substr($titles->item(0)->nodeValue,0,4);
                $title =  explode($ex_title,$titles->item(0)->nodeValue);
                $links = trim($links->item(0)->nodeValue);
        
                $like = mysql_query("SELECT url FROM tablo WHERE url LIKE '%$links%' ");
                
    
                 if (mysql_num_rows($like) == 0) {
                                $sql = "INSERT INTO tablo VALUES ('','$title[1]', '$links', '1')";
                                @mysql_query($sql);
                                                           }
                }
    
        }
    
            $this->setRedirect( 'index.php?option=' . $option );
        
        }
  • 25-07-2010, 00:08:52
    #7
    keops hocam. 2 rss aldım. bu şekilde yaptığımızda (sizin verdiğiniz kodla yani) 1. rss in hepsi, 2 rss in de sadece son kaydını kaydediyor Daha sonrada fonksiyonu tekrar çalıştırdığımda bişey kaydetmiyor.
  • 25-07-2010, 09:51:22
    #8
    kodlar şu şekildeyken:

    function rss_getir() 
        { 
            global $option;
        
          $database =& JFactory::getDBO();
          $sql = 'SELECT url FROM tablo';
          $database->setQuery( $sql );
          $urls_in_database = $database->loadResultArray();
    
            
            $config =& JComponentHelper::getParams( 'com_bilesenadi' );
            $load_rss_url = $config->get( 'load_rss_url' );
            $divided_rss_names = explode(',',$load_rss_url);
            $rss_quantity = count($divided_rss_names);
    
            $doc = new DOMDocument();
    
        for($i=0; $i<$rss_quantity; $i++)
        { 
    
        
            $doc->load( 'http://www.site.com/rss/'.$divided_rss_names[$i].'.html' );
            $items = $doc->getElementsByTagName( "item" );
            
               
                foreach( $items as $item )
                {
                 echo $item; // içerik var mı?
                $titles = $item->getElementsByTagName( "title" );
                $links = $item->getElementsByTagName( "link" );
    
                $ex_title = substr($titles->item(0)->nodeValue,0,4);
                $title =  explode($ex_title,$titles->item(0)->nodeValue);
                $links = trim($links->item(0)->nodeValue);
                
                    
                        // Search values in Database, if no...
                         if ( !in_array($links, $urls_in_database) ) {
                      
                                // Save values into database
                                $save_sql = "INSERT INTO tablo VALUES ('','$title[1]', '$links', '1')";
                                @mysql_query($save_sql);
                        }  
       
    
                } 
                
        }
    
            $msg = 'Items have been saved.';
            
            $this->setRedirect( 'index.php?option=' . $option, $msg );
            
            
        
        }
    kontrol ediyorum. Veritabanında kayıtlı olmayanları doğru şekilde görebiliyorum. Ama kaydolmuyor.

    if ( !in_array($links, $urls_in_database) ) {
                          echo $links;// Bu şekilde veritabanında kayıtlı olmayanları doğru şekilde görebiliyorum
                                
                                $save_sql = "INSERT INTO tablo VALUES ('','$title[1]', '$links', '1')";
                                @mysql_query($save_sql);
                        }
    $urls_in_database = $database->loadResultArray();
    $urls_in_database normalde çıktısı aşağıdaki şekilde: (Not: kafa karıştırmasın diye $last_50_urls_in_database yi $urls_in_database olarak değiştirdim.)


    Array
    (
        [0] => http://www.site.com/abc1.html
        [1] => http://www.site.com/abc2.html
        [2] => http://www.site.com/abc3.html
        [3] => http://www.site.com/abc4.html
        [4] => http://www.site.com/abc5.html
        [5] => http://www.site.com/abc6.html
        [6] => http://www.site.com/abc7.html
        [7] => http://www.site.com/abc8.html
        [8] => http://www.site.com/abc9.html
        [9] => http://www.site.com/abc10.html
        [10] => http://www.site.com/abc11.html
        [11] => http://www.site.com/abc12.html
    )
    $linksdeğişkenin de çıktısı da if ( !in_array($links, $urls_in_database) ) { içindeyken şu şekilde:

    http://www.site.com/zdpre1.html
    http://www.site.com/zdpre2.html
    http://www.site.com/zdpre3.html
    http://www.site.com/zdpre4.html
    http://www.site.com/zdpre5.html
    http://www.site.com/zdpre6.html
    http://www.site.com/zdpre7.html
    http://www.site.com/zdpre8.html
    http://www.site.com/zdpre9.html
    sanırım sayma ile ilgili bir sorun var. yukardaki $i++ değişkeni ile ilgili olabilir. Ama emin değilim.

    in_array içinde $links çıktısı bana veritabanında olmayanları veriyor ama kaydetmiyor.
  • 25-07-2010, 18:06:54
    #9
    Bu konuyu uzun süren bir çalışma ve gayret sonrasında çözdüm. Bir çok yöntemle verileri karşılaştırabilmeme rağmen ve doğru sonucu almama rapmen veritabanına kaydedetmemesinin sebebi title ile gelen verinin içinde tek tırnak ( ' ) olmasından kaynaklanıyormuş. str_replace ile değiştirince o karakteri 2 günlük maceram son bulmuş oldu.

    bana baya pahalıya mal oldu. Sizlerin de benzer bir konuda bunu yaşamamanız için buraya yazmak istedim.

    @Keops, @ByTriSLaSiS, size de yardımlarınız için teşekkür ederim.