我正在运行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值):
var_dump($this->uniqueid);
返回的值为 3266928646
我调试了所有内容,我没有任何错误,只是一个错误。
PHP版本: 5.3.10
MySQL版本: 5.5.38
操作系统: Ubuntu 12.04 LTS
答案 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();