• 02-10-2021, 15:10:43
    #1
    Kimlik doğrulama veya yönetimden onay bekliyor.
    Selam sevgili üstatlarım.
    Öncelikle okumaya değer bulup zaman ayırdığınız için teşekkür ederim.
    Hemen konuya girecek olursak;

    members isimli bir mysql tablom var. Bu tabloda aranan_dil adında varchar tipinde bir alanım var. Kullanıcı profil düzenleme sayfasında konuştuğu dilleri işaretleyerek bu alanı güncelliyor. Diyelim ki Türkçe, ingilizce ve rusça dillerini seçti. Bu durumda aranan_dil alanına 1,2,6 şeklinde kaydediliyor.

    Sorum şu;
    Diğer kullanıcıların arama yaptığı bir sayfa var. Bu sayfada kullanıcı aradığı kişilerin konuştuğu dilleri seçiyor. Yine burada da birden fazla dil seçilebiliyor. Diyelim ki arama yapan vatandaş Türkçe, Almanca ve ingilizce dillerini konuşanları bulmak istiyor. Kullanıcı aramayı başlattığında elimde 1,3,2 verisini içeren bir array oluyor. Bu array ile aranan_dil alanında tutulan veriyi (1,2,6) karşılaştıran ve seçilen dillerden herhangi birini içeren kayıtları çekecek bir PDO sorgusu nasıl yazılabilir?

    IN ve REGEXP yöntemlerini denedim ama olmadı bir türlü. Bu yöntemler sadece ilk veriyi karşılaştırıyor maalesef.

    IN yönetmi ile denediğim kod:
    isset($f_uye_dil_1) && $f_uye_dil_1 !='' ? $sql_dil_sql = " and (aranan_dil IN (".$f_uye_dil_1.")) " : $sql_dil_sql = '';
    REGEXP yönetmi ile denediğim kod:
    if(isset($f_uye_dil_1) && $f_uye_dil_1 !=''){
            $sql_arr = '';
            $sql_orek = '';
            $sql_dil_sql = '';
                $myArray = explode(',', $f_uye_dil_1);
                foreach ($myArray as &$item) {
                        $sql_arr = $sql_arr.$sql_orek.$item;
                        $sql_orek = "|";
                }
                isset($sql_arr) && $sql_arr !='' ? $sql_dil_sql = " and ( aranan_dil REGEXP ".$sql_arr.") " : $sql_dil_sql = "";  
        } else {
                $sql_dil_sql = '';
        }
    Yardımlarınız için şimdiden teşekkür ederim.
    NOT: Biliyorum ki birçok üstat hayatını kod yazarak kazanıyor. Bu nedenle ücret karşılığında yardımcı olmak isteyen olursa da seve seve ödeme yapabilirim.
  • 02-10-2021, 15:15:05
    #2
    Merhaba,

    Sanıyorum dillerin olduğu tablo sidebar alanında listeleniyor. O sidebardan TR seçildiğinde (id ile karşılanıyordur) members tablosunun aranan_dil tablosunda bu id yer alıyorsa onları filtrelemek istiyorsunuz. (Kafam çok karışık belki de tam anlamadım.) Yapmanız gereken şey şu members içinde aranan_dil'deki verileri explode ile bölüp arraya alacaksınız. 1,2,3 dizinde 3 veri olacak. Her üye için bu arrayı döndereceksiniz ve şunu yapacaksınız eğer sol taraftaki dilden seçilen id burda varsa listele. İf else ile. Umarım doğru anlamışımdır. Umarım açıklayıcı olmuştur.
  • 02-10-2021, 15:15:48
    #3
    sql da içeren komutu var, like olarak geçiyor. Elinde ki diziyi 1,2,6 şeklindeki stringi [1,2,6] dizisine çevirirsen, bu elemanları for ile tek tek sorguya göndererek çalıştırıp gelen sonucu bir diziye atabilirsin. Normalde bu şekilde yapmak yerine şöyle de yapabilirsin. Tabloda verini 1,2,6 tutmak yerine ayrı ayrı satırlarda 1,2 ve 6 değerlerini tutarsın. Bu tabloya bir de ilgili üyenin idsini atarsan yine daha çok satırda, tek değer tutmuş olursun. Aynı işlemi for ile yapmak yerine, satırları tek tek dönerekte yapabilirsin.
    Sql like kullanımı için belki şurayı inceleyebilirsin SQL LIKE
  • 02-10-2021, 15:17:14
    #4
    Bu arada postta kodu varmış zaten görmedim. Foreach dışında arraya almaya gerek yok üyenin dillerini diye düşünüyorum.
  • 02-10-2021, 15:18:09
    #5
    gurbuzemre adlı üyeden alıntı: mesajı görüntüle
    sql da içeren komutu var, like olarak geçiyor. Elinde ki diziyi 1,2,6 şeklindeki stringi [1,2,6] dizisine çevirirsen, bu elemanları for ile tek tek sorguya göndererek çalıştırıp gelen sonucu bir diziye atabilirsin. Normalde bu şekilde yapmak yerine şöyle de yapabilirsin. Tabloda verini 1,2,6 tutmak yerine ayrı ayrı satırlarda 1,2 ve 6 değerlerini tutarsın. Bu tabloya bir de ilgili üyenin idsini atarsan yine daha çok satırda, tek değer tutmuş olursun. Aynı işlemi for ile yapmak yerine, satırları tek tek dönerekte yapabilirsin.
    Sql like kullanımı için belki şurayı inceleyebilirsin SQL LIKE
    Hocam hızlı cevap için teşekkür ederim.
    Çeşitli sebeplerden dolayı veriyi farklı tablolarda tutmak gibi bir şansım yok maalesef. ilk önerindeki "like" komutlarından kastın tam olarak nedir?
  • 02-10-2021, 15:22:12
    #6
    wwwmaster adlı üyeden alıntı: mesajı görüntüle
    Hocam hızlı cevap için teşekkür ederim.
    Çeşitli sebeplerden dolayı veriyi farklı tablolarda tutmak gibi bir şansım yok maalesef. ilk önerindeki "like" komutlarından kastın tam olarak nedir?
    Like komutundan kastım like ile bu değerleri içeriyor mu içermiyor mu kontrol edebilirsin, örneğin 1 ile biten, 1 ile başlayan, 1 içeren şeklinde kontrol edebilirsin. Anladığım kadarıyla elinde iki adet string var birisi a dizisi :1,2,3 diğeri b dizisi: 3,4,5 olsun. Sen a dizisindeki b dizisinde var mı diye arıyorsan, örneğin 3 değeri, ikisinde de var görüyoruz. İlk olarak soldaki değeri yani 1,2,3 dizisini böl split ile {1,2,3} değerlerini aldın eline şu an üç farklı değer var. sql sorgusuna da de ki, bu b dizisini çek içerisinde, a dizisinin 0-1-2. indisleri var mı ( for ile yapabilirsin ) eğer var ise i değeri zaten senin eşleşen değerin oluyor ne yapmak istiyorsan yapabilirsin.
  • 02-10-2021, 15:22:50
    #7
    gurbuzemre adlı üyeden alıntı: mesajı görüntüle
    sql da içeren komutu var, like olarak geçiyor. Elinde ki diziyi 1,2,6 şeklindeki stringi [1,2,6] dizisine çevirirsen, bu elemanları for ile tek tek sorguya göndererek çalıştırıp gelen sonucu bir diziye atabilirsin. Normalde bu şekilde yapmak yerine şöyle de yapabilirsin. Tabloda verini 1,2,6 tutmak yerine ayrı ayrı satırlarda 1,2 ve 6 değerlerini tutarsın. Bu tabloya bir de ilgili üyenin idsini atarsan yine daha çok satırda, tek değer tutmuş olursun. Aynı işlemi for ile yapmak yerine, satırları tek tek dönerekte yapabilirsin.
    Sql like kullanımı için belki şurayı inceleyebilirsin SQL LIKE
    Cevap için teşekkürler ama yapmak istediğim şey bu değil tam olarak.
    Üyelerin diğer üyeleri aradığı bir form var. Örneğin bana diyor sadece Türkçe ve ingilizce konuşan üyeleri listele. Seçtiği dillerin id numaraları array olarak ban geliyor. Ben de sql sorgusu ile arayan kullanıcının seçtiği dileri konuşan üyeleri listelemeliyim.
  • 02-10-2021, 15:28:03
    #8
    wwwmaster adlı üyeden alıntı: mesajı görüntüle
    Cevap için teşekkürler ama yapmak istediğim şey bu değil tam olarak.
    Üyelerin diğer üyeleri aradığı bir form var. Örneğin bana diyor sadece Türkçe ve ingilizce konuşan üyeleri listele. Seçtiği dillerin id numaraları array olarak ban geliyor. Ben de sql sorgusu ile arayan kullanıcının seçtiği dileri konuşan üyeleri listelemeliyim.
    Aslında aynı şeyden bahsediyoruz hocam. Benim söylediğim aklıma gelen ilk yöntem illa ki başka yöntemlerle de çözülebilir. Sen gelen diziyi, sql sorgusuna tek tek göndererek yine listeleyebilirsin. dizi[0] geldi örneğin, bunu sorgu icine like='%dizi[0]%' gibi bir şeydi sanırım, tam kullanımını hatırlamıyorum. Dizi[0] daki elemanı içereni çekmiş oluyorsun.
  • 02-10-2021, 15:29:12
    #9
    gurbuzemre adlı üyeden alıntı: mesajı görüntüle
    Like komutundan kastım like ile bu değerleri içeriyor mu içermiyor mu kontrol edebilirsin, örneğin 1 ile biten, 1 ile başlayan, 1 içeren şeklinde kontrol edebilirsin. Anladığım kadarıyla elinde iki adet string var birisi a dizisi :1,2,3 diğeri b dizisi: 3,4,5 olsun. Sen a dizisindeki b dizisinde var mı diye arıyorsan, örneğin 3 değeri, ikisinde de var görüyoruz. İlk olarak soldaki değeri yani 1,2,3 dizisini böl split ile {1,2,3} değerlerini aldın eline şu an üç farklı değer var. sql sorgusuna da de ki, bu b dizisini çek içerisinde, a dizisinin 0-1-2. indisleri var mı ( for ile yapabilirsin ) eğer var ise i değeri zaten senin eşleşen değerin oluyor ne yapmak istiyorsan yapabilirsin.
    Tam olarak yapmak istediğim şey bu. Ama başaramadım bunu yapacak kodu yazmayı. Vaktin varsa örnek kod yazman mümkün olabilir mi acaba hocam?