Autor Zpráva
WordpressKokos
Profil
Zdravím všechny,

Mám script na stránku kde lidé splňují úkoly a dostávají za to body.

Mám kód:

//Get user balance
$balQuery = mysqli_query($conn, "SELECT balance FROM users WHERE username= '".$_SESSION['username']."'");
$rowBal = mysqli_fetch_row($balQuery);

$time = time(true);
    $price = 500;

//update balance
            mysqli_query($conn, "UPDATE users SET balance = balance + '$price' WHERE username= '".$_SESSION['username']."'");
            //display updated balance
            $balQuery = mysqli_query($conn, "SELECT balance FROM users WHERE username= '".$_SESSION['username']."'");
            $rowBal = mysqli_fetch_row($balQuery);
            //update time collected
            mysqli_query($conn, "UPDATE users SET time= '$time' WHERE username= '".$_SESSION['username']."'");    


Bez problémů to updatuje čas za jaký můžou získat body znovu, ale "balance" kolonka v databázi neustáje ukazuje 0, proto si myslím že jsem nastavil balance kolonku špatně:

INT, 10, utf8_general_ci, default 0

Prosím o radu proč se po kliknutí na vybrat odměnu neupdatuje balance.

Díky !!!!
Keeehi
Profil
WordpressKokos:
INT, 10, utf8_general_ci, default 0
Tole je nadmíru divné. Copak číslo má nějakou znakovou sadu? To se přece týká řetězců.

balance + '$price'
Sčítáš číslo a řetězec. Ne že by si s tím mysql neporadilo, ale bylo by lepší sčítat dvě čísla.

Není důvod, proč to dělat dvěma updaty. Můžeš to udělat v jednom.

Ten druhý select je také zbytečný. Když už jsi hodnotu balance na začátku zjistil a i víš, o kolik jsi ji zvětšil, můžeš to přece lehce spočítat.


Celý kód je takový podivný. Navíc mám podezření, že jsi z něj vynechal podstatné části (podmínky, případně cykly atp.) Takže těžko něco radit, na první pohled to vypadá funkčně.
Můžeš zkusit vypsat po tom updatu chybu (za předpokladu, že nastala)
printf("SQL error message: %s\n", mysqli_error($conn));
WordpressKokos
Profil
Okay, zkusil jsem oddělat znakovou sadu, furt nic.

Okay, mrknu se na ty dvě čísla.

A jo máš pravdu, proč dělat dva updaty :P

No právě, udělal jsem funkční skrypt před měsícem, teď ho zapojím a prostě nefunguje, tak mám podezření na database chybu.

Tady je celý kód: (Databaze calling je tam taky ale nezkopíroval jsem to)

//When user clicks claim button
 if(isset($_POST['submit'])) {
     if($_SERVER["REQUEST_METHOD"] == "POST")
{
$recaptcha=$_POST['g-recaptcha-response'];
{
include("getCurlData.php");
$google_url="https://www.google.com/recaptcha/api/siteverify";
$secret='xxxxxxxxxxxxxxxxxxx';
$ip=$_SERVER['REMOTE_ADDR'];
$url=$google_url."?secret=".$secret."&response=".$recaptcha."&remoteip=".$ip;
$res=getCurlData($url);
$res= json_decode($res, true);
if($res['success']){
    //If Captcha success
    
    $time = time(true);
    $price = 500;
    
            //check when they last collected
    $timeQ = mysqli_query($conn, "SELECT time FROM users WHERE username = '".$_SESSION['username']."'");
    $rowTime = mysqli_fetch_row($timeQ);
        if ($time - $rowTime[0] < 3600){
            //Wrong time
            $message = "You can claim again in 1 Hour!";        
        } else { $message = "You just got 1000 coins!";
            //update balance
            mysqli_query($conn, "UPDATE users SET balance = balance + '$price' WHERE username= '".$_SESSION['username']."'");
            //display updated balance
            $balQuery = mysqli_query($conn, "SELECT balance FROM users WHERE username= '".$_SESSION['username']."'");
            $rowBal = mysqli_fetch_row($balQuery);
            //update time collected
            mysqli_query($conn, "UPDATE users SET time= '$time' WHERE username= '".$_SESSION['username']."'");    
        } // end else Time True
        } else { $message = "Wrong Captcha!"; } //Wrong Captcha else statement
} //check Captcha end
} //end calling Captcha
mysqli_close($conn);
 } //end if post

<h2>Your Balance is: <u><?php echo $rowBal[0]; ?></u> Coins. Complete the Captcha and Claim More!</h2>


Fakt nevím
Kajman
Profil
Pokud je ve sloupci balance null hodnota, tak přičtěním každého čísla bude výsledkem opět null.

Můžete to ošetřit díky ifnull nebo coalesce...
$conn->prepare("UPDATE users SET balance = coalesce(balance,0)+? WHERE WHERE username=?");
$conn->bind_param('is', $price, $_SESSION['username']);
$conn->execute();
Keeehi
Profil
WordpressKokos:
Chápu to správně, že se zobrazí zpráva You just got 1000 coins! ale uživateli se balance v db nezvýší? Pokud ano, tak za řádek 28 v tomto kódu dej ten výpis chyby.
printf("SQL error message: %s\n", mysqli_error($conn));
WordpressKokos
Profil
Keeehi:

Zobrazilo se: SQL error message: v headeru a to je vše poté co jsem dostal 1000 coinů ale v balanci furt nic.

Kajman:
Je ten kód správně ? Dvakrát WHERE WHERE a username=? ??

No NULL jsem tam měl na začátku, po prvním získání coinů a žadné změně jsem to změnil na "default" = 0 ať se zobrazuje 0 na začátku v balanci ale furt je tam jen prázné místo, vůbec žádné číslo, pošlu screen databaze tablu.
Kajman
Profil
Where tam má být jen jednou. Ty otazníky tam být mají, místo nich se následujícím příkazem vloží číslo a ošetřený text.

Defaultní hodnota se použije v případě vytvoření nového řádku bez udání hodnoty pro daný sloupec. Musel byste ho změnit na not null (možná předtím budete muset aktualizovat hodnoty null na 0, nevím, jestli stačí default hodnota).
WordpressKokos
Profil
TVL, stačilo vymazat uživatele, protože měl už nastavený NULL !!! A ne default 0, to platilo jen pro nové uživatele. OMG

Díky všichni, vážně stupidní chyba.
Keeehi
Profil
WordpressKokos:
stačilo vymazat uživatele, protože měl už nastavený NULL
Nebo pustit UPDATE users SET balance = 0 WHERE balance IS NULL, nebo použít příkaz s COALESCE z [#4] od Kajmana.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: