• 05-07-2021, 17:19:53
    #1
    Selam, öncelikle yapmak istediğimden bahsedeyim. Kullanıcı para gönderme talebi oluşturduğunda para_transferleri ismindeki tabloya yazılıyor, buraya kadar sorun yok. Sonrasında, (saçma gelebilir biliyorum ancak ileride otomatik bir kaç fonksiyon ekleyeceğim bu sebepten böyle yapmam gerek) para direk gitmiyor kullanıcıya, bilerek böyle yaptım. Buraya kadar da her şey hoş. Sonrasında curl ile her 15 dk da bir php dosyasını çalıştırıyorum, ama şöyle bir sorun var, işlemleri tek tek alıp her 15 dakikada bir onaylayıp para gönderilen kullanıcıya ödemeyi yapmasını istiyorum. Ama bu kafasına göre bir 30 bir 40 rastgele para gönderiyor. Böyle bir değer tabloda olmamasına rağmen. Yardımcı olabilir misiniz rica etsem?

    PHP KOD :

    Bu kodun yalnızca fonksiyon kısmıdır en üstte veriyi çekmek için db ye bağlanıyorum. Sansür yazılarını şimdi koydum.
    
    $sqlQuery = "SELECT * FROM para_transferleri WHERE onay = '0'";
    $statement2 = $db->prepare($sqlQuery);
    $statement2->execute(array(':id' => $id));
    while($rs2 = $statement2->fetch()){
    $send_wpiban = $rs2['send_wpiban'];
    $ttutar = $rs2['tutar'];
    $tid = $rs2['id'];
    }
    
        try {
    
             $baglanti = new PDO("mysql:host=localhost;dbname=SANSUR", "[COLOR=#000000][FONT=Open Sans][SIZE=2]SANSUR[/SIZE][/FONT][/COLOR] ", "[COLOR=#000000][FONT=Open Sans][SIZE=2]SANSUR[/SIZE][/FONT][/COLOR] ");
            $baglanti->exec("SET NAMES utf8");
            $baglanti->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            
            $query = $db->query("SELECT * FROM para_transferleri", PDO::FETCH_ASSOC);
            if ($query->rowCount()){
         foreach($query as $row){
             $query = $db->exec("UPDATE para_transferleri SET onay = '1' WHERE id = '".$tid."'");
              $query = $db->prepare("UPDATE users SET balance = balance + :ttutar WHERE wpiban = :wpiban");
                $update = $query->execute(array(
                     "ttutar" => $ttutar,
                     "wpiban" => $send_wpiban
                ));
                if ($update){
                     echo "güncellendi";
                }else{
                    echo "bir sorun var";
                }
         }
    }
        
        } catch (PDOException $e) {
            die($e->getMessage());
        }
    
        $baglanti = null;
    Veritabanım :




    Tanımlar :


    sender_id = para gönderme ekranında tanımlanıyor ve göndericinin adını belirtiyor,bununla bir işimiz yok
    sender_username = ^bu da aynısı, kullanıcı adını belirtiyor.

    send_wpiban = Para gönderilen kişinin wpiban adresi, parayı bu wpibanına sahip kullanıcıya göndermesini istiyorum bu curl fonksiyonunda
    onay = curl tekrar tekrar aynı kişiye para göndermesin diye yaptığı işlemleri onay 1 yapıyor.

    wpiban_username = bu kısımı sileceğim, işlevsiz.


    Oluşan hata :


    AndMex (Ben) 'e 40 TL gönderi ancak veritabanına göre bana 20 TL göndermesi gerekiyordu. Aşağıdaki kullanıcıya ise 10 TL göndermesi gerekiyordu. Ancak bana 40 aşağıdakine de 20 gönderdi. Bunun sebebi nedir? neden 2 ye katladı sistem.
    Yardımcı olabilir misiniz?

    Şimdiden teşekkür ederim.
  • 05-07-2021, 17:29:10
    #2
    kardeşim sistemde sorun yok sorun;

            $query = $db->query("SELECT * FROM para_transferleri", PDO::FETCH_ASSOC);
    bu satırda. sen her seferinde tüm para transferlerini çekiyorsun. dolayısı ile kontrol olmadan aynı işlemler tekrarlanıyor bu alanı bir koşula bağlamalısın. (where status = 0 vs) sonra kodun sağlam çalışacaktır.
  • 05-07-2021, 17:33:31
    #3
    mehmetkryz adlı üyeden alıntı: mesajı görüntüle
    kardeşim sistemde sorun yok sorun;

            $query = $db->query("SELECT * FROM para_transferleri", PDO::FETCH_ASSOC);
    bu satırda. sen her seferinde tüm para transferlerini çekiyorsun. dolayısı ile kontrol olmadan aynı işlemler tekrarlanıyor bu alanı bir koşula bağlamalısın. (where status = 0 vs) sonra kodun sağlam çalışacaktır.
    Evet hocam aşağıdakini farketmemişim ancak hala sorun devam ediyor daha doğrusu ilk işlemi yine 40 TL olarak gönderiyor 20 göndermesi gerekirken, ancak 2. de farklı bir onay = 0 olmadığı için onu doğru gönderiyor. Hepsini doğru göndermesini nasıl sağlayabilirim?
  • 05-07-2021, 17:41:56
    #4
    AndMex adlı üyeden alıntı: mesajı görüntüle
    Evet hocam aşağıdakini farketmemişim ancak hala sorun devam ediyor daha doğrusu ilk işlemi yine 40 TL olarak gönderiyor 20 göndermesi gerekirken, ancak 2. de farklı bir onay = 0 olmadığı için onu doğru gönderiyor. Hepsini doğru göndermesini nasıl sağlayabilirim?
    Yukarı satırı kontrol etmemiştim. heheheh iki iş aynı anda olursa hata oluyor. şimdi algoritmana bakalım.;


    $send_wpiban = $rs2['send_wpiban'];
    $ttutar = $rs2['tutar'];
    $tid = $rs2['id'];
    }

    burada öncelikle tümünü çekiyorsun. ve en sona atadığın işlemdeki tutar kalıyor. şöyle düşünebilirsin 500 satır varsa en sonra tutar ne ise o kalıyor. burayı tamamlıyorsun.
    sonra tekrar bağlantı atıyorsun (buda yanlış) $baglanti = new PDO // zaten var olan bir pdo var üstten görülen tekrar açıyorsun. sonra işlemerin içinden;
    $query = $db->prepare("UPDATE users SET balance = balance + :ttutar WHERE wpiban = :wpiban"); yapıyorsun. bu durumda en sondaki ile işlemlerin tekrar birleşiyor fazla rakam yazıyor.

    bu sistemi komple değiştirmen lazım;
    while($rs2 = $statement2->fetch()){
    $send_wpiban = $rs2['send_wpiban'];
    $ttutar = $rs2['tutar'];
    $tid = $rs2['id'];
    }

    işlemlerini bu while içine al.
    kısaca onay 0 olanları buldun -> user balanceler update ettin, ödeme onayını 1 ' e çektin işlemin bitti bu kadar.

    buda biraz sıkıntılı olur 5000 işlem varsa, tek tek sorgu salla düzeltsin geri gelsin vs. normalde bunları array içine topla tek seferde ver derim ama oda biraz daha karmaşıklaştırır şuan için bu şekilde devam etmen daha sağlıklı.
  • 05-07-2021, 17:55:27
    #5
    mehmetkryz adlı üyeden alıntı: mesajı görüntüle
    Yukarı satırı kontrol etmemiştim. heheheh iki iş aynı anda olursa hata oluyor. şimdi algoritmana bakalım.;


    $send_wpiban = $rs2['send_wpiban'];
    $ttutar = $rs2['tutar'];
    $tid = $rs2['id'];
    }

    burada öncelikle tümünü çekiyorsun. ve en sona atadığın işlemdeki tutar kalıyor. şöyle düşünebilirsin 500 satır varsa en sonra tutar ne ise o kalıyor. burayı tamamlıyorsun.
    sonra tekrar bağlantı atıyorsun (buda yanlış) $baglanti = new PDO // zaten var olan bir pdo var üstten görülen tekrar açıyorsun. sonra işlemerin içinden;
    $query = $db->prepare("UPDATE users SET balance = balance + :ttutar WHERE wpiban = :wpiban"); yapıyorsun. bu durumda en sondaki ile işlemlerin tekrar birleşiyor fazla rakam yazıyor.

    bu sistemi komple değiştirmen lazım;
    while($rs2 = $statement2->fetch()){
    $send_wpiban = $rs2['send_wpiban'];
    $ttutar = $rs2['tutar'];
    $tid = $rs2['id'];
    }

    işlemlerini bu while içine al.
    kısaca onay 0 olanları buldun -> user balanceler update ettin, ödeme onayını 1 ' e çektin işlemin bitti bu kadar.

    buda biraz sıkıntılı olur 5000 işlem varsa, tek tek sorgu salla düzeltsin geri gelsin vs. normalde bunları array içine topla tek seferde ver derim ama oda biraz daha karmaşıklaştırır şuan için bu şekilde devam etmen daha sağlıklı.
    Açıklayıcı yanıtınız için teşekkür ederim hocam while döngüsünü tüm sorguda mı döndürmem gerekiyor yani şuan? Kod üzerinden yardımcı olabilir misiniz rica etsem?
  • 06-07-2021, 05:07:06
    #6
    @AndMex; aslında ilk while döngüsüyle değişken atadığınız kısma neden ihtiyaç duydunuz tam anlam veremedim $send_wpiban, $ttutar ve $tid değişkeninde sadece son kayıtın bilgileri kalacaktır, sistem error vermese bile bir mantık hatası oluşturacaktır. Aşağıdaki şekilde belki işinizi çözebilir.

    try {
     
             $baglanti = new PDO("mysql:host=localhost;dbname=SANSUR", "xxx ");
            $baglanti->exec("SET NAMES utf8");
            $baglanti->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
             
            $query = $db->query("SELECT * FROM para_transferleri WHERE onay = '0'", PDO::FETCH_ASSOC);
            if ($query->rowCount()){
         foreach($query as $row){
             $query = $db->exec("UPDATE para_transferleri SET onay = '1' WHERE id = '".$row['id']."'");
              $query = $db->prepare("UPDATE users SET balance = balance + :ttutar WHERE wpiban = :wpiban");
                $update = $query->execute(array(
                     "ttutar" => $row['tutar'],
                     "wpiban" => $row['send_wpiban']
                ));
                if ($update){
                     echo "güncellendi";
                }else{
                    echo "bir sorun var";
                }
         }
    }
         
        } catch (PDOException $e) {
            die($e->getMessage());
        }
     
        $baglanti = null;
  • 06-07-2021, 09:13:22
    #7
    evet bu üstadın yaptığı doğru gözüküyor bundan devam edebilirsiniz.

    yasarkemaldag adlı üyeden alıntı: mesajı görüntüle
    @AndMex; aslında ilk while döngüsüyle değişken atadığınız kısma neden ihtiyaç duydunuz tam anlam veremedim $send_wpiban, $ttutar ve $tid değişkeninde sadece son kayıtın bilgileri kalacaktır, sistem error vermese bile bir mantık hatası oluşturacaktır. Aşağıdaki şekilde belki işinizi çözebilir.

    try {
     
             $baglanti = new PDO("mysql:host=localhost;dbname=SANSUR", "xxx ");
            $baglanti->exec("SET NAMES utf8");
            $baglanti->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            
            $query = $db->query("SELECT * FROM para_transferleri WHERE onay = '0'", PDO::FETCH_ASSOC);
            if ($query->rowCount()){
         foreach($query as $row){
             $query = $db->exec("UPDATE para_transferleri SET onay = '1' WHERE id = '".$row['id']."'");
              $query = $db->prepare("UPDATE users SET balance = balance + :ttutar WHERE wpiban = :wpiban");
                $update = $query->execute(array(
                     "ttutar" => $row['tutar'],
                     "wpiban" => $row['send_wpiban']
                ));
                if ($update){
                     echo "güncellendi";
                }else{
                    echo "bir sorun var";
                }
         }
    }
        
        } catch (PDOException $e) {
            die($e->getMessage());
        }
     
        $baglanti = null;