2017-08-22 33 views
5

Pracuję nad kawałkiem kodu od kilku dni, ale nie mogę w jakiś sposób przekazać tej wartości do mojej bazy danych . Zasadniczo próbuję osiągnąć to, że gdy użytkownik kliknie przycisk "zbieraj monety", przekazuje wartość 1 do mojej bazy danych. Codziennie o północy kolumna "dailyfree" jest resetowana do 0 przez zdarzenie MySQL, więc następnego dnia użytkownik może kliknąć przycisk ponownie, ponieważ wartość "dailyfree" w bazie danych wynosi ponownie 0. Nadal nie chcę, aby użytkownik mógł kliknąć "zbieraj monety", zanim wartość w bazie danych zostanie zresetowana. Problem polega na tym, że po kliknięciu przycisku użytkownik otrzymuje darmowe monety, ale wartość 1 nie zostaje przekazana do bazy danych. Kolumna "dailyfree" nadal wynosi 0 po kliknięciu przycisku. Czy ktoś wie, dlaczego tak jest?Wywołanie funkcji AJAX w PHP nie spowoduje wprowadzenia wartości do mojej bazy danych

Dla twojej informacji: Jestem bardzo nowy w kodowaniu!

Oto, nad czym teraz pracuję.

Javascript:

function free(){ 
var str = "username"; 
var term = "searched_word"; 
var index = str.indexOf(term); 
if (index != -1) { 
var daily = 1; 
$.ajax({ 
url:"/free?daily="+daily, 
    success:function(data){  
     try{ 
      data = JSON.parse(data); 
      console.log(data); 
      if(data.success){ 
       bootbox.alert("Success! You've claimed 100 free credits!");     
      }else{ 
       bootbox.alert(data.error); 
      } 
     }catch(err){ 
      bootbox.alert("Javascript error: "+err); 
     } 
    }, 
    error:function(err){ 
     bootbox.alert("AJAX error: "+err); 
    } 
}); 

    } 
    else { 
    bootbox.alert("Your username does not contain the searched_word!");} 
    } 


function disDelay(obj){ 
    obj.setAttribute('disabled','disabled'); 
    setTimeout(function(){obj.removeAttribute('disabled')},86400) 
} 

Przycisk sama

<div class="text-right"> 
    <button class="btn btn-success btn-block" id="free" onclick="free(); disDelay(this)">Collect free coins</button> 
</div> 

PHP

$freecoins = 100; 
case 'free': 
    if(!$user) 
    exit(json_encode(array('success'=>false, 'error'=>'You must login to access the redeem.'))); 
    $daily = 1; 
    if(!preg_match('/^[a-zA-Z0-9]+$/', $daily)) { 
     exit(json_encode(array('success'=>false, 'error'=>'Code is not valid'))); 
    } else { 
     $sql = $db->query('SELECT * FROM `users` WHERE `dailyfree` = '.$db->quote($dailyfree)); 
     if($sql->rowCount() != 0) { 
      $row = $sql->fetch(); 
      if($row['user'] == $user['userid']) 
      exit(json_encode(array('success'=>false, 'error'=>'You have already redeemed your daily reward!'))); 
      $db->exec('INSERT INTO `users` SET `dailyfree` = '.$dailyfree.' , `balance` = `balance` + '.$freecoins.' WHERE `userid` = '.$db->quote($user['userid'])); 
      exit(json_encode(array('success'=>true, 'credits'=>$freecoins))); 
     } else { 
      exit(json_encode(array('success'=>false, 'error'=>'Code not found'))); 
     } 
    } 
    break; 

Mam nadzieję, że może mi pomóc dowiedzieć się, dlaczego nie wprowadzić wartość w moim Baza danych! Tak czy inaczej, życzę miłego dnia :) Dziękuję za pomoc i czas!

+0

** UWAGA **: Kiedy używając PDO powinieneś używać [przygotowanych instrukcji] (http://php.net/manual/en/pdo.prepared-statements.php) z wartościami zastępczymi i podawać dane użytkownika jako oddzielne argumenty. W tym kodzie masz potencjalnie poważne [błędy iniekcji SQL] (http://bobby-tables.com/). Nigdy nie używaj interpolacji lub konkatenacji ciągów znaków i zamiast tego używaj [przygotowanych instrukcji] (http://php.net/manual/en/pdo.prepared-statements.php) z wartościami zastępczymi. Błąd i pomijanie jednego z tych wywołań '$ db-> quote()' to czasami wszystko, czego potrzeba, aby ktoś złamał twoją witrynę. – tadman

Odpowiedz

0

Zapytanie jest nieprawidłowe.

Powinien być zapytaniem o aktualizację.

$db->exec('UPDATE użytkowników SET dailyfree = '.$dailyfree.' , bilans = bilans + '.$freecoins.' WHERE userid = '.$db->quote($user['userid']));

Lub jeśli chcesz zaktualizować, gdy obecny rekord jeszcze wstawić dane użytkownika, a następnie spojrzeć na ON DUPLICATE KEY