2013-08-20 52 views
3

這是我目前的數據庫類:創建一個PHP PDO數據庫類,麻煩的OOP

class Database { 

    private $db; 

    function Connect() { 
     $db_host = "localhost"; 
     $db_name = "database1"; 
     $db_user = "root"; 
     $db_pass = "root"; 
     try { 
      $this->db = new PDO("mysql:host=" . $db_host . ";dbname=" . $db_name, $db_user, $db_pass); 
     } catch(PDOException $e) { 
      die($e); 
     } 
    } 

    public function getColumn($tableName, $unknownColumnName, $columnOneName, $columnOneValue, $columnTwoName = "1", $columnTwoValue = "1") { 
     $stmt = $this->db->query("SELECT $tableName FROM $unknownColumnName WHERE $columnOneName='$columnOneValue' AND $columnTwoName='$columnTwoValue'"); 
     $results = $stmt->fetchAll(PDO::FETCH_ASSOC); 
     return $results[0][$unknownColumnName]; 
    } 
} 

我嘗試使用下面的代碼來運行它:

$db = new Database(); 
$db->Connect(); 
echo $db->getColumn("Sessions", "token", "uid", 1); 

和我出現以下錯誤:

PHP Fatal error: Call to a member function fetchAll() on a non-object in /Users/RETRACTED/RETRACTED/root/includes/Database.php on line 19

任何想法是怎麼回事?由於

+2

在一個側面說明,我將通過結合使用PDO的準備語句變量,而不是直接包含它們。例如,' - > prepare('SELECT?FROM?WHERE ...') - > execute(func_get_args());'。 –

+1

謝謝奧斯汀,我一定會在將來使用準備好的陳述。 – User2013

+4

@AustinBrunkhorst你不能使用DB標識符(表/列名)的參數綁定,只有值 – Phil

回答

5
  1. 該函數很容易出現SQL注入
  2. 此功能不會讓你用最簡單甚至OR條件列。
  3. 此功能使不可讀的亂碼了SQL語言的近乎天然的英語。

瞧,你甚至寵愛自己寫這個非常功能。你認爲它如何用於每一天的編碼?事實上,與原始PDO相比,此功能使您的經驗更難 - 您必須學習所有新的語法,許多例外和最後一刻的更正。

請回頭原料PDO!

讓我告訴你正確的方式

public function getColumn($sql, $params) 
{ 
    $stmt = $this->db->prepare($sql); 
    $stmt->execute($params); 
    return $stmt->fetchColumn(); 
} 

像這樣使用

echo $db->getColumn("SELECT token FROM Sessions WHERE uid = ?", array(1)); 

這樣,你就可以使用SQL的全功率不限於一個愚蠢的子集,以及準備語句的安全性,但保持您的代碼易於理解。
雖然在一行
仍然調用它 - 這是你最初的(和非常正確的!)的意圖。的fetch代替fetchAll

+3

謝謝,不用說我是PDO的全新人物,儘管我對你所教的課程感激不盡。 – User2013

+11

-1不好意思,但是用這種強調與這種自大的態度結合起來根本就沒有必要。我們都必須從某個時候開始,很可能你自己也必須學習新的東西。 –

+0

如果您限制自己使用僅遵循一個獲取協議的類函數,那麼您並沒有真正使用SQL的全部功能。在獲取之前返回'$ stmt'可能會更好,然後將任何獲取函數附加到返回的值。這也可以讓你創建一個適用於非''SELECT'查詢的函數。如果有的話,其目的只是爲了避免重寫'prepare()'和'execute()'。 –

1

這意味着你的$語句變量沒有返回一個PDOStatement對象的對象。您的查詢失敗,因爲PDO :: query錯誤時返回PDOStatement或False。

0

使用..that將很容易在你的情況

$results = $stmt->fetchAll(PDO::FETCH_ASSOC); 
return $results[0][$unknownColumnName]; 

這將是

$results = $stmt->fetch(PDO::FETCH_ASSOC); 
return $results[$unknownColumnName];