PDO语句返回false

时间:2014-08-09 03:35:57

标签: php mysql pdo

我正在运行2个查询,第一个查询正确并返回所需的值,但第二个返回false。

我设置了$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);所以我应该得到一个超过false的异常,所以我猜我的$stmt->execute();是罪魁祸首。

因为我已经设置了错误属性,所以这是唯一可以返回false的函数。 我也试过设置$stmt->closeCursor();$stmt = null;unset($stmt);但没有用。

这会执行两个查询(fetch_wallet()函数中的“darkrp”和“pointshop”。

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

这是fetch_wallet()函数:

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();
    }
}

当我运行var_dump($stmt->errorInfo());时,我得到了这个,这意味着两个查询都运行正常,尽管最后一个查询返回false时应返回 440 。没有例外。

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

phpMyAdmin中的pointshop_data表的打印屏幕(我想要那里的440值):

Screenshot

var_dump($this->uniqueid);返回的值为 3266928646

我调试了所有内容,我没有任何错误,只是一个错误。

PHP版本: 5.3.10

MySQL版本: 5.5.38

操作系统: Ubuntu 12.04 LTS

2 个答案:

答案 0 :(得分:5)

我认为您的课程中必定存在其他错误,导致此代码无效。

我导入了表结构并创建了以下测试代码:

<?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();

我得到的结果是:

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

所以它正在按预期工作。

请尝试此代码(这是整个文件 - 当然您需要更改您的数据库名称,用户和密码)并检查它是否能获得相同的结果。如果是,可能您的课程中还有其他错误。

答案 1 :(得分:-4)

更改

$stmt->execute(array(":uid" => $this->uniqueid));

$stmt->bindValue(':uid', $this->uniqueid);
$stmt->execute();