简体   繁体   中英

Class function not printing out data in php with mysqli prepared statement

I need some help on a function that is not echoing the $bonusjson array. The function is CheckBonus() . All of the other functions work fine, except this one. When it's ran it echos nothing and I cannot figure out why. This is really my first time working with classes and functions. The CheckBonus() is suppose to query the database and check the table to see if the $hash variable data exists, then run the query and print out the data.

I think the issue is with if($stmt->num_rows != 0) . I have also tried using if(!empty($stmt->store_result())) instead and that prints the data, but if I change the $hash to something that is not in the database, it does not run AddUser() .

<?

//Mysql connect info
$servername = "removed";
$username = "removed";
$password = "removed";
$database = "removed";

$link = new mysqli($servername, $username, $password, $database);
if ($link->connect_error)
{
    die("Connection failed: " . $link->connect_error);
}

//Get or send the information from/to the game
$func = $_GET['func'];
$hash = $link->real_escape_string($_GET['user']);
$bonus = $link->real_escape_string($_GET['bonus']);

class CheckUser
{
    function CheckBonus($hash)
    {
        global $link;
        global $hash;
        $query = "SELECT bonustier, resettime, userid FROM members WHERE userid = ?";
        if ($stmt = $link->prepare($query))
        {
            $stmt->bind_param('s', $hash);
            $stmt->execute();

            if($stmt->num_rows != 0) {
                $stmt->store_result();
                $stmt->bind_result($bonustier, $resettime, $hash);

                while($stmt->fetch())
                {
                    //Check if enough time has passed since last login bonus
                    $time = time();
                    $time2 = ((($time - $resettime) / 60) / 60);
                    $time3 = substr($time2, 0, strpos($time2, "."));

                    if($time3 >= 24)
                    {
                        $connection = 1;
                        $usergood = 1;
                        $loginbonus = 1;
                        $hoursince = $time3;

                        $bonusarray = array(
                            'BonusCheck' => array(
                                'connection' => $connection,
                                'usergood' => $usergood,
                                'loginbonus' => $loginbonus,
                                'bonustier' => $bonustier,
                                'hoursince' => $time3
                                ),
                            );

                        $bonusjson = json_encode($bonusarray, 128);
                        echo $bonusjson;
                    }
                    else //If enough time has not passed, tell the game.
                    {
                        $connection = 1;
                        $usergood = 1;
                        $loginbonus = 0;
                        $hoursince = $time3;

                        $bonusarray = array(
                            'BonusCheck' => array(
                                'connection' => $connection,
                                'usergood' => $usergood,
                                'loginbonus' => $loginbonus,
                                'bonustier' => $bonustier,
                                'hoursince' => $time3
                                ),
                            );

                        $bonusjson = json_encode($bonusarray, 128);
                        echo $bonusjson;
                    }
                }
            }
            else
            {
                $this->AddUser($hash);
            }

        }
        $stmt->close();
    }

    function UpdateBonus($hash, $bonus)
    {
        global $link;
        global $hash;
        global $bonus;
        if($stmt = $link->prepare("UPDATE members SET loginbonus = ?, bonustier = ?, resettime = ? WHERE userid=?"))
        {
            $stmt->bind_param('ssss', $loginbonus, $bonustier, $resettime, $hash);

            switch($bonus)
            {
                case 0:
                    $bonustier = 1;
                    break;
                case 1:
                    $bonustier = 2;
                    break;
                case 2:
                    $bonustier = 3;
                    break;
                case 3:
                    $bonustier = 4;
                    break;
                case 4:
                    $bonustier = 5;
                    break;
                case 5:
                    $bonustier = 0;
                    break;
            }

            $loginbonus = 0;
            $resettime = time();
            $success = '1';

            $updatearray = array(
                'UpdateBonus' => array(
                    'login' => $loginbonus,
                    'result' => $success
                    ),
                );

            $updatejson = json_encode($updatearray, 128);
            echo $updatejson;

            $stmt->execute();
            $stmt->close();
        }
    }

    function AddUser($hash)
    {
        global $link;
        global $hash;
        if($stmt = $link->prepare("INSERT INTO members (userid, loginbonus, bonustier, resettime) VALUES (?, ?, ?, ?)"))
        {
            $stmt->bind_param('ssss', $userid, $loginbonus, $bonustier, $resettime);

            $userid = $hash;
            $loginbonus = 1;
            $bonustier = 1;
            $resettime = time();

            $stmt->execute();
            $stmt->close();

            $this->CheckBonus($hash);
        }
    }

    function CheckFunc($func)
    {
        switch($func)
        {
            case cb:
                $this->CheckBonus($hash);
                break;
            case ub:
                $this->UpdateBonus($hash, $bonus);
                break;
            case au:
                $this->AddUser($hash);
                break;
            default:
                echo 'Function not found.';
                break;
        }
    }
}

$newObject = new CheckUser();
$newObject->CheckFunc($func);

?>

If you happen to downvote my quiestion, could you let me know why? What am I doing wrong here, what could I do better and what could I work more on when asking a question?

I believe I figured out what I had done wrong. It seems to work as intended now. I moved $stmt->store_result(); above the if($stmt->num_rows != 0) line and I changed that line to if($stmt->num_rows > 0) . Not sure if the second change actually had any effect, but it seemed better to use > over != in the statement.

Here is the code in a working state.

//Mysql connect info
$servername = "removed";
$username = "removed";
$password = "removed";
$database = "removed";

$link = new mysqli($servername, $username, $password, $database);
if ($link->connect_error)
{
    die("Connection failed: " . $link->connect_error);
}

//Get or send the information from/to the game
$func = $_GET['func'];
$hash = $link->real_escape_string($_GET['user']);
$bonus = $link->real_escape_string($_GET['bonus']);

class CheckUser
{
    function CheckBonus($hash)
    {
        global $link;
        global $hash;
        $query = "SELECT bonustier, resettime, userid FROM members WHERE userid = ?";

        if ($stmt = $link->prepare($query))
        {
            $stmt->bind_param('s', $hash);
            $stmt->execute();
            $stmt->store_result();

            if($stmt->num_rows > 0)
            {
                $stmt->bind_result($bonustier, $resettime, $hash);

                while($stmt->fetch())
                {
                    //Check if enough time has passed since last login bonus
                    $time = time();
                    $time2 = ((($time - $resettime) / 60) / 60);
                    $time3 = substr($time2, 0, strpos($time2, "."));

                    if($time3 >= 24)
                    {
                        $connection = 1;
                        $usergood = 1;
                        $loginbonus = 1;
                        $hoursince = $time3;

                        $bonusarray = array(
                            'BonusCheck' => array(
                                'connection' => $connection,
                                'usergood' => $usergood,
                                'loginbonus' => $loginbonus,
                                'bonustier' => $bonustier,
                                'hoursince' => $time3
                                ),
                            );

                        $bonusjson = json_encode($bonusarray, 128);
                        echo $bonusjson;
                    }
                    else //If enough time has not passed, tell the game.
                    {
                        $connection = 1;
                        $usergood = 1;
                        $loginbonus = 0;
                        $hoursince = $time3;

                        $bonusarray = array(
                            'BonusCheck' => array(
                                'connection' => $connection,
                                'usergood' => $usergood,
                                'loginbonus' => $loginbonus,
                                'bonustier' => $bonustier,
                                'hoursince' => $time3
                                ),
                            );

                        $bonusjson = json_encode($bonusarray, 128);
                        echo $bonusjson;
                    }
                }
            }
            else
            {
                $this->AddUser($hash);
            }

        }
        $stmt->close();
    }

    function UpdateBonus($hash, $bonus)
    {
        global $link;
        global $hash;
        global $bonus;

        if($stmt = $link->prepare("UPDATE members SET loginbonus = ?, bonustier = ?, resettime = ? WHERE userid=?"))
        {
            $stmt->bind_param('ssss', $loginbonus, $bonustier, $resettime, $hash);

            switch($bonus)
            {
                case 0:
                    $bonustier = 1;
                    break;
                case 1:
                    $bonustier = 2;
                    break;
                case 2:
                    $bonustier = 3;
                    break;
                case 3:
                    $bonustier = 4;
                    break;
                case 4:
                    $bonustier = 5;
                    break;
                case 5:
                    $bonustier = 0;
                    break;
            }

            $loginbonus = 0;
            $resettime = time();
            $success = '1';

            $updatearray = array(
                'UpdateBonus' => array(
                    'login' => $loginbonus,
                    'result' => $success
                    ),
                );

            $updatejson = json_encode($updatearray, 128);
            echo $updatejson;

            $stmt->execute();
            $stmt->close();
        }
    }

    function AddUser($hash)
    {
        global $link;
        global $hash;

        if($stmt = $link->prepare("INSERT INTO members (userid, loginbonus, bonustier, resettime) VALUES (?, ?, ?, ?)"))
        {
            $stmt->bind_param('ssss', $userid, $loginbonus, $bonustier, $resettime);

            $userid = $hash;
            $loginbonus = 1;
            $bonustier = 1;
            $resettime = time();

            $stmt->execute();
            $stmt->close();

            $this->CheckBonus($hash);
        }
    }

    function CheckFunc($func)
    {
        switch($func)
        {
            case cb:
                $this->CheckBonus($hash);
                break;
            case ub:
                $this->UpdateBonus($hash, $bonus);
                break;
            case au:
                $this->AddUser($hash);
                break;
            default:
                echo 'Function not found.';
                break;
        }
    }
}

$newObject = new CheckUser();
$newObject->CheckFunc($func);

?>

If anyone happens to see something that is wrong or could be done better, please let me know. And yeah, I know I really should switch to using PDO. I just started learning classes a functions so I feel I need to work on this first, then start learning PDO.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM