Konuyu görüntüle
IUCODERS FORUM > Programlama > JAVA > jstl form degerleri kontrolu
Yazar
moonspell


avatar

Kayıt: 16.02.2006
07.05.2006-20:43 #6496
Elimde advaced search tarzi bir form var.form inputlarina bakarak bir sql sorgusu olusturmasini istiyorum.Ancak sorguya ancak bos birakilmayan inputların dahil edilmesi istiyorum.
Soyle bir yapi dusundum
SELECT * FROM table
             WHERE
            <c:if test="${not empty param.firstname}">firstname = "${param.firstname}" AND</c:if>
            <c:if test="${not empty param.lastname}">lastname = "${param.language}"</c:if>


Eger form fieldlardan herhangi birine bir deger girilmisse bu kodda sorun yok,istedigimi yapiyor.ancak butun fieldlar bos birakilirsa select * from where sorgusu sentaks hatasi veriyor dogal olarak.

Bu sorunu iki sekilde asabilcegimi dusunuyorum.birincisi

SELECT * FROM table
<c:if  test="butun form parametreleri bos"/>
...
...
...


ki burada butun form degiskenlerinin bos oldugunu nasil kontrol edecegimi bilmiyorum. // phpde olsa soyle birsey denerdim $_POST[]="";

ikincisi ise bos degiskenleri mysql'in islemesini saglamak ki bunun bir fikirim yok.ifnull gibi bir fonksiyona ihtiyacim var

yardim???







Software is like sex... its better when its free
Yazar
tarikkranda


avatar

Kayıt: 07.01.2006
07.05.2006-21:00 #6498
Merhaba moonspell,
Ben Java dan anlamam, mysql, php onlardan da anlamam ama bana C#, ASP.NET vs gibi bir ortamda ve sql server 2x kullanarak bunu nasil tasarlardin diye sorarsan soyle diyebilirim;
Not: Asagida yazdigim durum T-SQL standartlarina uygun olacagindan mantigi istedigin platforma uyarliyabilrsin;
KullaniciBilgileri tablosunun alanlari ; numara , ad, soyad olsun ve bunlardan bazıları boş geçilebilir, hepsi dolu veya tamami boş geçilebilir ise sorgunu şu şekilde bir store procedure ile yazabilirsin;

*********************************************************************
CREATE PROCEDURE [dbo].[BilgileriDogrula]

@numara int = null,
@ad nvarchar(15) = null,
@soyad nvarchar(15) = null

AS
SELECT numara, ad ,soyad FROM KullaniciBilgileri
WHERE ((@numara is NULL) OR (numara = @numara)) AND
((@ad is NULL) OR (ad = @ad)) AND
((@soyad is NULL) OR (soyad = @soyad))
GO
**********************************************************************

Ya da dinamik bir string seklinde sorgu olusturabilir ve bunu EXECUTE edebilirsin. Bu durumda if ifadeleri kullanarak bu boş geçilmiş oyleyse string in sonundaki WHERE kısmına bir AND daha eklemeliyim ya da devam etmeliyim seklinde dinamik bir string olusturur sonra bunu calistirırsın. Ama tabi bu serverın store procedure cache inin senin sorgunu cache lemesini engeller ve hızı düşürür. İlk yazdigim logic mantiginda ise tum girdiler boş geçilmiş olsa bile
(1 OR 0) AND (1 OR 0) AND (1 OR 0) tabi o da eşittir = 1 olacak ve tüm tablo döndürülecektir. Yani çalisir. Tüm alanların boş geçilmesinin hoş olmadıgı durumlarda bunun kontrolunu bussiness layer da yapmak daha mantıklı olacaktır, dolayısıyla kullanıcıyı kodla en az bir alan girmeye zorlamak gereklidir. Umarim soruyu dogru anlamisimdir yoksa bosa gitmesin bu yazdiklarimbiggrin

Bu arada daha onceki tecrubelerime ozgurun kattigi logic mantigindan oturu kendisine tesekkur ederimlaughing






Yazar
orhan


avatar
istanbul
admin
Kayıt: 17.11.2005
07.05.2006-21:04 #6499
şimdi hocam
sen şöyle bir select yapıyorsun
select * from tablo where //form elemanları boş gelince sql in bu kadar kalıyor. syn. error veriyor
eğer bunun sonuna sql ifadesi ne olursa olsun 1=1 koyarsan
o zaman sql in
select * from tablo where 1=1 olur. o zaman sql in çalışır.
nası trick wink

http://www.java2s.com/Code/Java/JSTL/JSTLIfElse.htm

http://javaalmanac.com/egs/javax.servlet.jsp.jstl.core/if.html





N/A
Yazar
tarikkranda


avatar

Kayıt: 07.01.2006
07.05.2006-21:50 #6502
orhan yazdi
 
şimdi hocam
sen şöyle bir select yapıyorsun
select * from tablo where //form elemanları boş gelince sql in bu kadar kalıyor. syn. error veriyor
eğer bunun sonuna sql ifadesi ne olursa olsun 1=1 koyarsan
o zaman sql in
select * from tablo where 1=1 olur. o zaman sql in çalışır.
nası trick wink

http://www.java2s.com/Code/Java/JSTL/JSTLIfElse.htm

http://javaalmanac.com/egs/javax.servlet.jsp.jstl.core/if.html


Ben mi yanlis anladim bilemiyorum ama, bahsettigin sekilde bir 1=1 koyarsak form elemanlarindan girilen degerleri karsilastirmanin ne onemi kalmis oluyor ki, girilenleri girsek te girmesek te 1=1 her turlu tum tabloyu dondurur. Linklere hic bakmadim ama dinamik sorgu cumlecigi diyorsaniz tasarim bisey diyemem ama dinamik sorgu cumlecigi cok yavas kalir yani 1=1 optimum cozum degil gibi geliyor bana o yuzden ben ANd R ifadelerinden bir kombinasyon olusturdum.





Yazar
orhan


avatar
istanbul
admin
Kayıt: 17.11.2005
07.05.2006-21:57 #6506
şimdi hiç bir işleme göre kişi arama istemiyorsa doğal olarak full tablo dondurulebilir.
yani yapılan işe göre normal. problemi çözer.
ote yandan saçma tabi. (butun işi tek tabloda yapacaksa saçma değil tabi) yok kişi mutlaka bir field dondurmesi gerekiyorsa en azından form validasyonu client side js ile yapabilir.
linkleri jstl de if yapısı için yolladım. null verileri nasıl önleriz diye. adam hiç bişe yollamasa mutlaka empty string yollar.





N/A
Yazar
sis***


avatar

Kayıt: 15.01.2006
08.05.2006-00:13 #6527
yazdığım bir kod, genelde bu şekilde kullanılıyor, tabi Sp varsa sorguda manüpülasyon gerekiyor, o zaman Tarık'ın yazdığı sql tümcesi işini görecektir.

 

_s.Append("from t_onbasvuru WHERE 1=1 ");
if (txt_adi.Text.Length>0)
_s.Append(" AND adi like '"+ txt_adi.Text +"%'");
if (txt_soyadi.Text.Length>0)
_s.Append(" AND soyadi like '"+ txt_soyadi.Text +"%'");
if (drp_il.SelectedValue.ToString()!="")
_s.Append(" AND ev_alinicak_il = "+drp_il.SelectedValue);






University Of Minnesota- Minnesota(ABD)




Del.icio.us
Digg
Facebook
Furl
Google
Blink
Simpy
Spurl
Y! MyWeb