v2.5.2
Giriş yap

sorguyu oturtamamak

emmir2
308 defa görüntülendi

Merhabalar 3 adet premium paketim mevcut kullanıcı kayıt olduğu zaman bu 3 pakette 1 hafta olarak hediye ediliyor 1 hafta sonra premium süresi bitiyor buraya kadar sorunum yok

Ek olarak satın alırsa 1 yıl 1 hafta 1 hafta olarak süreleri mevcut

şimdi benim mantık hatası yaptığım nokta hediye olarak verilen premium süresi dolunca o kodlar hep aktif kalmakta ben ek olarak paket satın alımı gerçekleştirsem bile otomatik olarak veriyi 0 yapıyor koşulları kafam da oturtamadım daha doğrusu yardımcı olacak varmı

  @$pretarih = $preControl['date'];
  @$kayitTarihi = $userControl['kayit_tarihi'];

  $premiumbitisi = date('Y-m-d H:i:s', strtotime($kayitTarihi. ' + 1 weeks'));
  if($premiumbitisi < date('Y-m-d H:i:s')){
      $islem = $db->prepare("UPDATE emlakci SET premium_1 = ? WHERE id = ?");
      $islem = $islem->execute(array(0,$userControl['id']));
    }

  $premium2bitisi = date('Y-m-d H:i:s', strtotime($kayitTarihi. ' + 1 weeks'));
  if($premium2bitisi < date('Y-m-d H:i:s')){
      $islem = $db->prepare("UPDATE emlakci SET premium_2 = ? WHERE id = ?");
      $islem = $islem->execute(array(0,$userControl['id']));
    }

     $premium3bitisi = date('Y-m-d H:i:s', strtotime($kayitTarihi. ' + 1 weeks'));
  if($premium3bitisi < date('Y-m-d H:i:s')){
      $islem = $db->prepare("UPDATE emlakci SET premium_3 = ? WHERE id = ?");
      $islem = $islem->execute(array(0,$userControl['id']));
    }

    $premiumbitisii = date('Y-m-d H:i:s', strtotime($pretarih. ' + 1 years'));
  if($premiumbitisii < date('Y-m-d H:i:s')){
      $islem = $db->prepare("UPDATE emlakci SET premium_1 = ? WHERE id = ?");
      $islem = $islem->execute(array(0,$userControl['id']));
      if ($islem) {
        $islem = $db->prepare("UPDATE premium_uyelik SET premium_1 = ? WHERE id = ?");
        $islem = $islem->execute(array(0,$userControl['id']));
      }
    }

    $premium2bitisii = date('Y-m-d H:i:s', strtotime($pretarih. ' + 1 weeks'));
  if($premium2bitisii < date('Y-m-d H:i:s')){
      $islem = $db->prepare("UPDATE emlakci SET premium_2 = ? WHERE id = ?");
      $islem = $islem->execute(array(0,$userControl['id']));
      if ($islem) {
        $islem = $db->prepare("UPDATE premium_uyelik SET premium_2 = ? WHERE id = ?");
        $islem = $islem->execute(array(0,$userControl['id']));
      }
    }


    $premium3bitisii = date('Y-m-d H:i:s', strtotime($pretarih. ' + 1 years'));
  if($premium3bitisii < date('Y-m-d H:i:s')){
      $islem = $db->prepare("UPDATE emlakci SET premium_3 = ? WHERE id = ?");
      $islem = $islem->execute(array(0,$userControl['id']));
      if ($islem) {
        $islem = $db->prepare("UPDATE premium_uyelik SET premium_3 = ? WHERE id = ?");
        $islem = $islem->execute(array(0,$userControl['id']));
      }
    }
ebykdrms
645 gün önce

O zaman sanırım veritabanında tuttuğunuz verilerle ilgili bir sorun olabilir.
emlakci tablonuzda premium_1, premium_2 ve premium_3 adında sütunlarınız var.
Ayrıca premium_uyelik tablonuzda da bu alanlar var.
Hem emlakci hem de premium_uyelik tablolarından kayıt çekerken tek bir id değeri kullanıyorsunuz. Sanırım bir üye kaydı yaptığınızda üyenin 2 tabloda da kaydını oluşturuyorsunuz ve id'lerin böylece aynı olmasını sağlıyorsunuz. Burada bir sorun var gibi geldi bana.
Eğer premium üyelikleri ayrı bir tabloda tutacaksanız, emlakci tablonuzda 3 adet premium durumu tutmak yerine premium_uyelik tablosuyla ilişki kurabileceğiniz 1 adet premium_uyelik_id adlı sütununuz olmalı. Yani:
emlakci tablosu sütunları: id, kayit_tarihi, premium_uyelik_id şeklinde olmalı.
Buradaki premium_uyelik_id sütunu, kullanıcının premium üyeliği varsa premium_uyelik tablosuna kaydedildiği id değerini tutmalı. Kullanıcı premium üyelik almamışsa bu değer 0 olmalı.
Siz ilk kez sisteme kaydolan kullanıcıya direkt 1 haftalık premium paketlerini hediye ettiğiniz için kullanıcı kayıt olduğu anda iki tabloda da kullanıcıya kayıt açmalısınız ve premium_uyelik tablosunda kullanıcının id değerini alıp emlakci tablosundaki premium_uyelik_id sütununa yazmalısınız.
Böylece artık emlakci tablosunda sadece üyenin herhangi bir premium paketi olup olmadığını tutmuş olacaksınız. Premium detaylarını da premium_uyelik tablosunda tutuyorsunuz zaten.
Daha sonra bir premium paketinin bitiş tarihini nasıl hesaplayacağınızı kurgulamak lazım. Burada hesaplamayı "+1 week" şeklinde yapmamalısınız.
premium_uyelik tablosunda kayıt oluştururken zaten ne süreyle premium üyelik verdiğinizi biliyorsunuz. Bu yüzden bu tabloda paketin bitiş tarihini tutmalısınız. Mesela premium_1 sütununda, bu üyenin 1. premium paketinin hangi tarihte sona ereceği bilgisi direkt tutulabilir. Eğer kullanıcı bu paketi hiç almamışsa buranın değeri NULL olur.

Böylece örneğin şöyle bir veritabanı yapısına kavuştuk:

emlakci

id: 123
kayit_tarihi: '2022-06-23 15:55:24'
premium_uyelik_id: 23

premium_uyelik

id: 23
premium_1: '2022-06-30 15:55:24'
premium_2: '2022-06-30 15:55:24'
premium_3: '2022-06-30 15:55:24'

Bu üye sisteme 23 Haziran'da kaydolmuş. Biz de kayıt tarihinden itibaren 1 hafta sonra sonlanmak üzere 3 premium paketi de vermişiz.
Sonra mesela bu üye paketleri incelemiş ve premium_2 paketini beğenip 1 aylığına almak istemiş olsun.
O zaman bu üyenin premium_uyelik_id sütununa bakarak 23 değerini elde ederiz.
premium_uyelik tablosundaki id=23 olan sütunun premium_2 sütunundaki tarihi alırız.
Bu tarih geçmiş bir tarih mi?
EVET: O zaman premium_2 alanına bugünün şu anından itibaren 1 ay sonrasının tarihini yazarız.
HAYIR: O zaman premium_2 alanındaki tarihi alır, bu tarihe 1 ay ekler, yeni tarihi buraya yazarız.

Böylece premium_uyelik tablosunun id=23 satırının son hali şöyle olur:
id: 23
premium_1: '2022-06-30 15:55:24'
premium_2: '2022-07-30 15:55:24' (1 hafta + 1 ay)
premium_3: '2022-06-30 15:55:24'

Kontrollerimizi yaparken artık işimiz çok kolay. Üyenin herhangi bir premium üyeliği var mı diye emlakci tablosundaki premium_uyelik_id değerine bakarız. Bu değer NULL veya 0 değilse belli ki premium üyeliği var veya daha önce en az bir kere premium üyelik almış. (Tabi siz kaydolan her müşteriye premium verdiğiniz için bu mecburen olacak)
Sonra bu değer ile premium_uyelik tablosuna gider, her bir premium paket için kayıtlı tarihi kontrol ederek günü geçmiş mi diye bakarız.
Günü geçmemiş olanlar aktiftir. Günü geçmiş olanları umursamamıza gerek yok.

Uzun bir cevap oldu. Umarım anlaşılır olmuştur. Kurgu yazması kolay. Kodlamasında kolay gelsin... :)