当我运行下面的代码时,我收到此错误。我通常使用 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..';
}
}
?>
::
符号用于调用定义为静态的方法,这意味着您无需创建对象的实例即可调用此方法。 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;
首先,如果您可以使用静态方法,您打算如何连接到数据库?
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');
错误消息说明了一切。您将 query
方法作为静态方法(不需要实例化类的方法)调用,而它不是静态方法。
只是为了提供更多的背景知识,说明为什么你不能让它成为静态函数(因为你的问题让我相信这就是你想解决这个错误的方式)。
-
实例化 PDO 对象时,将数据库主机、用户名、密码、db 类型和默认 databse 传递给其构造函数。(这些不是所有必需的参数)。已建立与数据库服务器的连接,以便您可以查询数据。
-
如果查询方法是静态的,则必须为要运行的每个查询连接、查询、断开连接并返回结果。显然,这不是一个好方法。
-
PDO对象允许你做很多很多的事情,而不仅仅是执行查询:假设你的数据库在InnoDB引擎上运行。静态查询方法只会尝试执行
DELETE
查询,但在出现问题时不会留下安全网的空间。PDO提供$db->commit();
和$db->rollBack();
方法,以防止数据损坏。
很多很好的理由,为什么你甚至不应该考虑扩展PDO类,并制作静态成员函数,但你可以自己阅读文档找到答案。
在您的示例中,您希望在执行查询后获取行计数。考虑一下这意味着什么:没有实例将此值分配给其属性之一,也没有连接到您刚刚运行查询的数据库。在您的情况下,获取行计数的唯一方法是重新运行查询和计数。IMO,这太愚蠢了
查询必须在数据库连接上执行。
不能将query
用作静态函数,而可以使用$con->query()
而不是静态函数。
如果没有指定任何PDO对象,PDO如何知道使用哪个连接?(您可以拥有多个)