• 24-04-2013, 19:42:22
    #10
    koftee adlı üyeden alıntı: mesajı görüntüle
    Sinirlenmeye gerek yok, benimde php bilgim zayıf ama şöyle bir yöntem deneyebilirsiniz olur mu bilmiyorum.. Daha kesin ve pratik çözümü olan paylaşırsa çok sevinirim.

    $SQL1 = mysql_query("SELECT * from videolar group by etiketler LIMIT 0,10");
    while ($yaz = mysql_fetch_array($SQL1)){ 
    $parcala = explode(', ', $yaz["etiketler"]);
    $result = array_unique($parcala);
    
    $say = count($parcala);
    for($i=0; $i<$say; $i++){
    $etiketle = trim($result[$i]);
    $tr1=array('/ç/','/Ç/','/ı/','/İ/','/ğ/','/Ğ/','/ö/','/Ö/','/ş/','/Ş/','/ü/','/Ü/','/ /');
    $tr2=array('c','C','i','i','g','G','o','O','s','S','u','U','-');
    $etiketle = preg_replace($tr1,$tr2,$etiketle);
    echo ''.$etiketle.'<br/>'; 
    }
    }
    küçük bir gerginlik diyelim birbirimizi anlayamadık. verdiğiniz şekilde düzenledim. fakat group by alfabetik sıralama yaptığı için benim işime yaramıyor. eklenen veri sırası benim için daha iyi. sizin verdiğinizde sadece alfabetik sıralama yaptı. aynı verileri yine sıraladı yani ali hd izle şeklinde explode ile ayrılan kelimelerin hepsini sıraladı, ekrana verdi
    Yani group by bu fonk. çözümü olmayacak gibi
  • 25-04-2013, 15:02:35
    #11
    Sırası ile kullanmak istiyorsanız o zaman group by yerine order by İD desc komutundan faydalanabilirsiniz.

    Fakat yukarıdaki işlem etiketin bulunduğu İD satırındaki aynı dizileri tekrar ettirmez.


    Yani video id 1 ile video id 2 içerisindeki etiketler aynı olsa dahi ekrana yazdırılır. Eğer video id 1 içerisinde aynı etiketten tekrar tekrar girilmişse onu yazdırmaz.
  • 25-04-2013, 15:39:27
    #12
    koftee adlı üyeden alıntı: mesajı görüntüle
    Sırası ile kullanmak istiyorsanız o zaman group by yerine order by İD desc komutundan faydalanabilirsiniz.

    Fakat yukarıdaki işlem etiketin bulunduğu İD satırındaki aynı dizileri tekrar ettirmez.
    Yani video id 1 ile video id 2 içerisindeki etiketler aynı olsa dahi ekrana yazdırılır. Eğer video id 1 içerisinde aynı etiketten tekrar tekrar girilmişse onu yazdırmaz.
    evet demek istediğiniz anladım. fakat hem id 1 hem de id 2 de aynı etiketten var diyelim ki bir çoğunda bu şekilde veritabanında. ben bunlardan sadece birinin yazılmasını istiyorum. bu order by ve group by olmaz gibi desc te bildiğim kadarıyla sıralamaya yarıyor. evet id ile sıralanabilir fakat yine id 1 de yer alan aynı etiketle id 2 de yer alan etiketi filtrelemiyecektir. yani aynı etiket varsa farklı id 'lerde de olsa ekrana verecektir.
  • 25-04-2013, 17:43:50
    #13
    ufukt51 adlı üyeden alıntı: mesajı görüntüle
    evet demek istediğiniz anladım. fakat hem id 1 hem de id 2 de aynı etiketten var diyelim ki bir çoğunda bu şekilde veritabanında. ben bunlardan sadece birinin yazılmasını istiyorum. bu order by ve group by olmaz gibi desc te bildiğim kadarıyla sıralamaya yarıyor. evet id ile sıralanabilir fakat yine id 1 de yer alan aynı etiketle id 2 de yer alan etiketi filtrelemiyecektir. yani aynı etiket varsa farklı id 'lerde de olsa ekrana verecektir.

    Valla hocam aynı satırdaki tekrar eden dizileri dediğim gibi array_unique(); fonksiyonu ile halledebilirsin. Son eklenen veriler numaratik sıralama içinde mysql sorgunda oder by id desc komutunu kullanabilirsin.

    Sizin ne yapmak istediğinizi anladım fakat aklıma bir çözüm yolu gelmedi. Ustalar bakıp bir çözüm bulabilirse iyi olur. Umarım sorunu halledebilirsin. İyi çalışmalar.
  • 25-04-2013, 17:53:14
    #14
    $SQL1 = mysql_query("SELECT etiketler from videolar ORDER BY id ASC LIMIT 0,10"); 
    while ($yaz = mysql_fetch_array($SQL1)){  
    $parcala = explode(', ', $yaz["etiketler"]); 
    $result = array_unique($parcala); 
    
    $say = count($parcala); 
    $etiketleme = array();
    for($i=0; $i<$say; $i++){ 
    $etiketle = trim($result[$i]); 
    $tr1=array('/ç/','/Ç/','/ı/','/İ/','/ğ/','/Ğ/','/ö/','/Ö/','/ş/','/Ş/','/ü/','/Ü/','/ /'); 
    $tr2=array('c','C','i','i','g','G','o','O','s','S','u','U','-'); 
    $etiketle = preg_replace($tr1,$tr2,$etiketle); 
    
    if(!in_array($etiketle,$etiketleme)){
    echo = $etiketle;
    $etiketleme[] = $etiketle;
    } 
    } 
    } 
    unset($etiketleme);
    Database yapısı yanlış kurulduğu için performans açısından büyük kaynak harcayarak tüm satırları çekerek yapabilirsiniz. Bunun yerine ekstra bir etiketler tablosu oluşturup etiketler eklenirken bu tabloda olmayan yeni etiketin de eklenmesini sağlayabilirsiniz. Ya da en temizi etiketler tablosu ve kayıt tablosu ayrıca arada bir bağlantı tablosu ile çalışmak esnekliği arttırır.
  • 25-04-2013, 18:51:26
    #15
    digiklan adlı üyeden alıntı: mesajı görüntüle
    $SQL1 = mysql_query("SELECT etiketler from videolar ORDER BY id ASC LIMIT 0,10"); 
    while ($yaz = mysql_fetch_array($SQL1)){  
    $parcala = explode(', ', $yaz["etiketler"]); 
    $result = array_unique($parcala); 
    
    $say = count($parcala); 
    $etiketleme = array();
    for($i=0; $i<$say; $i++){ 
    $etiketle = trim($result[$i]); 
    $tr1=array('/ç/','/Ç/','/ı/','/İ/','/ğ/','/Ğ/','/ö/','/Ö/','/ş/','/Ş/','/ü/','/Ü/','/ /'); 
    $tr2=array('c','C','i','i','g','G','o','O','s','S','u','U','-'); 
    $etiketle = preg_replace($tr1,$tr2,$etiketle); 
    
    if(!in_array($etiketle,$etiketleme)){
    echo = $etiketle;
    $etiketleme[] = $etiketle;
    } 
    } 
    } 
    unset($etiketleme);
    Database yapısı yanlış kurulduğu için performans açısından büyük kaynak harcayarak tüm satırları çekerek yapabilirsiniz. Bunun yerine ekstra bir etiketler tablosu oluşturup etiketler eklenirken bu tabloda olmayan yeni etiketin de eklenmesini sağlayabilirsiniz. Ya da en temizi etiketler tablosu ve kayıt tablosu ayrıca arada bir bağlantı tablosu ile çalışmak esnekliği arttırır.
    Malesef şu noktada veritabanı düzeninde değişikliğe gidemem. çok fazla değişiklik yapmam gerekir bunun için. fakat bir ara optimizasyon yapmayı planlıyorum.
    Verdiğiniz kodları denedim fakat şonuç yine tekrarlıyor aynı ifadeleri.
    veritabanı örneğim: http://pastebin.com/ziTM5xAk burdaki gibi The Walking Dead HD izle kelimesinden başka video id lerde de var. umarım yardımcı olabilirsiniz günlerdir uğraşıyorum.
    Veritabanı yapısından ss: http://p1304.hizliresim.com/18/t/mfz2r.png
    Birde aşağıdaki ifade türkçe karakter dönüşümü yapmıyor acaba neden?
    $tr1=array('/ç/','/Ç/','/ı/','/İ/','/ğ/','/Ğ/','/ö/','/Ö/','/ş/','/Ş/','/ü/','/Ü/','/ /'); 
    $tr2=array('c','C','i','i','g','G','o','O','s','S','u','U','-'); 
    $etiketle = preg_replace($tr1,$tr2,$etiketle);
  • 25-04-2013, 23:03:32
    #16
    ufukt51 adlı üyeden alıntı: mesajı görüntüle
    Malesef şu noktada veritabanı düzeninde değişikliğe gidemem. çok fazla değişiklik yapmam gerekir bunun için. fakat bir ara optimizasyon yapmayı planlıyorum.
    Verdiğiniz kodları denedim fakat şonuç yine tekrarlıyor aynı ifadeleri.
    veritabanı örneğim: http://pastebin.com/ziTM5xAk burdaki gibi The Walking Dead HD izle kelimesinden başka video id lerde de var. umarım yardımcı olabilirsiniz günlerdir uğraşıyorum.
    Veritabanı yapısından ss: http://p1304.hizliresim.com/18/t/mfz2r.png
    Birde aşağıdaki ifade türkçe karakter dönüşümü yapmıyor acaba neden?
    $tr1=array('/ç/','/Ç/','/ı/','/İ/','/ğ/','/Ğ/','/ö/','/Ö/','/ş/','/Ş/','/ü/','/Ü/','/ /'); 
    $tr2=array('c','C','i','i','g','G','o','O','s','S','u','U','-'); 
    $etiketle = preg_replace($tr1,$tr2,$etiketle);
    preg_replace değil str_replace kullan.
    database karakter setin utf-8 ise replace fonksiyonunun çalıştığı php dosyasının karakter seti de utf-8 ya da unicode olmalı. yoksa karakterler eşleşmez replace yapmaz. eğer veritabanı karakter seti latin5 ise replace fonksiyonunun çalıştığı dosya ansii olmalı.

    benim verdiğim kod çalışmalı.
    mantık olarak veritabanındaki bütün kayıtların etiketlerini çekeceksin.
    explode ile ayıracaksın. sonra explode ile ayırdığın her etiketi eğer daha önce atanmadıysa $etiketler dizisine atayacaksın ve ekrana bastıracaksın.
    böylece daha önce atanan bir etiket tekrar array içine girmeyecek ve çıktı vermeyecek. ama bunu file cache e bağla, ya da database de bir alana yazdır. çok fazla kayıt olduğunda tüm satırları çekip etiketleri ayıklamak işlemci ve bellek şişirir.

    Bir de bu kodu dene
    Senin ilk mesajındaki kodu düzenledim.

    $etiketle = array();
    $SQL1 = mysql_query("SELECT etiketler from tablo LIMIT 0, 10"); 
    while ($yaz = mysql_fetch_assoc($SQL1)){  
    $parcala = explode(',', $yaz["etiketler"]); 
     
    for($i = 0; $i < count($parcala2); $i++){ 
    $parcala2[$i] = strtr(trim($parcala2[$i]), "ÜĞİŞÇÖüğışçö", "ugiscougisco");
    $parcala2[$i] = preg_replace("/[^0-9a-zA-Z]/","",$parcala2[$i]);
    
    if(in_array($parcala2[$i],$etiketle) == FALSE){
    $etiketle[] = $parcala2[$i]; 
    echo $parcala2[$i]; 
    }
    } 
    }
  • 25-04-2013, 23:20:49
    #17
    Kimlik doğrulama veya yönetimden onay bekliyor.
    digiklan adlı üyeden alıntı: mesajı görüntüle
    Database yapısı yanlış kurulduğu için performans açısından büyük kaynak harcayarak tüm satırları çekerek yapabilirsiniz. Bunun yerine ekstra bir etiketler tablosu oluşturup etiketler eklenirken bu tabloda olmayan yeni etiketin de eklenmesini sağlayabilirsiniz. Ya da en temizi etiketler tablosu ve kayıt tablosu ayrıca arada bir bağlantı tablosu ile çalışmak esnekliği arttırır.
    katılıyorum en sağlıklı çözüm sizin için yeni bir tabloya aynıları olmayacak şekilde tüm etiketleri baştan aktarmak olacaktır ancak yinede bir çözüm istiyorsanız where != etiket kullanabilirsiniz, şöyle olabilir.

    $etiket_array = Array();
    $sorgu_temp = "`etiket` != '' ";
    
    for($i=0;$<10;$i++) //kaç etiket alacaksanız ona göre ayarlarsınız
    {
          $etiket = mysql_fetch_assoc(mysql_query("select `etiket` from etiketler WHERE  $sorgu_temp order by `id` desc limit 1"));
          
          $eti = $etiket['etiket'];
          $etiket_array[] = $eti;
          $sorgu_temp .= " AND `etiket` != '$eti' ";
    }
    Daha sonra foreach($etiket_array as $etiket) diye tr karakter vs değiştirerek gider ve ekrana bastırırsınız, böyle bir şeyler yapılabilir...
  • 26-04-2013, 00:54:28
    #18
    Suerte adlı üyeden alıntı: mesajı görüntüle
    katılıyorum en sağlıklı çözüm sizin için yeni bir tabloya aynıları olmayacak şekilde tüm etiketleri baştan aktarmak olacaktır ancak yinede bir çözüm istiyorsanız where != etiket kullanabilirsiniz, şöyle olabilir.

    $etiket_array = Array();
    $sorgu_temp = "`etiket` != '' ";
    
    for($i=0;$<10;$i++) //kaç etiket alacaksanız ona göre ayarlarsınız
    {
          $etiket = mysql_fetch_assoc(mysql_query("select `etiket` from etiketler WHERE  $sorgu_temp order by `id` desc limit 1"));
          
          $eti = $etiket['etiket'];
          $etiket_array[] = $eti;
          $sorgu_temp .= " AND `etiket` != '$eti' ";
    }
    Daha sonra foreach($etiket_array as $etiket) diye tr karakter vs değiştirerek gider ve ekrana bastırırsınız, böyle bir şeyler yapılabilir...
    şeklinde denedim fakat mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in şeklinde hata aldım açıkcası senin verdiğin kodun içinden pek çıkamadım php bilgim pek iyi değil.
    <?php
    header("Content-Type: text/html; charset=latin5");
    include ("ayarlar.php");
    mysql_pconnect($server, $user,$pass) or die ("Hata oluştu ! Kullanıcı adı veya şifre yanlış");
    mysql_select_db($database) or die ("Hata oluştu ! Belirttiğiniz veritabanı ismi hatalı.");
    mysql_query("SET NAMES 'latin5'");
    $etiket_array = Array();
    $sorgu_temp = "`etiket` != '' ";
    
    for($i=0;$i<10;$i++) //kaç etiket alacaksanız ona göre ayarlarsınız
    {
          $etiket = mysql_fetch_assoc(mysql_query("select `etiket` from etiketler WHERE  $sorgu_temp order by `id` desc limit 1"));
          
          $eti = $etiket['etiket'];
          $etiket_array[] = $eti;
          $sorgu_temp .= " AND `etiket` != '$eti' ";
    }
    foreach($etiket_array as $etiket){
    $tr1=array('/ç/','/Ç/','/ı/','/İ/','/ğ/','/Ğ/','/ö/','/Ö/','/ş/','/Ş/','/ü/','/Ü/','/ /'); 
    $tr2=array('c','C','i','i','g','G','o','O','s','S','u','U','+'); 
    $etiket = preg_replace($tr1,$tr2,$etiket);
    }
    echo $etiket;
    ?>