Arama butonu
Bu konudaki kullanıcılar: 1 misafir
9
Cevap
751
Tıklama
0
Öne Çıkarma
MySQL sorgusu tutarsız çalışıyor
F
10 yıl
Teğmen
Konu Sahibi

Merhaba Arkadaşlar,
Php ile otomasyon sistemi tarzı bir uygulama yapıyorum. Sistemde kayıtlı olan kişileri bir tablo üzerinde listeliyorum. Bu tablo için bir de detayı arama tarzı bir sistem yaptım. Başta güzel çalışıyordu ama sonradan eksik çalışmaya başladı. Mesela kullanıcı veritabanında bulunmasına rağmen id si ile arattığımda bazı kullanıcıları listeliyor bazılarını listelemiyor. Resimler ve sql sorgum alttadır. Yardımlarınız için şimdiden teşekkürler...
1. Resim Tüm kullanıcılar
< Resime gitmek için tıklayın >
2. Resim id si 6 olan kullanıcı
< Resime gitmek için tıklayın >
3. Resim id si 55 olan kullanıcı aslında var ama listelemiyor
< Resime gitmek için tıklayın >
SQL sorgum
 $query = $db->query("SELECT * FROM members  WHERE ID like '%" . $_POST["kisiID"] . "%' 
and isim like '%" . $_POST["kisiAdi"] . "%'
and soyad like '%" . $_POST["kisiSoyadi"] . "%'
and meslek like '%" . $_POST["Meslek"] . "%'
and unvan like '%" . $_POST["Unvan"] . "%'
and mesleki_unvan like '%" . $_POST["MeslekiUnvan"] . "%'
and kan_grubu like '%" . $_POST["KanGrubu"] . "%'
and cinsiyet like '%" . $_POST["Cinsiyet"] . "%'
and il like '%" . $_POST["il"] . "%'
and ilce like'%" . $_POST["ilce"] . "%'
and memleket like '%" . $_POST["memleket"] . "%'
and ID IN(Select mID From members_groups where gName like '%".$_POST["Grup"]."%')", PDO::FETCH_ASSOC);

< Resime gitmek için tıklayın >< Resime gitmek için tıklayın >< Resime gitmek için tıklayın >

DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.

Üye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.

Üye Ol Şimdi Değil



P
10 yıl
Binbaşı

like yerine = kullanınca da aynı sonuç mu oluyor?



F
10 yıl
Teğmen
Konu Sahibi

Evet hocam


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @PcCopat
P
10 yıl
Binbaşı

Peki sadece 11 ve 12 idleri ile arama yapınca sonuçlar çıkıyor mu?



F
10 yıl
Teğmen
Konu Sahibi

Evet Çıkıyor hocam


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @PcCopat
P
10 yıl
Binbaşı

İlginç gerçekten. Peki neden boş bırakılan alanları da mysql sorgusuna dahil ediyorsunuz? Hangileri doluysa onlar çalışsın sadece?
Sadece id için sorgulandığında da sonuç gelmiyor mu? select * from members where id = 55;



F
10 yıl
Teğmen
Konu Sahibi

Öyle sonuç dönüyor ama koşullu sorgu yapmam lazım. Yani grubu seçilen kişiler içinden belli bir ildekileri aramam lazım ve o ilde ve grupta olanlardan ali ismindekileri bulmam gerek bunu nasıl sağlayabilirim. 12! if else yazamam aklıma bir yöntem gelmiyor....

birde diğer selectboxların ilk değerleri boş hiç bir sorgu yapmasam bile boş post oluyor :D





< Bu mesaj bu kişi tarafından değiştirildi frknkntr -- 6 Aralık 2015; 2:39:07 >
Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @PcCopat
P
10 yıl
Binbaşı

Anladım.
Aslında burada bir başka sorun daha var; tablo yapısı. Sanırım members isminde tek bir tablo kullanıyorsunuz. Bunu normalleştirmeniz faydanıza olacaktır. (http://beltslib.net/veri-tabanlarinda-normalizasyon.html)

Sorgular ise dinamik şekilde önceden ayarlanmış şekilde çalışabilir. Buna prepared statement deniyor. Ancak o kadar mysql bilginiz yoksa php ile 12 tane if yazmanız en kolayı olacaktır. Performans olarak bir sıkıntı olacağını sanmıyorum çok. Her durumda boş alanları filtre etmek gerekeceği için bu if koşulları ya PHP içinden, ya da mysql içinden çalışmak zorunda.

Ben PHP bilmiyorum ama bakın burada bir örnek var. (http://patrickallaert.blogspot.se/2007/09/building-dynamic-sql-queries-elegant.html)
Mantık basit; her kutuyu boş mu dolu mu diye test ettikten sonra, eğer doluysa kutunun getireceği ek mysql sorgusunu, sorgulanacak öğeye dahil etmekten ibaret. Bu durumda sadece dolu olanlar çalışacaktır.



F
10 yıl
Teğmen
Konu Sahibi

Hocam ilginiz için çok teşekkürler, sorunu çözdüm. Normalizasyon konusunda gelince bu sorgudan biraz anlaşılsa da veri tabanım BCNF / 3.5NF normalizasyon seviyesinde... açıklamam gerekirse grupları "groups" tablosunda, üyeleri "members" tablosunda ve many to many ilişkileri olması hasebiyle üyelerin dahil olduğu grupları "members_groups" tablosunda tutuyorum. İller, ilçeler, meslekler, unvanlar gibi kısımları farklı tablelarda tutuyorum ama burada many to one ilişkisi olduğu için bu kısmları her üye için "members" tablosunda açmış olduğum kısımlara ekliyorum...

PreparedStatement kavramını tam bilmiyordum ama 6000 satır verim olunca cacheleme ihtiyacı duymuştum demek PreparedStatement sayesinde bu işlemi yapabiliyormuşuz. Çok teşşekkürler. Basit bir hata sayesinde yeni bir şey öğrenmiş oldum.

 $query = $db->query("SELECT * FROM members  WHERE (ID like '%" . $_POST["kisiID"] . "%' 
and ID IN(Select mID From members_groups where gName like '%".$_POST["Grup"]."%'))
and isim like '%" . $_POST["kisiAdi"] . "%'
and soyad like '%" . $_POST["kisiSoyadi"] . "%'
and meslek like '%" . $_POST["Meslek"] . "%'
and unvan like '%" . $_POST["Unvan"] . "%'
and mesleki_unvan like '%" . $_POST["MeslekiUnvan"] . "%'
and kan_grubu like '%" . $_POST["KanGrubu"] . "%'
and cinsiyet like '%" . $_POST["Cinsiyet"] . "%'
and il like '%" . $_POST["il"] . "%'
and ilce like'%" . $_POST["ilce"] . "%'
and memleket like '%" . $_POST["memleket"] . "%'
", PDO::FETCH_ASSOC);



sormgumu bu şekile getirince sorun halloldu... Tekrardan ilginize teşekkürler





< Bu mesaj bu kişi tarafından değiştirildi frknkntr -- 7 Aralık 2015; 2:23:48 >


Bu mesajda bahsedilenler: @PcCopat
P
10 yıl
Binbaşı

Düzeldiğine sevindim. Kolay gelsin.



< Bu ileti mobil sürüm kullanılarak atıldı >

DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.