Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PDO Statement returning false

Tags:

php

mysql

pdo

I am running 2 queries, the first one goes through correctly and returns the desired value, but the second one returns false.

I have set $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); so I should be getting an exception over false, so I am guessing that my $stmt->execute(); is the culprit here.

As that's the only function that can return false now that I've set the error attribute. I have also tried setting $stmt->closeCursor();, $stmt = null;, and unset($stmt); with no avail.

This executes two queries (both "darkrp" and "pointshop" in the fetch_wallet() function.

if($this->pdo) {
    foreach($this->methods as $method => $bool) {
        if($bool) { $array[$method] = $this->fetch_wallet($method); }
    }
}

This is the fetch_wallet() function:

public function fetch_wallet($type) {
    if($type == "darkrp") {
        $query = "SELECT `wallet` FROM `darkrp_player` WHERE uid=:uid LIMIT 1";
    }
    elseif ($type == "pointshop") {
        $query = "SELECT `points` FROM `pointshop_data` WHERE uniqueid=:uid LIMIT 1";
    }
    try {
        $stmt = $this->pdo->prepare($query);
        $stmt->execute(array(":uid" => $this->uniqueid));
        $result = $stmt->fetchColumn();
        return $result;
    }
    catch (PDOException $e) {
        return $e->getMessage();
    }
}

When I run var_dump($stmt->errorInfo()); I get this, which means that both queries runs fine, although the last one returns false when it should return 440. No exception is thrown.

array(3) {
  [0]=> string(5) "00000"
  [1]=> NULL
  [2]=> NULL
}
array(3) {
  [0]=> string(5) "00000"
  [1]=> NULL
  [2]=> NULL
}

Printed screen of the pointshop_data table in phpMyAdmin (I want the 440 value there):

Screenshot

Value returned from var_dump($this->uniqueid); is 3266928646

I have debugged everything, and I get no errors whatsoever, just a false.

PHP Version: 5.3.10

MySQL Version: 5.5.38

OS: Ubuntu 12.04 LTS

like image 518
Svenskunganka Avatar asked Nov 23 '22 15:11

Svenskunganka


1 Answers

I think there must be some other error in your class that makes this code does not work.

I've imported your tables structure and created the following testing code:

<?php

class A
{
    private $pdo;
    private $uniqueid;
    private $methods = ['darkrp' => true, 'pointshop' => true];

    public function __construct($pdo, $uniqueid)
    {
        $this->pdo = $pdo;
        $this->uniqueid = $uniqueid;

    }


    public function fetch_wallet($type)
    {
        if ($type == "darkrp") {
            $query = "SELECT `wallet` FROM `darkrp_player` WHERE uid=:uid LIMIT 1";
        } elseif ($type == "pointshop") {
            $query = "SELECT `points` FROM `pointshop_data` WHERE uniqueid=:uid LIMIT 1";
        }
        try {
            $stmt = $this->pdo->prepare($query);
            $stmt->execute(array(":uid" => $this->uniqueid));
            $result = $stmt->fetchColumn();
            return $result;
        } catch (PDOException $e) {
            return $e->getMessage();
        }
    }


    public function run()
    {


        if ($this->pdo) {
            foreach ($this->methods as $method => $bool) {
                if ($bool) {
                    $array[$method] = $this->fetch_wallet($method);
                    var_dump($array[$method]);
                }
            }
        }

    }


}


$pdo = new PDO('mysql:host=localhost;dbname=tests', 'root', '');

$a = new A($pdo, 3266928646);

$a->run();

The result I get for this is:

string(4) "2075" string(3) "440" 

So it is working as it should.

Please try this code (that's the whole file - of course you need to change your db name, user and password) and check if it gets you the same results. If yes, probably you have other errors in your class.

like image 186
Marcin Nabiałek Avatar answered Dec 10 '22 18:12

Marcin Nabiałek