Php Birden Fazla Girişi Engelleme Sorunu

Bu konuyu okuyanlar

yuci308

Asistan
Katılım
7 Haziran 2008
Mesajlar
107
Reaksiyon puanı
2
Puanları
18
Php ile hazırladığım site de kayıt giriş formundan gelen veriler bazen birden fazla defa kayıt edliyor. Kaydet butonuna bir kaç defa mı basıyorlar bilmiyorum. Bunu önüne nasıl geçebilirim?
 

myefsane

Dekan
Katılım
15 Eylül 2006
Mesajlar
6,951
Reaksiyon puanı
49
Puanları
48
Kodları istediğiniz sayfaların en üstüne koyun.

PHP- Kodu:
PHP:
<%
'|||||||||||||||||||||||||||||||||||||||||||||||||||
'|||            Coded by 3r@$3r             |||||
'||| MAIL : [email]destek@coneximtech.com.com[/email]    |||||
'|||||||||||||||||||||||||||||||||||||||||||||||||||
If  SESSION("X" )=""  Then   'Ddos Flooder Engelleyici ;] 
SESSION("X" )=0  'Oturum Açildi !  
Else    
SESSION("X" )= SESSION("X" ) + 1   ' 1 Artiriyoruz
End  If   
If  CInt(SESSION("X" ))> 5  Then   ' 5 Kere Sayfaya Yenilenirse 2 Dakkika Siteden Uzaklastiriyoruz 
Session.TimeOut=1 
Response.Write("<title> DDos Korumasi Devrede ! </title>")
Response.Write("<link rel=""stylesheet"" type=""text/css"" href=""style/rawk.css"">")
RESPONSE.WRITE("<center><font class=""ddos""><b>DDos Korumasi Devrede !</b><br>") 
Response.Write("<b>Kisa Bir Süreligine Siteden Uzaklastirldiniz.</b></center>")  
RESPONSE.END    
End  If   
%>




Ayrıca bakınız.

Keremalizm: Php #Site İçi Flood Engelleme~TG Açıldı
 

sdelta

Profesör
Katılım
23 Nisan 2008
Mesajlar
4,228
Reaksiyon puanı
140
Puanları
63
Kodları istediğiniz sayfaların en üstüne koyun.

PHP- Kodu:
PHP:
<%
'|||||||||||||||||||||||||||||||||||||||||||||||||||
'|||            Coded by 3r@$3r             |||||
'||| MAIL : [email]destek@coneximtech.com.com[/email]    |||||
'|||||||||||||||||||||||||||||||||||||||||||||||||||
If  SESSION("X" )=""  Then   'Ddos Flooder Engelleyici ;] 
SESSION("X" )=0  'Oturum Açildi !  
Else    
SESSION("X" )= SESSION("X" ) + 1   ' 1 Artiriyoruz
End  If   
If  CInt(SESSION("X" ))> 5  Then   ' 5 Kere Sayfaya Yenilenirse 2 Dakkika Siteden Uzaklastiriyoruz 
Session.TimeOut=1 
Response.Write("<title> DDos Korumasi Devrede ! </title>")
Response.Write("<link rel=""stylesheet"" type=""text/css"" href=""style/rawk.css"">")
RESPONSE.WRITE("<center><font class=""ddos""><b>DDos Korumasi Devrede !</b><br>") 
Response.Write("<b>Kisa Bir Süreligine Siteden Uzaklastirldiniz.</b></center>")  
RESPONSE.END    
End  If   
%>
Ayrıca bakınız.

Keremalizm: Php #Site İçi Flood Engelleme~TG Açıldı

Verdiğiniz kodlar PHP için değil ASP.NET içindir.
 

orcnd

Dekan
Katılım
13 Ekim 2008
Mesajlar
6,394
Reaksiyon puanı
255
Puanları
63
bu işini görecektir denemedim gerçi belki ufak tefek sytax hataları vardır
PHP:
$ard_arda_kayit_girme_suresi=10; // saniye cinsinden

if ($_SESSION['sonkayit']-microtime()>$ard_arda_kayit_girme_suresi) {
//kayit ekleme komutları buraya

$_SESSION['sonkayit']=microtime();
}
 

yuci308

Asistan
Katılım
7 Haziran 2008
Mesajlar
107
Reaksiyon puanı
2
Puanları
18
bu işini görecektir denemedim gerçi belki ufak tefek sytax hataları vardır
PHP:
$ard_arda_kayit_girme_suresi=30 // saniye cinsinden

if ($_SESSION['sonkayit']-microtime()<$ard_arda_kayit_girme_suresi) {
//kayit ekleme komutları buraya

$_SESSION['sonkayit']=microtime();
}

Bu çözüm olacaktır belki ama benim istediğimi tam olarak karşılamayacak.
Şöyle örnek vereyim
Mesela bir text kutusu var buraya sayı girip kaydete basılıyor.
Kullanıcı ard arda 5, 7, 9, 9, 10 sayılarını girmesi gerekiyor. Kayıtlara baktığımızda örneğin 7 sayısını 2 kere kaydetmiş ama kullanıcı bir kere yazdım diyor. Benim tahminim sayfa yüklenmesini beklerken kaydet düğmesine bi kaç defa basıyorlar. (Yapmadıklarını söylüyorlar ama emin değilim).
 

orcnd

Dekan
Katılım
13 Ekim 2008
Mesajlar
6,394
Reaksiyon puanı
255
Puanları
63
o zaman kullanıcıya kayıt girdiğini belirtmen lazım

ya veri girdiği kutuları disabled yapıcaksın yada hiç göstermiyeceksin.

ve veri girilmiş kutuların name değerlerini farklı bir şey yapıcaksın ki işleme tabi olmasın.

sayfa yüklenmesini beklerlerken birkaç defa basmaları birden çok kayıt oluşmasına sebep olmaz
 

sdelta

Profesör
Katılım
23 Nisan 2008
Mesajlar
4,228
Reaksiyon puanı
140
Puanları
63
Şöyle bir çözüm önerebilirim ancak hangi dil ile yapılıyor bilmiyorum Javascript tir tahminen.

Kaydet butonuna tıklandığı anda buton pasif duruma geçer ve butonun üzerindeki yazı "İşleminiz yapılıyor..." olarak değişir. Bu işinizi görecektir diye düşünüyorum.
 

N3CAT1

Dekan
Emektar
Katılım
20 Nisan 2008
Mesajlar
6,609
Reaksiyon puanı
144
Puanları
63
Şöyle bir çözüm önerebilirim ancak hangi dil ile yapılıyor bilmiyorum Javascript tir tahminen.

Kaydet butonuna tıklandığı anda buton pasif duruma geçer ve butonun üzerindeki yazı "İşleminiz yapılıyor..." olarak değişir. Bu işinizi görecektir diye düşünüyorum.

Hah ben de onu diyecektim :D Lafı ağzımdan çaldın :D
 

Proof.Web

Doçent
Katılım
3 Temmuz 2010
Mesajlar
999
Reaksiyon puanı
21
Puanları
0
İlk Öncelikle Merhaba :)
Şimdi Sql Tablosunda kullaniciadi diye bir alan olduğunu varsayalım
PHP:
$sql=mysql_query("SELECT kullaniciadi FROM uyeler WHERE kullaniciadi='$kullanici'");
if(mysql_num_rows($sor)>0){
echo "Böyle Bir Kullanıcı Kaydı Daha Öncede Yapılmış";
}else{
$ekle=mysql_query("insert into uyeler (kullaniciadi,sifre)values('$kullanici','$sifre')");
if($ekle){
echo "Kayıt Yapıldı";
}else{
echo "Kayıt Yapılamadı";
}
}
 

MrDeNNiS

Asistan
Katılım
28 Temmuz 2010
Mesajlar
182
Reaksiyon puanı
16
Puanları
0
PHP:
<script type="text/javascript">

function isimDegistir() {

	document.Kayit.cmdKayit.value="Lütfen işleminiz gerçekleşirken bekleyiniz.."

}

</script>

<form name="Kayit">
<input type="button" name="cmdKayit" value="Kayıt Ol" onclick="this.disabled=true; isimDegistir();">
</form>

Buton'u disabled yapıp kullanıcıya beklemesini gerektiğini söylüyoruz, veritabanı işlemlerini yaptığınız sayfada da veritabanında böyle bir veri var mı yok mu kontrol ettirdikten sonra insert işlemini yaptırırsanız işiniz hallolur :)

Not: SQL Injection'dan korunmak için birşeyler yapın yoksa sizin textboxlarınıza SQL sorguları girerek sisteminizi alt üst edebilirler.

Kolay gelsin
 

Turab Garip

Dekan
Emektar
Katılım
30 Mayıs 2007
Mesajlar
6,887
Reaksiyon puanı
175
Puanları
63
Ben de zamanında bir bilgi edinme modülü yazmıştım, yüzlerce kişi kullanıyor, hiçbirinde hata olmuyor, fakat ne zaman ben test etmek için kendim doldursam formu, üç dört defa kaydediyor. :) (Farklı tarayıcılarda da öyle.) Sebebini hala çözebilmiş değilim, o modülden birçok bilgi edinme talebi geldi bana, hiçbiri de kaydı ikilemedi; ama kendim test için şimdi bile kayıt yaptığımda üç dört defa, bazen beş defa giriyor veritabanına. Daha da ilginç olanı, veritabanına girdiği bilgilerin bir kopyasını da mail olarak attırıyorum; mailler de 5 defa geliyor fakat belli aralıklarla. Sunucuda mail yükü (query) olmadığı halde ben formu kaydettikten atıyorum 10 dakika sonra bile doldurduğum formun birbirinin kopyası olan mailleri gelebiliyor.

Histerik bir durum. :) Bu nedenle kaydet butonuna bir kaç defa bastıklarına inanmakta çok ısrarcı olmazdım ben olsam.
 

yuci308

Asistan
Katılım
7 Haziran 2008
Mesajlar
107
Reaksiyon puanı
2
Puanları
18
Ben de zamanında bir bilgi edinme modülü yazmıştım, yüzlerce kişi kullanıyor, hiçbirinde hata olmuyor, fakat ne zaman ben test etmek için kendim doldursam formu, üç dört defa kaydediyor. :) (Farklı tarayıcılarda da öyle.) Sebebini hala çözebilmiş değilim, o modülden birçok bilgi edinme talebi geldi bana, hiçbiri de kaydı ikilemedi; ama kendim test için şimdi bile kayıt yaptığımda üç dört defa, bazen beş defa giriyor veritabanına. Daha da ilginç olanı, veritabanına girdiği bilgilerin bir kopyasını da mail olarak attırıyorum; mailler de 5 defa geliyor fakat belli aralıklarla. Sunucuda mail yükü (query) olmadığı halde ben formu kaydettikten atıyorum 10 dakika sonra bile doldurduğum formun birbirinin kopyası olan mailleri gelebiliyor.

Histerik bir durum. :) Bu nedenle kaydet butonuna bir kaç defa bastıklarına inanmakta çok ısrarcı olmazdım ben olsam.

İşte sonunda benim sorunumu yaşamış birini buldum. Butona ikileme konusuna takılmadım sadece olabilirmi diye ihtimal olarak düşünüyordum. Kayıtların fazladan girilmesi 2 bilgisayarda oluyor. Diğer bilgisayarlarda hiç yaşamadık. O bilgisayarlarında birden çok kullanıcısı var.
 

Uso!

Doçent
Katılım
10 Ağustos 2010
Mesajlar
947
Reaksiyon puanı
27
Puanları
18
POST'u PHP değil de jQuery AJAX kullanarak yaparsanız, JS ile bunun önüne çok kolay bir şekilde geçebilirsiniz. :)
 

Turab Garip

Dekan
Emektar
Katılım
30 Mayıs 2007
Mesajlar
6,887
Reaksiyon puanı
175
Puanları
63
POST'u PHP değil de jQuery AJAX kullanarak yaparsanız, JS ile bunun önüne çok kolay bir şekilde geçebilirsiniz. :)

Sorun kayıt tuşuna iki defa basılması olmadığı için POST'u PHP ile göndermekte hiçbir mahzur yok. Yuci308, belki de birden çok kullanıcısı olan bilgisayar POST'u bir kaç defa yolluyordur. Çok ekstrem bir şey bu söylediğim ama sonuçta Windows'tan beklenir bu tür saçma hatalar. :) Benim bu sorunu yaşadığım bilgisayarda birden çok kullanıcı da yok; dediğim gibi ilginç bir şekilde onlarca vatandaş formu doldurup gönderdi bugüne kadar, bir tek defa bile kopya kayıt oluşturmadı, ama formu ben doldurduğum zaman kopya kayıt yapıyor. Hem de aradan zaman geçtikten sonra kendi kendine bir kaç kayıt daha atıyor veritabanına. Şimdi başka bilgisayarlardan da deneyip sonuca bakayım. :)

Düzenleme: Tamamen farkılı bir yerdeki başka bir bilgisayardan denedim, yine ikiledi kaydı. İlk bilgisayar Windows XP idi, bu ise Windows 7. İkisinde de farklı tarayıcılar, fakat sorun aynı ve nedense resmi bir sitede yayın yaptığımdan bir sürü vatandaş kullandığı halde hiçbirini ikilemiyor. :) (Yalnız ilk denediğim bilgisayarda 2-5 arasında kayıt yapıyordu, bunda sadece iki tane yaptı.)
 

Uso!

Doçent
Katılım
10 Ağustos 2010
Mesajlar
947
Reaksiyon puanı
27
Puanları
18
Sorun kayıt tuşuna iki defa basılması olmadığı için POST'u PHP ile göndermekte hiçbir mahzur yok.
Zaten bir jQuery kontrolüne koyarsanız işlem bitmeden(callback fonksiyonuna gelmeden), yeni bir işlem başlayamayacak. :) Ama madem sorun iki kez basılması değil diyorsunuz, POST ettiğiniz ve POST'u işlediğiniz dosyayı mahsuru yoksa koyabilir misiniz? Belki de ufak bir mantık hatası bu sorunu çıkarıyordur? :)
 

yuci308

Asistan
Katılım
7 Haziran 2008
Mesajlar
107
Reaksiyon puanı
2
Puanları
18
PHP:
$con = mysql_connect($host,$girisadi,$sifre);
		if (!$con)
		  {
		  die('Could not connect: ' . mysql_error());
		  }

		mysql_select_db($db, $con);
		mysql_query("SET NAMES 'latin5'");
		mysql_query("SET CHARACTER SET 'latin5_turkish_ci'");
		mysql_query("COLLATE 'latin5_turkish_ci'");
		
		for ($i=1;$i<=8;$i++){
			if ($_POST['durus'.$i]<>''){
			$sql="INSERT INTO durus_giris (sicil_no, bolum_id, makina_bant, durus_kodu, sure, tarih, vardiya, aciklama) ";
			$sql.="values (";
			$sql.="'".$_POST['users']."', ";
			$sql.="'".$_POST['bolum']."', ";
			$sql.="'".$_POST['bant_makina'.$i]."', ";
			$sql.="'".$_POST['durus'.$i]."', ";
			$sql.="'".$_POST['sure'.$i]."', ";
			$sql.="'".$_POST['tarih']."', ";
			$sql.="'".$_POST['vardiya']."', ";
			$sql.="'".$_POST['aciklama'.$i]."'";
			$sql.=")";		
			mysql_query($sql) or die("Kayıt olmadı!");
			}
		}
		mysql_close($con);
		
		$insertGoTo = "uretim.php?key=6";
		header(sprintf("Location: %s", $insertGoTo));

genelde çiftleme olan yer burası.

birde arada şurada yapıyor.

PHP:
$sql_sk="select * from stok_kart where stok_kodu='".$_POST['urun_kodu']."'";
		$result_sk = mysql_query($sql_sk);
		$row_sk = mysql_fetch_array($result_sk);
		
		$sql1="insert into uretim_giris (stok_kodu,bolum,miktar,birim,sicil_no,vardiya,tarih,mak_bant,operasyon_kodu,calisan_sayisi,parti_no) ";
		$sql1.="values (";
		$sql1.="'".$_POST['urun_kodu']."',";
		$sql1.="'Montaj',";
		$sql1.="".$_POST['miktar'].",";
		$sql1.="'".$row_sk['birim1']."',";
		$sql1.="'".$_POST['users']."',";
		$sql1.="'".$_POST['vardiya']."',";
		$sql1.="'".$_POST['tarih']."',";
		$sql1.="'".$_POST['bant_no']."',";
		$sql1.="'',";
		$sql1.="'',";
		$sql1.="''";
		$sql1.=")";
		
		mysql_query($sql1) or die("Üretim giriş tablosuna giriş olmadı!");	
		
		
		$sql2="insert into hareket (ilk_h_id,hareket_tipi,depo_kodu,h_stok_kodu,miktar,parti_no,kasa_no,sicil_no,tarih) ";
		$sql2.="values(";
		$sql2.="'0',";
		$sql2.="'G',";
		$sql2.="'Montaj',";
		$sql2.="'".$_POST['urun_kodu']."',";
		$sql2.="'".$_POST['miktar']."',";
		$sql2.="'',";
		$sql2.="'',";
		$sql2.="'".$_POST['users']."',";
		$sql2.="'".$_POST['tarih']."'";
		$sql2.=")";
				
		mysql_query($sql2) or die("Hareket tablosuna yeni girişler olmadı!");
		
		
		mysql_close($con);
		
		$insertGoTo = "uretim.php?key=0&secim=montaj&sec=giris";
		header(sprintf("Location: %s", $insertGoTo));

giriş yapılan bilgisayarlarda ubuntu kurulu.
 

mgsmus

Asistan
Katılım
1 Aralık 2009
Mesajlar
126
Reaksiyon puanı
5
Puanları
0
İlk yazdığınız kodlara göre formunuzda 8 tane alan var. durus1, durus2,durus3... şeklinde. Döngü içerisinde hepsini kontrol ettirip boş değillerse kayıt yaptırıyorsunuz. Ama dediğinize göre bazen çift kayıt yapıyor. Benim aklıma gelen formda alanların name kısmında bir hata olduğu. Acaba durus1, durus2, durus3, durus3, durus5,durus6,durus7,durus8 şeklinde bi hata yapmış olabilir misiniz? Yani aynı ada sahip iki alan olabilir mi formda?
 

yuci308

Asistan
Katılım
7 Haziran 2008
Mesajlar
107
Reaksiyon puanı
2
Puanları
18
İlk yazdığınız kodlara göre formunuzda 8 tane alan var. durus1, durus2,durus3... şeklinde. Döngü içerisinde hepsini kontrol ettirip boş değillerse kayıt yaptırıyorsunuz. Ama dediğinize göre bazen çift kayıt yapıyor. Benim aklıma gelen formda alanların name kısmında bir hata olduğu. Acaba durus1, durus2, durus3, durus3, durus5,durus6,durus7,durus8 şeklinde bi hata yapmış olabilir misiniz? Yani aynı ada sahip iki alan olabilir mi formda?

şimdi tekrar kontrol ettim ama hata yok.
 

Uso!

Doçent
Katılım
10 Ağustos 2010
Mesajlar
947
Reaksiyon puanı
27
Puanları
18
Kodunuz biraz karışık, anladığım kadarıyla;
durus1, durus2, durus3 ... durus8
bant_makina1, bant_makina2, ... bant_makina8
sure1, sure2, ... sure8
aciklama1, aciklama2, ... aciklama8

alanlarına ve bunların haricinde bir kaç ortak bölüm de var formunuzda.Kod kısmından gördüğüm kadarıyla da ikilemeyi yapabilecek bir şey olduğunu sanmıyorum, bir kaç kez POST gönderip, dosyayı işlediğiniz kısımda print_r yaptırarak POST'un içeriğine bakın.Oradan belki ne durumda ikili olarak geldiğini çözebilme şansınız var.

Eğer yanlış bir durum çıkmıyorsa POST'da gözüken, iki kez arka arkaya (tıklanıp) gönderiliyordur.
 

Turab Garip

Dekan
Emektar
Katılım
30 Mayıs 2007
Mesajlar
6,887
Reaksiyon puanı
175
Puanları
63
@uso!, kodda sorun olsa herkeste olur, onlarca kişi kullanıyor, sadece benim girdiğim kayıtta sorun oluyor. Ki zaten kod sadece POST'u toplayıp tek satırda mail atıyor o kadar. Hiçbir döngü de yok. Bir nevi anektod olsun diye paylaştım, bu arkadaşın durumu farklı olabilir.
 

N3CAT1

Dekan
Emektar
Katılım
20 Nisan 2008
Mesajlar
6,609
Reaksiyon puanı
144
Puanları
63
İşte masaüstü programlamanın üstünlüğü burda ortaya çıkıyor. Örneğin Visual Studio 'da böyle bir durumda breakpoint vasıtasıyla kodları satır satır çalıştırıp nerde hangi değeri alıyor görebilirdik.

Sanırım asp.net 'de bu mümkün ama php 'de bunu yapabilen bi ide yok sanırım.
 

Turab Garip

Dekan
Emektar
Katılım
30 Mayıs 2007
Mesajlar
6,887
Reaksiyon puanı
175
Puanları
63
İşte masaüstü programlamanın üstünlüğü burda ortaya çıkıyor. Örneğin Visual Studio 'da böyle bir durumda breakpoint vasıtasıyla kodları satır satır çalıştırıp nerde hangi değeri alıyor görebilirdik.

Sanırım asp.net 'de bu mümkün ama php 'de bunu yapabilen bi ide yok sanırım.

Yanlış değerlendirme hocam. Visual Studio bir çeşit IDE'dir ve PHP için de IDEler vardır, dolayısıyla PHP'de de breakpoint koyarak debug yapabilirsin ve neyin nerede ne değer aldığını görebilirsin. Fakat burada değer almada sorun yok; sonuç üretmede herhangi bir hata ve istenmeyen durum yok. Tek sorun, istenen sonuçların bir kaç defa üretilmiş olması.
 

N3CAT1

Dekan
Emektar
Katılım
20 Nisan 2008
Mesajlar
6,609
Reaksiyon puanı
144
Puanları
63
Visual Studio 'nun ide olduğunu biliyorum üstad. Sadece idelerin masaüstü programlamada daha becerikli olduğunu belirtmek istemiştim :)

Aynı şekilde web programlama için kullanılan idelerin çok becerikli olduklarını düşünmüyorum. En azından benim kullandığım zamanlar (~2 yıl önce) öyleydi. Şimdileri nasıl bilmiyorum.
 
Üst