Я получаю эту ошибку, когда запускаю код ниже. Я обычно использовал функции 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..'; } } ?>
::
sign используется для вызова методов, которые определены как статические, что означает, что вам не нужно создавать экземпляр объекта для вызова этого метода. 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 и базу данных по умолчанию для своего конструктора. (это не все требуемые параметры). Установлено соединение с сервером базы данных, поэтому вы можете запрашивать данные.
Если ваш метод запроса был статичным, вам нужно либо подключиться, выполнить запрос, отключить и вернуть результаты для каждого запроса, который вы хотите запустить. Очевидно, что это не очень хороший подход.
Объект PDO позволяет вам делать многое, гораздо больше, чем просто выполнение запросов: предположим, что ваша БД работает на движке InnoDB. Статический метод запроса просто попытается выполнить запрос DELETE
, но не оставляет места для защитной сети, когда что-то пойдет не так. PDO предоставляет $db->commit();
и $db->rollBack();
методов, чтобы предотвратить повреждение данных.
Есть много и много веских причин, почему вы даже не должны думать о расширении класса PDO и создании статических функций-членов, но вы можете сами убедиться в том, что вы читаете документы .
В вашем примере вы хотите получить rowcount после выполнения запроса. Подумайте о том, что это значит: нет экземпляра, чтобы присвоить это значение одному из своих свойств, а также нет подключения к базе данных, на которой вы только что выполнили свой запрос. Единственный способ получить номер строки в вашем случае – это повторить запрос и подсчитать. ИМО, это просто глупо
Ваш запрос должен выполняться при подключении к базе данных.
Вы не можете использовать query
как статическую функцию, но вместо этого используйте $con->query()
.
Без какого-либо объекта PDO, как PDO может знать, какая связь используется? (у вас может быть более одного)