Merhaba
Bugün veritabanında php ile tabloya veri girerken aynı kullanıcı adının iki kere kayıt edilmesine php ile izin vermediğim tabloda aynı kullanıcı isimli birsürü kayıt gördüm,kodu inceledim daha sonra arkadaşıma incelettim yaklaşık 2 saat inceledik toplasanız 20 satır kod var ama php tarafında bir sorun göremedik klasik count sorgusu ile kullanıcı adını sorgulayıp eğer dönen değer sıfır ise tabloya veri girişi yapan bir kod.Nasıl olurda aynı kayıtları defalarca girmeye müsade etmiş olabilir sizce ?
Not:Alanı unique ver demeyin ben sorunun kaynağına inip halletmek istiyorum.
Not 2:Veritabanı yük altında çalışan yoğun bir veritabanı
Mysql cache mi yapıyor ?
11
●757
- 13-05-2014, 14:15:44Üyeliği durduruldubu soruya cevap verebilmek için aynı olan kayıtlardan ve aynı kaydın olup olmadığını kontrol eden sorgulardan örnek görmeliyiz ki davranış analizi yapabilelim.
en azından bu veriler olmadan ben net cevap veremem.
bu tür çözümler istemediğin için sorgunu kontrol edip gerekiyorsa düzeltmeliyiz.tolgay007 adlı üyeden alıntı: mesajı görüntüle - 13-05-2014, 15:17:04yakoSin adlı üyeden alıntı: mesajı görüntülegallisene adlı üyeden alıntı: mesajı görüntüle
Codeigniter kullanıyorum
$this->db->where('username',$username); $this->db->where('ip',$ip); $this->db->where('icerik',$icerik); $sayim=$this->db->count_all_results('icerik_list');Sayım kodu bu şekilde,eğer $sayim değişkeni 0 ise ekle 1 ise sil işlemi yapıyorum,bu $sayim değişkeni 0 dönüyorki tekrar ekleme yapıyor.Kullanıcılara danıştım bu aslında bir buton arka arkaya sürekli tıklayınca eklendiğini söylediler.Var mı bir fikriniz ?
Edit:Bu arada codeigniterın database config dosyasında cache modu var o false durumda. - 13-05-2014, 15:37:15Üyeliği durdurulduphp kodu tam anlamıyorum ama buna cevap verebilirsen anlayabilirim kodunu..
aynı kullanıcı adı aynı ip ve aynı içerik bilgisi olanları mı listelemeye çalısıyorsun.. eğer böyleyseip yada içerik değiştiğinde kullanıcı adı aynı da olsa sonuç 0 döner üçününde tam eşleşmesi gerekir.
aynı kullanıcı adı yada aynı ip ya da aynı içerik anlamına geliyorsa kodun dediğin gibi bellekten alıyor olabilir. ki butona arka arkaya tıklanma senaryosuna göre böyle olmalı. bu tür durumlarda sorunun temelinden çözüm istediğin için en mantıklı olanı kodların içerisinde bu tür sorgu veya veriler olmamasıdır.
bu sorguları doğrudan veritabanında yapacak bir store procedure vs ile kullanırsanız anlık kayıt verilerini alabilirsiniz.
cache modu ile ilgili düzenlemede yapılabilir eğer böyleyse ama sorunun asıl çözümü işi veritabanında yapmaktır.
cache işlemindeki asıl amaç sık değişmeyen verileri hafızaya alarak performans artışı yapmak olsa gerek. butona arka arkaya tıklandığında sık değişen veriler söz konusu oluyor.
kusura bakmayın yazdığınız dile çok hakim olmadığımdan teorik olarak fikirlerimi paylaşabiliyorum ancak - 13-05-2014, 16:04:25Hocam o 3 değeri düşünün meselagallisene adlı üyeden alıntı: mesajı görüntüle
Kullanıcı adı:tolgay007
Ip:123456789
İçerik:deneme
şu veriyi düşünün bunu veritabanına ekledik birebir aynı kayıt 2. ye eklenmemeli o 3 değerden biri değiştiğinde eklenmeli ama birebir 3 değer veritabanındaki bir satırda olduğu halde tekrar eklenmemeli.
Aslında zaten kodluk pek bir durum yok kod cok basit phpye başlangıç yani olay veritabanında bencede. - 13-05-2014, 16:16:41Üyeliği durduruldueğer 3 ü aynıysa o sorgu şu anlama geliyor olmalı
where usermane=@username and ip=@ip and icerik =@icerik
bu durumda ve butona arka arkaya tıklandığı senaryosunu dikkate almadığımızda
veritabanına anında kayıt yapmıyor ve biriktirip toplu olarak kayıt yapıyor olabilir
böyle düşünürsek
bu sorgu kodlama yerine veritabanında çalışırsa böyle bir sorun oluşmayacaktır.
kod where usermane=@username or ip=@ip or icerik =@icerik anlamına gelseydi 3 ünden biri denk geldiği için yine 0 gelme ihtimali olmazdı.
ip değişimi oluyor mu bu önemli tabi
birde içerik çok genel bi kavram bilmiyorum sisteminizin çalışma şeklini ama içerikte boşluklar noktalar vs bişeyler değişirse sonuç 0 dönecektir.
kodunuzun çalışma prensibine hakim olmak için sql sorgu penceresinde 1 adet var olan kayıdı yeniden insert etmeyi deneyebilirsiniz. ya da arka arkaya aynı bilgilerle 3 defa insert etmeyi. sql sorgusu kullandığınızda insert işlemi yapmayacaktır diye düşünüyorum. - 13-05-2014, 17:15:45İçerik dediğime bakmayın aslında tek harf o ben anlatım basit olsun diye değiştirdim,içerik dediğimiz alan "a" yada "b" değerini alıyor.Mysqlden indeks ekledim 3 alanı birbirine bağlayıp unique verdim bu şekilde çözdüm ama ben sorunun neden kaynaklandığını bulmak istiyorum,aynı sorunu üyelik açarkende aynı kullanıcıdan alt alta 2-3 defa oluşturulduğundada yaşamıştım yine aynı mantıkta çalışan bir koddu sonra kullanıcı adına unique verererek çözmüştüm şimdi yine çıktı bu sorun başıma.gallisene adlı üyeden alıntı: mesajı görüntüle
- 13-05-2014, 17:37:10Üyeliği durduruldukodlarınızın doğru olduğunu varsayıyorum öyle de görünüyor.. mantık olarak kodların önbelleğe alınıyor ama where koşulunda istediğin şeyler ön belleğe alınan sorguları görmüyor. daha eski kayıtlara bakıyor.
2. ihtimal ise kayıtları anında yapıyor ki insert sorguları genelde bekletilmez. ama select count u dataadapter mantığıyla önceden belleğe alıp veritabanındaki veriyle değil var olanla çekiliyor. yani 10 kayıt bulunan veritabanı hafızaya geliyor ve 11. eklendikten sonra hafıza güncellenmiyor ya da güncellenmesi zaman alıyor.
yoğun bir veritabanı olduğundan bir çok işlem de zamanlama sorunu yaşanabilir.
elle sql de bir sorgu çalıştırdığınızda select * from yogunbirtablo gibi ne kadar sürede cevap geliyor bunu dikkate almak lazım. ama ne olursa olsun ya bu sorguları store procedure ile uygulayıp işi veritabanı tarafında yapmanız ya da cache olayını derinlemesine analiz edip insert işlemi sırasında kullanmamanız sorunu çözebilir.
daha basit çözümler içinde kısa aralıklarla birden fazla kayıt eklenen bir sistem değilse buton enable özelliğiyle birden fazla tıklamayı engelleyebilir ya da iki kayıt arasında 3-5 saniye bir limit koyabilirsiniz.