2012-06-23 67 views
3

我運行下面的代碼時出現此錯誤。我通常使用msql函數,但我試圖改用PDO。哪裏不對 ?使pdo ::查詢靜態

致命錯誤:非靜態方法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引擎上運行。靜態查詢方法只會嘗試執行查詢,但在出現問題時不會留下安全網的空間。 PDO提供了$db->commit();$db->rollBack();方法,以防止數據損壞。

有很多很多很好的理由,你不應該別想擴展PDO類,並且使靜態成員函數,但你可以自己去找閱讀the docs

在您的示例中,您希望在執行查詢後獲取rowcount。想一下這意味着什麼:沒有實例將此值分配給其某個屬性,也沒有與剛剛運行查詢的數據庫的連接。在您的案例中獲得行數的唯一方法是重新運行查詢和計數。國際海事組織,這只是愚蠢

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