以下代码块工作正常(无错误)
$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()在服务器上不起作用,但在另一个服务器上起作用。
答案 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