运行下面的代码时出现此错误。我通常使用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..';
}
}
?>
答案 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如何知道哪个连接使用? (你可以有多个)