2012-06-23 2 views
3

Я получаю эту ошибку при запуске кода ниже. Я обычно использовал функции msql, но я попытался использовать PDO вместо этого. Что не так ?Сделать pdo :: query static

Фатальная ошибка: Non-статический метод PDO :: запрос() не может быть вызвана статически в строке 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..'; 
} 

} 


?> 

ответ

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; 
+1

1 вещь, чтобы иметь в виду: результат имеет место, что называется PDOStatement, а не фактический результат запроса , чтобы получить доступ к этим: '$ actualResults = $ result-> fetchAll (PDO :: FETCH_ASSOC);' или 1 на 1 'while ($ row = $ results-> fetch (PDO :: FETCH_ASSOC)) {echo $ row [ 'далеко от дома'];} ' –

0

Ваш запрос должен быть выполнен на связи с базой данных.

Ваш не может использовать query в качестве статической функции, но используйте $con->query() вместо.

Без какого-либо объекта PDO, как PDO может узнать, какая связь используется? (у вас может быть более одного)

2

В сообщении об ошибке говорится все. Вы вызываете метод query как статический метод (метод, который не требует создания экземпляра класса), хотя он не является статичным.

Просто, чтобы дать немного больше информации о том, почему вы не можете сделать его статической функцией (так как ваш вопрос заставляет меня поверить, что так вы хотите решить эту ошибку).

  • При вызове объекта PDO, вы передаете хост базы данных, имя пользователя, пароль, тип БД и по умолчанию Databse его конструктору. (это не все требуемые параметры). Установлено соединение с сервером базы данных, поэтому вы можете запрашивать данные.

  • Если ваш метод запроса был статическим, вам нужно было бы подключиться, запросить, отключить и вернуть результаты для каждого запроса, который вы хотите запустить. Очевидно, это не хороший подход.

  • Объект PDO позволяет выполнять многое, гораздо больше, чем просто выполнять запросы: предположим, что ваша БД работает на движке InnoDB. Статический метод запроса просто попытается выполнить запрос DELETE, но не оставляет места для защитной сетки, если все пойдет не так. PDO предоставляет методы $db->commit(); и $db->rollBack();, чтобы предотвратить повреждение данных.

Есть много, много больше хороших причин, почему вы не должны даже думать о расширении класса PDO, и делает статические функции, но вы можете узнать для себя чтение the docs.

В вашем примере вы хотите получить номер строки после выполнения запроса. Подумайте о том, что это значит: нет экземпляра, чтобы присвоить это значение одному из своих свойств, а также нет подключения к базе данных, на которой вы только что выполнили свой запрос. Единственный способ получить номер строки в вашем случае - это повторить запрос и подсчитать. IMO, это просто глупо

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');