使pdo :: query静态

时间:2012-06-23 20:35:28

标签: php mysql pdo

运行下面的代码时出现此错误。我通常使用msql函数,但我试图使用PDO。有什么问题?

致命错误:非静态方法PDO :: query()无法在第14行静态调用

<?php 

if(isset($_POST['username']) AND isset($_POST['password'])) {

$username = $_POST['username'];
$password = $_POST['password'];
$password_hash = md5($password);

if (!empty($username) AND !empty($password) ) {


$query = "SELECT 'id' FROM `userdatabase` WHERE 'email'='$username' AND      'password'='$password_hash'";

if($query_run = PDO::query($query)){

$query_num_rows = PDO::rowcount($query_run);
if ($query_num_rows==0){
echo 'invalid password/username';

} else {
echo 'Username/password  = correct';
}


}


} else {
echo 'You must enter a password..';
}

} 


?>

4 个答案:

答案 0 :(得分:3)

::符号用于调用定义为static的方法,这意味着您不需要创建对象的实例来调用此方法。 query()方法不是静态的,这意味着您需要先创建PDO对象,然后在该对象上调用query()方法。

这应该是这样的:

$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
$pdo = new  PDO($dsn, $user, $password);
$result = $pdo->query('SELECT * FROM table');  //here $result is a set of results that can be accessed like arrays;

答案 1 :(得分:3)

首先,如果您可以使用静态方法,您希望如何连接到数据库?

PDO需要是一个实例,因为构造函数(__construct())将连接到数据库。如果你有静态方法,则不能PDO::__construct($params),因为PHP没有静态构造函数。

因此,实例化PDO:

$pdo = new  PDO('mysql:dbname=testdb;host=localhost', 'root', 'password');

并进行查询:

$result = $pdo->query('SELECT * FROM table WHERE 1=1');

答案 2 :(得分:2)

错误消息说明了一切。您将query方法称为静态方法(不需要实例化类的方法),而它不是静态方法。

为了更好地说明为什么你不能使它成为一个静态函数(因为你的问题让我相信你想要解决这个错误的方式)。

  • 实例化PDO对象时,将数据库主机,用户名,密码,db类型和默认数据库传递给其构造函数。 (这些并非所有必需参数)。建立了与数据库服务器的连接,因此您可以查询数据。

  • 如果您的查询方法是静态的,则您必须为要运行的每个查询连接,查询,断开连接并返回结果。显然这是一个好方法。

  • PDO对象允许您执行更多操作,而不仅仅是执行查询:假设您的数据库在InnoDB引擎上运行。静态查询方法只会尝试执行DELETE查询,但在出现问题时不会为安全网留下空间。 PDO提供$db->commit();$db->rollBack();方法,以防止数据损坏。

为什么你甚至不应该考虑扩展PDO类和制作静态成员函数,还有很多很好的理由,但你可以自己找出the docs

在您的示例中,您希望在执行查询后获取rowcount。想想这意味着什么:没有实例将此值分配给其中一个属性,也没有与您刚刚运行查询的数据库的连接。在你的情况下获得行计数的唯一方法是重新运行查询和计数。 IMO,这只是愚蠢的

答案 3 :(得分:0)

您的查询必须在数据库连接上执行。

您不能将query用作静态函数,而是使用$con->query()代替。

如果没有指定任何PDO对象,PDO如何知道哪个连接使用? (你可以有多个)