PDO在两个非常相似的查询上表现不同

时间:2009-09-17 15:48:32

标签: php pdo

以下代码块工作正常(无错误)

$query = "select * from users where username = ?";
$statement = $sql->prepare($query);
echo gettype($statement); // -- This returns 'object'
$statement->bindParam(1, $username);

以下给出: 致命错误:在第39行的/file.php中的非对象上调用成员函数bindParam()

$email = 'fake@email.com';
$query = "select * from users where email = ?";
$statement = $sql->prepare($query);
echo gettype($statement); // -- this returns 'boolean'
$statement->bindParam(1, $email); // -- this is line 39.

现在这很奇怪。

在我的本地计算机和我的远程主机上,这从来都不是问题。

此错误仅出现在我正在尝试本月的新托管公司上。编译php时它可能是一个配置参数吗?

-------- --------编辑 在试图找出问题的同时,我发现了这一点。

$query = "select userID, username from users";
$statement = $sql->prepare($query);    
$statement->execute();
$r = $statement->fetchAll(PDO::FETCH_ASSOC);

// display # of rows
echo "Rows returned: " . $statement->rowCount();

// display results array
echo '<pre>'; print_r($r); echo '</pre>'; 

在服务器上,我得到了

Rows returned: 4

Array
(
    [0] => Array
        (
            [userID] => 1
            [username] => lyrae
        )

    [1] => Array
        (
            [userID] => 2
            [username] => jproffer
        )

    [2] => Array
        (
            [userID] => 3
            [username] => king
        )

    [3] => Array
        (
            [userID] => 4
            [username] => gergy
        )

)

哪个是对的。表示返回4行并显示结果数组。然而,在另一台服务器上,我得到了

Rows returned: 0

Array
(
    [0] => Array
        (
            [userID] => 1
            [username] => lyrae
        )

    [1] => Array
        (
            [userID] => 2
            [username] => jproffer
        )

    [2] => Array
        (
            [userID] => 3
            [username] => king
        )

    [3] => Array
        (
            [userID] => 4
            [username] => gergy
        )

)

因此,似乎PDOStatement :: rowCount()在服务器上不起作用,但在另一个服务器上起作用。

6 个答案:

答案 0 :(得分:2)

阅读本文:$statement->closeCursor()

  

PDOStatement :: closeCursor()释放与服务器的连接,以便可以发出其他SQL语句

您是否在服务器上使用相同的数据库,并说您没有此问题?

答案 1 :(得分:1)

找到解决问题的方法。

这是整个代码块..

// check if username exists
$query = "select * from users where username = ?";
$statement = $sql->prepare($query);
$statement->bindParam(1, $username);
$statement->execute();


// check if email exists
$sql2 = new PDO('mysql:host=localhost; dbname=db', 'username', 'pw');
$query = "select * from users";
$statement = $sql2->prepare($query);
echo gettype($statement);
#$statement->bindParam(1, $email);

因此,出于某种原因,我必须创建一个新的PDO实例。奇怪的是,在其他2台服务器上,我不必这样做。

进一步观察,我发现PDO :: Prepare引发了PDOExeption。

这是:

SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.

Array
(
    [0] => HY000
    [1] => 2014
    [2] => Cannot execute queries while other unbuffered queries are active.  Consider using PDOStatement::fetchAll().  Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.
)

也许它将来会帮助某人:)

答案 2 :(得分:0)

$ email未定义?您可以尝试一下var_dump($ email),看看它的内容。祝你好运。

答案 3 :(得分:0)

您是否尝试将$email=行放在bindParam下方(但在执行之前)? bindParam通过引用传递参数,因此您可以执行查询,更改变量的值并再次执行。

我认为这可能是PHP设置错误。我听说有人说PDO在PHP 5.3之前有很多bug,所以也许看看你能不能把PHP升级到最新版本?

您是否也尝试过交换两个查询?运行一个查询后,可能会出现问题。

答案 4 :(得分:0)

我最好推荐使用它:

$email = 'fake@email.com';
$query = "select * from users where email = ?";
$statement = $sql->prepare($query);
$statement->execute(array($email));

此处不需要使用BindParam。

答案 5 :(得分:0)

我遇到了同样的问题   echo“Rows返回:”。 $陈述式&GT; rowCount时();

我有-1行,哈哈。我的数据库是INFORMIX,我找到了搜索网页 那个rowCount();仅返回由相应PDOStatement对象执行的DELETE,INSERT或UPDATE语句中受影响的行。

使用SELECT语句,您需要使用函数   $陈述式&GT; fetchColumn();

在此处阅读:http://www.phpbuilder.com/manual/en/function.pdostatement-rowcount.php