• 19-09-2022, 02:24:02
    #1
    İçerik Editörü
    Merhaba arkadaşlar.
    Sorunumu açıklamadan önce veritabanında bulunan iki adet tablomu kısaca özetlemek istiyorum.

    Tablo-1: tbl_users
    sütun-1: users_refcode
    sütun-2: sub_references

    Tablo-2: dep
    sütun-1: dep_amnt

    Açıklama: Sistem referans kodu ile üyelik. Mesela, giriş yapmış olan kullanıcının referans kodu ile üye olan kullanıcıların girdikleri veriler "dep" tablosuna kaydediliyor. Buraya kadar sıkıntı yok. Sorun şuradaki giriş yapmış olan kullanıcı, kendi sayfasında bu referanslarının olduğu bir tabloda, referansların girdikleri verileri görebilmeli.
    Bunun için foreach döngüsü kullandım ama sadece "tbl_users" tablosundan alt üyeler geliyor ama "dep" tablosundan veri gelmiyor. Kodlarım aşağıdaki gibidir.

    Aşağıda fonksiyonumu görebilirsiniz:

    public function subs_usrefcode(){
        $cek_user_sql ="SELECT * FROM `tbl_users` LEFT JOIN `dep` ON `tbl_users`.`subs_references` = `tbl_users`.`user_refcode`";
        $cek_user_stmt = $this->db->pdo->prepare($cek_user_sql);
        $cek_user_stmt->execute();
        $cek_user_return=$cek_user_stmt->fetchAll();
    
        $subs_references = isset($cek_user_return['subs_references']);
        $userfererencescode = isset($cek_user_return['user_refcode']);
    
        if ($cek_user_return){
    
          if ($userfererencescode == $subs_references){
              return $cek_user_return;
          }else{
            echo 'hata';
          }
        }
    }
    Aşağıda da fonksiyonu çektiğim referanslar sayfamın kodları yer alıyor.

    <tbody>
                        <?php
                        //$selectAllUserData = $users->selectAllUserData();
                        
                        $subs_usrefcode = $users->subs_usrefcode();
                          $i = 0;
                          foreach ($subs_usrefcode as $value) {
                            $i++;
                            if($user_refcode === $value['subs_references']){
                            ?>
                            <tr>
                                <td id="card"><?php echo $value['dep_amnt']; ?> </td>
                                <td><?php echo $value['username']; ?> </td>
                                <td><?php echo $value['dep_date']; ?> </td>
                            </tr>
                        <?php } } ?>
                            <?php 
                                function percentcalc($sayi,$yuzde,$per){ 
                                return ($sayi*$yuzde)/100+$per;
                                }
                            ?>
                            <tr>
                               <td></td>
                               <td class="text-right" tot="tot">Total Earnings</td>
                               <td id="total"></td>
                               <td></td>
                            </tr>
                        </tbody>
    iki gündür denemediğim yöntem kalmadı ama olmuyor arkadaşlar. Lütfen yardım edin.
  • Kabul Edilen Cevap
    • Sizin için de uygunsa özel mesajla anydesk ya da teamviewer bilgisi atın, öyle bakalım.

      edit: çıkmam gerekiyor malesef. eğer çözemezseniz akşam tekrardan yardımcı olabilirim. backtick ile alakalı hata vermiş olabilir. sql sorgunuzu aşağıdaki gibi deneyebilirsiniz.

      public function subs_usrefcode($user_id = '')
      {
           $query = "
                SELECT
                     `user`.*,
                     `referral`.*
                FROM `tbl_users` AS `user`
                LEFT JOIN `def` AS `referral`
                     ON `referral`.`def_refcode` = `user`.`user_refcode`
                WHERE `user`.`id` = ?
           ";
           $stmt = $this->db->pdo->prepare($query);
           $stmt->execute(array($user_id));
           $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
           return $result;
      }
  • 19-09-2022, 07:04:39
    #2
    Bu konu biraz kafa karıştırıcıdır. Ben elimden geldiğince anlatmaya ve sorununuza çözüm bulmaya çalışacağım.

    Öncelikle tablo yapınızı bilmiyorum ama sorgunuzdan ve genel düzeninize baktığımda hatalı olduğunu anlıyorum. Aşağıdaki gibi örneği kendinize göre revize edebilirsiniz/etmelisiniz.

    #tbl_users (kullanıcılar)
    - id
    - username
    - user_email
    - user_password
    .
    .
    - user_referance_code


    #tbl_referrals (referansları listelediğiniz tablo)
    - id
    - referrer_user_id (hangi kullanıcının ref kodu kullanıldıysa onun ID'si)
    - referred_id (referans kodu ile kayıt olan yeni kullanıcının ID'si)
    - amount (sanırım burada bir komisyon veriyorsunuz)
    - created_at (oluşturma tarihi)


    şimdi sorgunuz aşağıdaki gibi olmalı:
    SELECT
        user.*,
        referral.*,
    FROM tbl_users AS user
    LEFT JOIN tbl_referrals AS referral
        ON user.user_id = referral.referrer_user_id
    Sorgularınızı benim gibi yazarsanız okuması daha kolay olur. Burada yaptığımız şey, iki tabloda birbiriyle eşleşen sütunları kullanmak. Daha sonra fonksiyonunuzu aşağıdaki gibi düzenlemelisiniz.

    public function subs_usrefcode($user_id = '')
    {
         $query = "
              SELECT
                   user.*,
                   referral.*,
              FROM tbl_users AS user
              LEFT JOIN tbl_referrals AS referral
                   ON user.user_id = referral.referrer_user_id
              WHERE user.user_id = ?
         ";
         $sth = $this->db->pdo->prepare($query);
         $sth->execute(array($user_id));
         $result = $sth->fetchAll(PDO::FETCH_ASSOC);
    
         return $result;
    }
    listeleme sayfanızı da aşağıdaki gibi düzenleyin

    <tbody>
         <?php
         $user_referrals = $users->subs_usrefcode(HANGİ_KULLANICININ_REFERANSLARINI_LİSTELEYECEKSENİZ_ID'SINI_BURAYA_YAZDIRIN);
         foreach ($user_referrals as $key => $ref):
         ?>
         <tr>
              <td id="card"><?php echo $ref['dep_amnt']; ?> </td>
              <td><?php echo $ref['username']; ?> </td>
              <td><?php echo $ref['dep_date']; ?> </td>
         </tr>
         <?php endforeach; ?>
         <tr>
              <td></td>
              <td class="text-right" tot="tot">Total Earnings</td>
              <td id="total"></td>
              <td></td>
         </tr>
    </tbody>
    eğer sizin kodlarınızda db bağlantısı vs sorunsuz bir şekilde oluyorsa oluşturduğum kodlar ile herhangi bir kullanıcının referanslarını listeleyebileceksiniz. Tabiki tüm bunlar örnek olarak yapıldı. Siz kendinize göre gerekli sütunları ekleyip, silebilirsiniz.


    Eğer öğrenmek istiyorsanız;
    Yukarıda anlattıklarım sorununuzu çözecektir ama işin doğrusu değildir ve kesinlikle bu şekilde uygulanmamalıdır. Mysql'de hiyerarşik veri saklamak için bir çok model var. Sizin yapmak istediğinizin adı "The Nested Set Model (İç içe Küme Modeli)"dir. Daha spesifik arama yapmak isterseniz "Multi Level Nested Referral System" anahtar kelimesini kullanabilirsiniz. Bu modellerle ilgili github'ta, youtube'da bir çok örnek/kütüphane/anlatım bulabilirsiniz ya da aşağıya ekleyeceğim bağlantıları kontrol edebilirsiniz. Kolaylıklar.

    http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
    https://www.w3schools.com/mysql/mysql_join.asp
  • 19-09-2022, 09:41:32
    #3
    İçerik Editörü
    ozanalkancomtr adlı üyeden alıntı: mesajı görüntüle
    Bu konu biraz kafa karıştırıcıdır. Ben elimden geldiğince anlatmaya ve sorununuza çözüm bulmaya çalışacağım.

    Öncelikle tablo yapınızı bilmiyorum ama sorgunuzdan ve genel düzeninize baktığımda hatalı olduğunu anlıyorum. Aşağıdaki gibi örneği kendinize göre revize edebilirsiniz/etmelisiniz.

    #tbl_users (kullanıcılar)
    - id
    - username
    - user_email
    - user_password
    .
    .
    - user_referance_code


    #tbl_referrals (referansları listelediğiniz tablo)
    - id
    - referrer_user_id (hangi kullanıcının ref kodu kullanıldıysa onun ID'si)
    - referred_id (referans kodu ile kayıt olan yeni kullanıcının ID'si)
    - amount (sanırım burada bir komisyon veriyorsunuz)
    - created_at (oluşturma tarihi)


    şimdi sorgunuz aşağıdaki gibi olmalı:
    SELECT
        user.*,
        referral.*,
    FROM tbl_users AS user
    LEFT JOIN tbl_referrals AS referral
        ON user.user_id = referral.referrer_user_id
    Sorgularınızı benim gibi yazarsanız okuması daha kolay olur. Burada yaptığımız şey, iki tabloda birbiriyle eşleşen sütunları kullanmak. Daha sonra fonksiyonunuzu aşağıdaki gibi düzenlemelisiniz.

    public function subs_usrefcode($user_id = '')
    {
         $query = "
              SELECT
                   user.*,
                   referral.*,
              FROM tbl_users AS user
              LEFT JOIN tbl_referrals AS referral
                   ON user.user_id = referral.referrer_user_id
              WHERE user.user_id = ?
         ";
         $sth = $this->db->pdo->prepare($query);
         $sth->execute(array($user_id));
         $result = $sth->fetchAll(PDO::FETCH_ASSOC);
    
         return $result;
    }
    listeleme sayfanızı da aşağıdaki gibi düzenleyin

    <tbody>
         <?php
         $user_referrals = $users->subs_usrefcode(HANGİ_KULLANICININ_REFERANSLARINI_LİSTELEYECEKSENİZ_ID'SINI_BURAYA_YAZDIRIN);
         foreach ($user_referrals as $key => $ref):
         ?>
         <tr>
              <td id="card"><?php echo $ref['dep_amnt']; ?> </td>
              <td><?php echo $ref['username']; ?> </td>
              <td><?php echo $ref['dep_date']; ?> </td>
         </tr>
         <?php endforeach; ?>
         <tr>
              <td></td>
              <td class="text-right" tot="tot">Total Earnings</td>
              <td id="total"></td>
              <td></td>
         </tr>
    </tbody>
    eğer sizin kodlarınızda db bağlantısı vs sorunsuz bir şekilde oluyorsa oluşturduğum kodlar ile herhangi bir kullanıcının referanslarını listeleyebileceksiniz. Tabiki tüm bunlar örnek olarak yapıldı. Siz kendinize göre gerekli sütunları ekleyip, silebilirsiniz.


    Eğer öğrenmek istiyorsanız;
    Yukarıda anlattıklarım sorununuzu çözecektir ama işin doğrusu değildir ve kesinlikle bu şekilde uygulanmamalıdır. Mysql'de hiyerarşik veri saklamak için bir çok model var. Sizin yapmak istediğinizin adı "The Nested Set Model (İç içe Küme Modeli)"dir. Daha spesifik arama yapmak isterseniz "Multi Level Nested Referral System" anahtar kelimesini kullanabilirsiniz. Bu modellerle ilgili github'ta, youtube'da bir çok örnek/kütüphane/anlatım bulabilirsiniz ya da aşağıya ekleyeceğim bağlantıları kontrol edebilirsiniz. Kolaylıklar.

    http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
    https://www.w3schools.com/mysql/mysql_join.asp
    Merhaba Ozan Bey.
    Öncelikle emek verip açıkladığınız için çok teşekkür ederim. Sanırım gece sersemliği olacak ben tam olarak anlatamadım. Aşağıda veritabanı tablolarımı görebilirsiniz.

    tbl_users tablosu: Giriş yapan kullanıcının refererans olarak başkalarına vereceği referans kodu (üye olurken oluşturuluyor) "user_refcode" sütununda saklanıyor. Eğer bu üye başkasının referans kodu ile üye olduysa o kod "subs_references" sütununda saklanıyor. Bu kodda referansı olduğu kullanıcının "user_refcode" üye olurken oluşturulan referans kodu oluyor.


    Aşağıda kullanıcının detayını görebilirsiniz. (mobil tamamen hayal ürünüdür bana ya da birisine ait değil.)



    Aşağıda da depo bilgilerinin yer aldığı ve kullanıcıların bura ait verileri bu tabloya sürekli işleyebildiği bir bölüm ve her kullanıcı kendi ref kodu ile "dep" tablosunun "dep_refcode" sütunu ile eşleşerek verileri girebiliyor. yani ben hangi kullanıcı ne kadar veri girmiş bunu rahatlıkla listeleyebiliyorum


    Aşağıda kodun çıktısını göreceksiniz. Giriş yapmış kullanıcının 4 adet alt kullanıcısı var (Ayşe, Şeyda, dedene, fatma"demo oldukları için rastgele yaptım") ve bunlar "dep" tablosuna veri yazdırmışlar. ben elimdeki kodlar ile bu 4 kullanıcının kullanıcı adlarını, referans kodlarını ve diğer bilgilerini alabiliyorum. Ama dep tablosuna girdikleri veriyi alamıyorum. ekran görüntüsünde de göreceğiniz üzere, dep tablosunda yer alan her bilgi için kullanıcılar sürekli tekrarlanıyor. Aslında o kullanıcıların "user_refcode" sütunları ile "dep" tablosuna veri girerken oluşturulan "dep_refcode" sütunları aynı ama ben bunları bir türlü eşleştiremedim


    Umarım bu şekilde daha açıklayıcı olmuştur. Şayet zahmet olmazsa bu bilgiler üzerinden yardımcı olabilir misiniz rica etsem. biliyorum size tekrardan zahmet vereceğim ama bu işi öğrenmeye çalışıyorum henüz ve bunu yapmam gerekiyor
  • 19-09-2022, 10:53:35
    #4
    Fonksiyonunuzu aşağıdaki düzenleyin.

    public function subs_usrefcode($user_id = '')
    {
         $query = "
              SELECT
                   user.*,
                   referral.*,
              FROM tbl_users AS user
              LEFT JOIN def AS referral
                   ON user.user_refcode = referral.def_refcode
              WHERE user.id = ?
         ";
         $stmt = $this->db->pdo->prepare($query);
         $stmt->execute(array($user_id));
         $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
         return $result;
    }
    Tablonuzu da aşağıdaki gibi oluşturabilirsiniz.

    <tbody>
         <?php
         $user_referrals = $users->subs_usrefcode(HANGİ_KULLANICININ_REFERANSLARINI_LİSTELEYECEKSENİZ_ID'SINI_BURAYA_YAZDIRIN);
    
         foreach ($user_referrals as $key => $ref):
         ?>
         <tr>
              <td id="card"><?php echo $ref['dep_amnt']; ?> </td>
              <td><?php echo $ref['username']; ?> </td>
              <td><?php echo $ref['dep_date']; ?> </td>
         </tr>
         <?php endforeach; ?>
         <tr>
              <td></td>
              <td class="text-right" tot="tot">Total Earnings</td>
              <td id="total"></td>
              <td></td>
         </tr>
    </tbody>
    Fakat tbl_users tablosunda sub_references sütunu o şekilde olmamalı. Türü INT olmalı ve hangi kullanıcı referans olduysa onun ID'sini yazdırmalısınız. Aynı şekilde def_refcode için de geçerli. Bu şekilde de çalışır ama performans açısından ve uygunluk bakımından dediğim gibi yapmalısınız. Bu şekilde ayrıca gereksiz veri tutmuş olursunuz. MySQL ilişkisel bir veritabanıdır. Mantığını kavrayabilmeniz için youtube'da birçok örnek mevcut. Bunlar size mutlaka ilham verecektir.

    Yeni bir kullanıcı kayıt yaptırırken gelen referans kodunu tbl_users tablosunda aratacaksınız (SELECT * FROM tbl_users WHERE user_refcode = ?). eğer sonuç varsa kayıt olan kullanıcının ilgili sütununa yazdıracaksınız. Öyle bir kullanıcı yoksa da 0 yazdıracaksınız.
  • 19-09-2022, 11:21:55
    #5
    İçerik Editörü
    ozanalkancomtr adlı üyeden alıntı: mesajı görüntüle
    Fonksiyonunuzu aşağıdaki düzenleyin.

    public function subs_usrefcode($user_id = '')
    {
         $query = "
              SELECT
                   user.*,
                   referral.*,
              FROM tbl_users AS user
              LEFT JOIN def AS referral
                   ON user.user_refcode = referral.def_refcode
              WHERE user.id = ?
         ";
         $stmt = $this->db->pdo->prepare($query);
         $stmt->execute(array($user_id));
         $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
         return $result;
    }
    Tablonuzu da aşağıdaki gibi oluşturabilirsiniz.

    <tbody>
         <?php
         $user_referrals = $users->subs_usrefcode(HANGİ_KULLANICININ_REFERANSLARINI_LİSTELEYECEKSENİZ_ID'SINI_BURAYA_YAZDIRIN);
    
         foreach ($user_referrals as $key => $ref):
         ?>
         <tr>
              <td id="card"><?php echo $ref['dep_amnt']; ?> </td>
              <td><?php echo $ref['username']; ?> </td>
              <td><?php echo $ref['dep_date']; ?> </td>
         </tr>
         <?php endforeach; ?>
         <tr>
              <td></td>
              <td class="text-right" tot="tot">Total Earnings</td>
              <td id="total"></td>
              <td></td>
         </tr>
    </tbody>
    Fakat tbl_users tablosunda sub_references sütunu o şekilde olmamalı. Türü INT olmalı ve hangi kullanıcı referans olduysa onun ID'sini yazdırmalısınız. Aynı şekilde def_refcode için de geçerli. Bu şekilde de çalışır ama performans açısından ve uygunluk bakımından dediğim gibi yapmalısınız. Bu şekilde ayrıca gereksiz veri tutmuş olursunuz. MySQL ilişkisel bir veritabanıdır. Mantığını kavrayabilmeniz için youtube'da birçok örnek mevcut. Bunlar size mutlaka ilham verecektir.

    Yeni bir kullanıcı kayıt yaptırırken gelen referans kodunu tbl_users tablosunda aratacaksınız (SELECT * FROM tbl_users WHERE user_refcode = ?). eğer sonuç varsa kayıt olan kullanıcının ilgili sütununa yazdıracaksınız. Öyle bir kullanıcı yoksa da 0 yazdıracaksınız.
    Tekrardan Merhabalar ve teşekkürler.

    dediğiniz gibi düzenlediğimde aşağıdaki hatayı alıyorum. sanırım fonksiyon kısmında user_id yi karşılayamadığım için bu hatayı alıyorum ama tam olarak emin olamadım

    Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'FROM tbl_users AS user LEFT JOIN def AS referral ON user.use...' at line 4 in C:\xampp\htdocs\hacer\classes\Users.php:144 Stack trace: #0 C:\xampp\htdocs\hacer \classes\Users.php(144): PDOStatement->execute(Array) #1 C:\xampp\htdocs\hacer \references.php(95): Users->subs_usrefcode('1') #2 {main} thrown in C:\xampp\htdocs\hacer \classes\Users.php on line 144
    Bahsettiği 144. satır aşağıdaki ve daha önce de array denediğimde bu hatayı almıştım

    $stmt->execute(array($user_id));
  • 19-09-2022, 11:30:56
    #6
    Bu cevap, konu sahibi tarafından kabul edilebilir bir cevap olarak işaretlendi.
    Sizin için de uygunsa özel mesajla anydesk ya da teamviewer bilgisi atın, öyle bakalım.

    edit: çıkmam gerekiyor malesef. eğer çözemezseniz akşam tekrardan yardımcı olabilirim. backtick ile alakalı hata vermiş olabilir. sql sorgunuzu aşağıdaki gibi deneyebilirsiniz.

    public function subs_usrefcode($user_id = '')
    {
         $query = "
              SELECT
                   `user`.*,
                   `referral`.*
              FROM `tbl_users` AS `user`
              LEFT JOIN `def` AS `referral`
                   ON `referral`.`def_refcode` = `user`.`user_refcode`
              WHERE `user`.`id` = ?
         ";
         $stmt = $this->db->pdo->prepare($query);
         $stmt->execute(array($user_id));
         $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
         return $result;
    }
  • 19-09-2022, 12:46:24
    #7
    İçerik Editörü
    ozanalkancomtr adlı üyeden alıntı: mesajı görüntüle
    Sizin için de uygunsa özel mesajla anydesk ya da teamviewer bilgisi atın, öyle bakalım.

    edit: çıkmam gerekiyor malesef. eğer çözemezseniz akşam tekrardan yardımcı olabilirim. backtick ile alakalı hata vermiş olabilir. sql sorgunuzu aşağıdaki gibi deneyebilirsiniz.

    public function subs_usrefcode($user_id = '')
    {
         $query = "
              SELECT
                   `user`.*,
                   `referral`.*
              FROM `tbl_users` AS `user`
              LEFT JOIN `def` AS `referral`
                   ON `referral`.`def_refcode` = `user`.`user_refcode`
              WHERE `user`.`id` = ?
         ";
         $stmt = $this->db->pdo->prepare($query);
         $stmt->execute(array($user_id));
         $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
         return $result;
    }
    Merhaba.

    Şimdiki kod ile "dep" tablosundan verileri aldık ama bu seferde alt referanslar yerine referans vereni tekrarladı
  • 20-09-2022, 19:40:20
    #8
    İçerik Editörü
    Ozan Bey biraz geç oldu ama, teşekkür ederim. Sayenizde sorunum çözüldü.