Php PDO在两个非常相似的查询上的作用不同

Php PDO在两个非常相似的查询上的作用不同,php,pdo,Php,Pdo,以下代码块工作正常(无错误) 以下是: 致命错误:对第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->bind

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

以下是: 致命错误:对第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>'; 
这是正确的。表示返回的4行并显示结果数组。然而,在另一台服务器上,我得到

// 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);

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

是否未定义$email?你也可以试试var_dump($email),看看上面写的是什么。祝您好运。

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

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


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

找到了问题的解决方案

这是整个代码块

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.
)
所以出于某种原因,我必须创建一个新的PDO实例。奇怪的是,在另外两台服务器上,我不必这样做

进一步研究后,我发现PDO::Prepare会引发一个PDOExption

这是:

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

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

我最好推荐使用这个:

此处不需要使用BindParam。

请阅读以下内容:

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

您在服务器上使用的数据库与您说的没有此问题的数据库相同吗?

我也有同样的问题 echo“返回的行:”$语句->行计数()

我得到了-1行,哈哈。我的数据库是INFORMIX,正在搜索我找到的web 行数();仅返回由相应PDOStatement对象执行的DELETE、INSERT或UPDATE语句中受影响的行

对于SELECT语句,您需要使用函数 $statement->fetchColumn()


请在此处阅读:

即使我在块的正上方执行$email='something',我仍然会得到相同的结果。哦,再次查看错误,听起来问题一定出在$statement上(事实上,在生产中,它是布尔型的)。我认为如果发生错误,$sql->prepare()将返回false,因此您可以对此进行研究。可能是数据库连接问题。即使我的页面上只有电子邮件查询块,它也不起作用。因此,与页面上的其他代码进行比较的顺序没有什么区别。感谢您提供5.3版本之前的PDO信息。我正在运行5.2.6,所以这可能就是原因。虽然我当前的主机使用的是5.2.9a,而且运行良好。我会让他们升级到5.3,看看会发生什么。谢谢在查询失败后,您是否尝试过检查
$sql->errorInfo()
?很多时候它会直接指向问题。你是在bindparam之前还是之后叫它?是的,我是。这是一个注册脚本,我只需查询用户名是否存在,然后再次查询“用户”表中是否存在电子邮件。它们都使用相同版本的PHP?所有的图书馆都一样吗?
// 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);
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.
)
$email = 'fake@email.com';
$query = "select * from users where email = ?";
$statement = $sql->prepare($query);
$statement->execute(array($email));