• 17-09-2014, 14:24:41
    #1
    Merhaba Arkadaşlar,

    Bir fiyat karşılaştırma sitesi yapıyorum ve kayıtlı mağazaların ürünlerini bir bot yardımı ile fiyatlarını ve ürün adını teklif olarak siteme ekliyorum ve şuanda uğraştığım şey karşıdaki site ile kendi web sitemdeki verilerde eşleşme yapmak istiyorum yani kısaca şöyle izah edim;

    Örnek Olarak TeknoSA sitesini gösteriyorum ama eğer reklam olarak görürseniz silebilirim,

    Örnek Sayfa: http://www.teknosa.com/urunler/125071222/samsung-g900fq-galaxy-s5-16gb-white-akilli-telefon
    adresindeki ürün adını çekiyorum

    Karşıdaki Sitede Ürünün Adı: SAMSUNG G900FQ GALAXY S5 16GB WHITE AKILLI TELEFON
    bu ürün benim veritabanımda

    Benim Sitemde Ürünün Adı: Samsung Galaxy S5
    olarak kayıtlı, arkadaşlar ben teknosa veya herhangi bir kayıtlı mağazamdan ürün adını çekip nasıl bir şey yapmalıyım ki bu benim sitemdeki ürün ile eşleşsin.

    LIKE komutu ile veritabanından arama yapmayı denedim ama olmuyor bazı kelimelerin toplamından sanırım sonuç elde etmem gerekiyor ama bulamadım böyle bir konu

    Araştırmalarıma rağmen bir türlü bulamadım cevabı. Yardımlarınız için şimdiden teşekkür ederim. İyi günler...
  • 17-09-2014, 17:19:04
    #2
    Arkadaşlar aşağıdaki gibi bir kod buldum ama olmuyor
       $ara= $urun_adi;
    	$parcala=explode(" ",$ara);
    	$sor="select * from urunler where urun_adi LIKE ";
    	for ($i=0;$i<count($parcala)-1;$i++){
    		$sor.="%$parcala[$i]%' or urun_adi LIKE ";
    	}
    	$sor.="'%$parcala[$i]%'";
    	$sorgu=mysql_query($sor);
    	if (empty($ara)){
    		echo 'Arama alanını boş bıraktın.';
    	}else{
    		if (@mysql_num_rows($sorgu)>0){
    			while($kayit=mysql_fetch_array($sorgu)){
    				echo $kayit["urun_adi"];
    				echo '<br/>';
    			}
    		}else{
    			echo 'Eşleşen Kayıt Yok.';
    		}
    	}
    yukarıdaki $urun_adi değişkenine gelen veri
    SAMSUNG G900FQ GALAXY S5 16GB WHITE AKILLI TELEFON
    bu veriyi explode ile bölüp birden fazla arama yaptıracağım ve en çok eşleşen kelimelere insert yaptıracağım henüz veriyi eşleştirmeye uğraşıyorum
    SAMSUNG
    kelimesini yazınca yukarıdaki kodlar çalışıyor ama
    SAMSUNG G900FQ GALAXY S5 16GB WHITE AKILLI TELEFON
    veya
    SAMSUNG GALAXY
    yazdığımda parça parça arama yapmıyor yukarıdaki kodların bunu yapması lazım ama olmuyor kodlarda ne gibi sorun olabilir acaba?

    veya buna benzer bir kod verebilecek varmı arkadaşlar. Yapmak istediğim şey

    SAMSUNG G900FQ GALAXY S5 16GB WHITE AKILLI TELEFON
    yukarıdaki veya benzer bir yazıyı parçalayacak ve en çok eşleşen kelimelere göre 5 sonucu verecek insert işlemini ben hallederim yardımcı olabilecek varmı arkadaşlar?
  • 17-09-2014, 19:14:28
    #3
    Üyeliği durduruldu
    kendi ürün adınızı boşluklarla bölün.
    Samsung Galaxy S5
    Samsung
    Galaxy
    S5
    karşı sitedeki başlığı çekerek
    preg_match("/samsung/i",$veri);
    preg_match("/Galaxy/i",$veri);
    preg_match("/S5/i",$veri);
    Eğer bu bölüp 3 çıkan sonuçta
    if kullanarak $i++ kullanarak eğer sonuç 3 e eşitse ürün ismi ile kesin bir eşleşme olur.
    unutmayın preg_match("//i"); büyük veya küçük harf duyarsız arama yapar
  • 17-09-2014, 20:18:46
    #4
    Kimlik doğrulama veya yönetimden onay bekliyor.
    Kendine göre bir algoritma yazmalısın.
    Yapılacaklarını kağıt kalem alarak adım adım yaz ve şema çıkart gerekirse.
    İşi önce kafanda bitirirsen gerisi kolayca gelir.
    tolgatasci arkadaşın dediği gibi karşı siteden aldığın ürün başlığını, kelimelere bölerek başlamalısın.
    Kelimelere bölme işini explode ile aşağıdaki şekilde yapabilirsin;
    $baslik_pieces = explode(' ', $product_baslik);
    $baslik_pieces değişkenine başlıktaki tüm kelimeler bir array olarak sıralanır.
    Geliştireceğin algoritmayı bu array içine ayrılmış kelimeleri alıp kullanarak yapacaksın.
  • 17-09-2014, 20:32:44
    #5
    Merhaba cevaplarınız için teşekkür ederim
    $ara= $urun_adi;
    	$parcala=explode(" ",$ara);
    	$sor="select * from urunler where urun_adi LIKE ";
    	for ($i=0;$i<count($parcala)-1;$i++){
    		$sor.="%$parcala[$i]%' or urun_adi LIKE ";
    	}
    	$sor.="'%$parcala[$i]%'";
    	$sorgu=mysql_query($sor);
    	if (empty($ara)){
    		echo 'Arama alanını boş bıraktın.';
    	}else{
    		if (@mysql_num_rows($sorgu)>0){
    			while($kayit=mysql_fetch_array($sorgu)){
    				echo $kayit["urun_adi"];
    				echo '<br/>';
    			}
    		}else{
    			echo 'Eşleşen Kayıt Yok.';
    		}
    	}
    bu verdiğim kod zaten explode ile parçalayıp çıkan verileri for döngüsü ile parça parça araması gerekiyor ama sadece ilk kelimeyi arıyor iki kelime olduğu zaman eşleşme olmadığı değeri çıkıyor yani
    samsung
    yazdığım zaman verileri takır takır döküyor ama samsung kelimesinin yanına galaxy yazarsam mesela aramayı yapmıyor yukarıdaki kodlardaki problemi çözemedim bir türlü aklımdan bir şablon oluşturdum zaten şablona göre şöyle hareket edeceğim;
    • Uzak Siteden Ürün Adını, Ürün Fiyatını ve Ürünün Bulunduğu Tam Sayfa Çekilecek.
    • Daha Sonra Ürün Adı Explode ile Parçalara Bölünüp Kendi Sitemdeki Veritabanında Arama Yapacak
    • Eşleşen Ürünlere Teklif Olarak INSERT Edilecek
    • Insert Sonucu Benim Onayımla Doğru Eklendiyse Teklif Yayınlanacak, Yanlış Eklendiyse Düzenleme ile Doğru Ürüne UPDATE Edilecek
    Adımlar yukarıdaki gibi şimdi ikinci adımdayım uzak siteden çektiğim başlığı parçalara bölüp bir siteden bulduğum bu kodlar ile for döngüsü ile en çok eşleşen değerlere insert yaptırıcam. Kısaca forum sistemleri gibi düşünün içinde en alakalı kelimeler en üstte çıkıyor aynı mantığa çevirmek istiyorum ama işte bu kodlardaki sorun ne çözemedim sabahtan beri hala deniyorum. Tekrar teşekkür ederim arkadaşlar bir çözüm önerebilir misiniz?
  • 17-09-2014, 22:49:43
    #6
    viper_aykiri adlı üyeden alıntı: mesajı görüntüle
    Merhaba cevaplarınız için teşekkür ederim
    $ara= $urun_adi;
    	$parcala=explode(" ",$ara);
    	$sor="select * from urunler where urun_adi LIKE ";
    	for ($i=0;$i<count($parcala)-1;$i++){
    		$sor.="%$parcala[$i]%' or urun_adi LIKE ";
    	}
    	$sor.="'%$parcala[$i]%'";
    	$sorgu=mysql_query($sor);
    	if (empty($ara)){
    		echo 'Arama alanını boş bıraktın.';
    	}else{
    		if (@mysql_num_rows($sorgu)>0){
    			while($kayit=mysql_fetch_array($sorgu)){
    				echo $kayit["urun_adi"];
    				echo '<br/>';
    			}
    		}else{
    			echo 'Eşleşen Kayıt Yok.';
    		}
    	}
    bu verdiğim kod zaten explode ile parçalayıp çıkan verileri for döngüsü ile parça parça araması gerekiyor ama sadece ilk kelimeyi arıyor iki kelime olduğu zaman eşleşme olmadığı değeri çıkıyor yani
    samsung
    yazdığım zaman verileri takır takır döküyor ama samsung kelimesinin yanına galaxy yazarsam mesela aramayı yapmıyor yukarıdaki kodlardaki problemi çözemedim bir türlü aklımdan bir şablon oluşturdum zaten şablona göre şöyle hareket edeceğim;
    • Uzak Siteden Ürün Adını, Ürün Fiyatını ve Ürünün Bulunduğu Tam Sayfa Çekilecek.
    • Daha Sonra Ürün Adı Explode ile Parçalara Bölünüp Kendi Sitemdeki Veritabanında Arama Yapacak
    • Eşleşen Ürünlere Teklif Olarak INSERT Edilecek
    • Insert Sonucu Benim Onayımla Doğru Eklendiyse Teklif Yayınlanacak, Yanlış Eklendiyse Düzenleme ile Doğru Ürüne UPDATE Edilecek
    Adımlar yukarıdaki gibi şimdi ikinci adımdayım uzak siteden çektiğim başlığı parçalara bölüp bir siteden bulduğum bu kodlar ile for döngüsü ile en çok eşleşen değerlere insert yaptırıcam. Kısaca forum sistemleri gibi düşünün içinde en alakalı kelimeler en üstte çıkıyor aynı mantığa çevirmek istiyorum ama işte bu kodlardaki sorun ne çözemedim sabahtan beri hala deniyorum. Tekrar teşekkür ederim arkadaşlar bir çözüm önerebilir misiniz?

    Kodunu biraz inceledim ama bana karmaşık geldi.
    ama sanıyorum çapraz arama yapmamışsın.
    Tamamen mantık hatası var gibi görünüyor.
    Ben sıfırdan yazdım umarım işini görür.
    En çok eşleşme hangisindeyse onu buluyor ve gösteriyor.
    Benim yazdığım kodda en az 1 kelime bile eşleşse buluyor ama ufak değişiklikler yaparak(limit koyarak) en alâkalı 5 sonucu da buldurtabilirsin.
    Kodda istediğin kısımları kendine göre uyarlayabilirsin.
    Ayrıca kendi DB'n ile değiştirmeyi unutma.
    Örnek Demo: http://www.evdekorasyonblogu.com/eslestir/
    <?php
    
    
    function check_if_word_exists($word,$db_baslik){
    	$word_pieces = explode(' ', $word);
    	$db_baslik_pieces = explode(' ', $db_baslik);
    	
    	$num=0;
    	foreach($db_baslik_pieces as $db_piece){
    		foreach($word_pieces as $word_){
    			if($db_piece===$word_){$num++; break;}
    		}
    	}
    	if($num==0){return false;}else{return $num;}
    }
    
    function get_db_titles($table_name){//
    
    	$query = mysql_query("SELECT * FROM $table_name")or die($query."<br/><br/>".mysql_error());
    	if(mysql_num_rows($query)>0){
    		$urun_adlari=array();
    		while($row = mysql_fetch_array($query)){
    			$urun_adlari[]= $row['urun_adi'];		
    		}
    		return $urun_adlari;
    	}else{ return false;}
    
    }
    
    
    
    $aranacak_baslik=$_GET['urun']; //Kaynak siteden çekilen(aranacak) ürün başlığını bu değişkene yolla.
    //$db_urunler=get_db_titles('urunler');//Veritabanındaki ürün başlıklarını array içine yerleştir.
    
    //Bende veritabanı hazırda olmadığı için bu satırı ekledim. Sen üst satırdakiyle işlemini yapacaksın.
    $db_urunler=array('iphone 5', 'samsung galaxy s5', 'samsung galaxy s4', 'nokia bilmem ne', 'nokia lumnia 1536');
    var_dump($db_urunler);
    
    
    if(!$db_urunler){//Veritabanında karşılaştırılacak ürün bulunamadıysa hata ver.
    	echo "Veritabanında eşleştirilecek hiçbir ürün bulunamadı<br>";
    }else{//Aksi durum için aşağıdakileri yap;
    	foreach($db_urunler as $db_urun_adi){//Array içindeki ürün başlıklarını string'e çevir ve döngüye gir.
    		//$results=array();//results adında array değişken oluştur.
    		$num=check_if_word_exists($aranacak_baslik,$db_urun_adi);//Aranacak kelimeyi(kaynak sitedeki başlığı) sırayla db'dekilerle karşılaştır
    		if($num!=false){//Eğer en az eşleşen bir kelime bulunduysa,
    			$results[]=array($num,$db_urun_adi);
    			//var_dump($results);
    		}
    		
    	}
    	
    	if(isset($results)){
    				
    				echo "Aranan ürün: {$aranacak_baslik}<br><br>";
    		
    				$nums=array();
    				foreach($results as $key => $result){
    					$nums[]=$result[0];
    				}
    				
    				$max_matchednum=max($nums);
    				foreach($results as $key => $result){
    					if($result[0]==$max_matchednum){
    						echo "En fazla eşleşen({$result[0]} kelime eşleşti) veritabanındaki ürün adı: \"<strong>".$result[1]."</strong>\" dir.<br>";
    					}
    				}
    				//var_dump($results);//Eşleşenleri görmek için. İstersen kaldır.				
    
    	}else{
    		echo "Eşleşen hiçbir ürün bulunamadı!<br>";
    	}
    }
    
    
    ?>
  • 18-09-2014, 14:57:10
    #7
    Merhaba öncelikle çok teşekkür ederim kodlar sorunsuz bir şekilde tam istediğim gibi oturdu ama aramada hata var şöyle söyleyeyim

    TeknoSA sitesinden çektiğim veri
    SAMSUNG G900FQ GALAXY S5 16GB WHITE AKILLI TELEFON
    Bulduğu Sonuç
    En fazla eşleşen(2 kelime eşleşti) veritabanındaki ürün adı: "Todizoo AKILLI TELEFON" dir.
    En fazla eşleşen(2 kelime eşleşti) veritabanındaki ürün adı: "Fisher Price AKILLI TELEFON" dir.
    Bulması gereken ürün adı
    Samsung Galaxy S5
    Sanırım kelimeleri karma arama yapmıyor yani SAMSUNG G900FQ GALAXY S5 16GB WHITE AKILLI TELEFON başlığından G900FQ kelimesini ve 16 GB WHITE AKILLI TELEFON gibi kelimelerde elemeler yapmıyor acaba buna nasıl bir çözüm bulabilirim? Acaba büyük küçük harf ayırt ediyor olabilir mi? Bana öyle gibi geldi.

    --R10.NET; Flood Engellendi -->-> Yeni yazılan mesaj 14:57:10 -->-> Daha önceki mesaj 14:28:05 --

    aslında ek olarak şöyle yapılamazmı biliyorsunuz her üründe önce marka yazılır Samsung Galaxy S5 gibi veya Iphone 5S gibi düşünün acaba aramalarda önce ilk kelimeyi alsa sonra diğer kelimeleri arasa olmazmı acaba? böylece daha mantıklı sonuçlar elde etmezmiyim acaba?
  • 18-09-2014, 20:46:10
    #8
    Büyük küçük harfe duyarlı olduğu için yapıyor hocam.
    Denemedim ama yazdıklarına göre öyle anlaşılıyor.
    kelimelerin harf büyük/küçüklüğü belirttiğin gibi dimi ?
    Biraz beklersen düzeltme yapabilirim...

    Şu satırı bulup;
    if($db_piece==$word_){$num++; break;}
    Aşağıdakiyle değiştirmen yeterlidir hocam;
    if(strcasecmp($db_piece, $word_) == 0){$num++; break;}
    Bu şekilde yaptıktan sonra büyük/küçük harf ayırt etmeksizin eşleşen ürünleri bulacaktır.
    NOT: Büyük/küçük türkçe karakterlere dikkat etmelisin. örneğin kaynak aldığın sitede ürün adında "PHİLİPS" kelimesi(büyük i harfi) geçiyorsa ve senin veritabanında Philips olarak kaydedilmişse, eşleşme olmaz! Bunu şu şekilde çözebilirsin, veritabanından ürün adlarını çektikten sonra küçük i içeren ürün adlarını aynı zamanda büyük İ harfli olacak şekilde klonlayıp ürünleri karşılaştırmalısın php işlem süresi biraz artacak ama yapacak bişey yok. Gerçi profesyonel eticaret sitelerinin ürün adlarında büyük türkçe karakter yazacaklarını pek sanmıyorum ama yine de önlemini alacak ufak bir fonksiyon yazsan iyolur.

    viper_aykiri adlı üyeden alıntı: mesajı görüntüle
    aslında ek olarak şöyle yapılamaz mı biliyorsunuz her üründe önce marka yazılır Samsung Galaxy S5 gibi veya Iphone 5S gibi düşünün acaba aramalarda önce ilk kelimeyi alsa sonra diğer kelimeleri arasa olmazmı acaba? böylece daha mantıklı sonuçlar elde etmezmiyim acaba?
    Hocam güzel söylüyorsunuz da her üründe önce marka yazılacak diye bir kaide yok . yaptığın kodu buna göre yazarsan, marka ile başlayan ve başlamayanlar için gelecek sonuçlar saçmalayabilir. Aslında önceden marka veritabanı oluşturup ordan çekerek de bu dediğini yapabilirsin ama bence gerek yok neden dersen en fazla kelime eşleştiği ürün adını bulup getirmesi sistemin daha stabil çalışmasını sağlar diye düşünüyorum, sonuçta rakamsal olarak en fazla eşleşeni tespit edebiliyorsun benim yazdığım koddaki metodla. Senin kafanı karıştıran nokta büyük/küçük harfe duyarlı olmasıydı sanırsam. Şuan değişiklik yapıp tekrar deneme yaparsan dediklerine gerek olmadığını anlamış olursun.
  • 19-09-2014, 13:58:04
    #9
    Çok teşekkür ederim söylediğimiz gibiymiş takır takır döktü aradığımız şeyle benzer şeyleri her şey için sağolun burhan bey r10+ 1 kere verilebiliyor yoksa 100 tane versem az bile tekrar sağolun ben botu yazmaya devam edeyim.

    Bir şey daha, kodlarınız biraz değişik geldi ürünlerin id sinide ekleyebilir miyiz? yoksa çekilen başlık sonuçlarıyla tekrar veritabanında arama yaptırıp id çekmek zorunda kalacağım. Teşekkürler...