PDO - 在非对象上调用成员函数fetch()?

时间:2011-07-31 16:07:24

标签: php mysql pdo

我查看了所有其他帖子,并且他们都没有提出我的问题是什么,所以我们走了:

$ dbh存储我的PDO连接,如果我对其进行var转储,则返回:

object(PDO)#1 (0) { }

所以我知道我的PDO连接正常。然后我使用$ sth来保存我的查询:

$c = 2;
$sth = $dbh->query("SELECT * FROM table WHERE ID = " . $c);

然后为了确保这是有效的,我做了:

echo $sth->rowCount();

返回值为6.所以我知道它正在抓取一些行。检查我的问题的下一步是获取如下所示的单行:

$row = $sth->fetch()
print_r($row);

这返回了一行(应该如此),$ row数组完全按照我的预期填充(列名作为键,列值作为数组值)。

所以我们很高兴到了这一点。一旦我将$ row = $ sth-> fetch()移动到while循环中,我的脚本就会失败,它返回的错误是:调用非对象上的成员函数fetch()

这是我的while循环:

while($row = $sth->fetch()){
    //while loop stuff here
}

我知道它与循环的条件有关,因为即使我在中间注释掉所有东西它仍然无法正常工作。我究竟做错了什么?为什么这不起作用?我对这一点感到困惑,因为它在过去曾与我所做的所有PDO一起工作,但由于某种原因它在这个脚本中失败了。

如果有人有任何可以提供帮助的提示或内容,我们将不胜感激。

编辑自从ninetwozero的帖子发布以来,我正在发布我的课程,基本上我要弄清楚这一切。

class html_elements {

var $units;
var $useMaps;
var $cid;
var $uid;
var $companyMoney;
var $currCity;
var $terminals;
var $termLocs;
var $cityArray;
var $cargoArray;
var $cargo;
var $tid;
var $truckArray;
var $load;
var $cityID;
var $cargoID;
var $xp;
var $gasPrice;
var $warning;

function __construct($u, $maps, $c, $userID, $cMoney, $dbh, $city, $tid, $xp){
    $this->units = $u;
    $this->useMaps = $maps;
    $this->cid = $c;
    $this->uid = $userID;
    $this->companyMoney = $cMoney;
    $this->currCity = $city;
    $this->terminals = array();
    $this->termLocs = array();
    $this->cityArray = array();
    $this->cargoArray = array();
    $this->cargo = array();
    $this->tid = $tid;
    $this->truckArray = array();
    $this->load = 0;
    $this->cityID = array();
    $this->cargoID = array();
    $this->xp = $xp;
    $this->gasPrice = 0;

    $sth = null;
    $sth = $dbh->query("SELECT * FROM tblCTerminals WHERE companyID = " . $c);
            //THIS LOOP FAILS
    while($row = $sth->fetch()){
        $this->termLocs[] = $row['Location'];
    }
}

然后在另一个包含我的类文件的文件中:

$h = new html_element($u->get_units(), $u->get_maps(), $u->get_company(), $u->get_user_id(), $c->get_money(), $dbh, $u->get_city(), $u->get_truck_id(), $u->get_xp());

每个吸气剂都有效,我测试了它们。另外$ dbh是用于我之前包含的连接文件的内容。所以我知道所有这些都有效。

1 个答案:

答案 0 :(得分:1)

我得说你遇到了一个非常有趣的错误,所以让我们试着找出原因:

if( $sth == null ) die('My sth is null at #1');
while( $row = $sth->fetch() ) {
    if( $row == null ) die('My row is null at #2');
    echo '<pre>';
    print_r($row);
    echo '</pre>';
}

让我知道这告诉你的是什么。

编辑:

$sql = 'SELECT * FROM tblCTerminals WHERE companyID = ' . $c;
if( intval($c) == 0 ) { die('Aaaaaaaaaa.......aaaaah.');
foreach ($dbh->query($sql) as $row) {
    echo '$row[\'Location\'] is: ' . $row['Location'] .'<br />';
    $this->termLocs[] = $row['Location'];
}