3

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

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

<?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

4 回答 4

3

::符号用于调用定义为静态的方法,这意味着您无需创建对象的实例即可调用此方法。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;
于 2012-06-23T20:42:35.437 回答
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');
于 2012-06-23T20:50:12.643 回答
2

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

只是为了提供更多背景信息,说明为什么不能将其设为静态函数(因为您的问题让我相信这就是您想要解决此错误的方式)。

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

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

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

您甚至不应该考虑扩展 PDO 类和制作静态成员函数的原因有很多很多,但是您可以自己阅读文档找到答案。

在您的示例中,您希望在执行查询后获取行数。想想这意味着什么:没有实例可以将此值分配给它的属性之一,也没有与您刚刚运行查询的数据库的连接。在您的情况下获得行数的唯一方法是重新运行查询和计数。海事组织,这太愚蠢了

于 2012-06-23T20:50:12.317 回答
0

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

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

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

于 2012-06-23T20:42:39.523 回答