2015-08-16 70 views
-1

所以我開始在php中多做一些練習,並想創建一個面向對象的論壇。爲此我想有一個數據庫類等類php:數據庫類與PDO。我怎樣才能讓它變得更好?

<?php 

    class Database { 

     public $databaseConnection; 

     function __construct(){ 
     $this->databaseConnection = new PDO('sqlite:test.sq3', 0, 0); 
     $this->databaseConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

     $params = NULL; 
     $pdoStatement = $this->databaseConnection->prepare('CREATE TABLE IF NOT EXISTS user(
       id INTEGER PRIMARY KEY, 
       username VARCHAR(40) NOT NULL UNIQUE, 
       numberoflogins INTEGER DEFAULT 0, 
       bannedstatus BOOLEAN DEFAULT FALSE, 
       dateofjoining TIME 
      )'); 
     $pdoStatement->execute(array_values((array) $params)); 
    } 

    function query($sql, $params = NULL){ 
     $s = $this->databaseConnection->prepare($sql); 
     $s->execute(array_values((array) $params)); 
     return $s; 
    } 

    function insert($table, $data){ 
     self::query("INSERT INTO $table(" . join(',', array_keys($data)) . ')VALUES('. str_repeat('?,', count($data)-1). '?)', $data); 
     return $this->databaseConnection->lastInsertId(); 
    } 
} 

然後我做到這一點在同一個腳本:

$database = new Database(); 


$database->insert('user',array('id' => 0, 
         'username' => 'gulaschsuppe', 
         'numberoflogins' => 23, 
         'bannedstatus' => TRUE, 
         'dateofjoining' => time())); 

$searchID = 0; 

$userData = $database->query('SELECT username FROM user WHERE id = 0'); 

$username = $userData->fetchAll(); 

print_r(array_values($username)); 

?> 

我只是想看看事情如何工作的。代碼中最重要的部分是類。我需要一點時間來弄清楚我如何獲得我想要的信息。這就是我得到的。

Array ([0] => Array ([username] => gulaschsuppe [0] => gulaschsuppe)) 

萬物的工作,但我不認爲這是獲得信息最好的方式。我得到一個數組與數組。此外,現在沒有驗證,但首先我想專注於函數查詢和插入。

那麼,你能解釋一下用戶名=> g的最後部分。 [0] => g。發生? 我想知道如何改善功能,請告訴我什麼時候我做錯了什麼。

回答

1
Array (
    [0] => Array (
     [username] => gulaschsuppe 
     [0] => gulaschsuppe 
    ) 
) 

你越來越有兩個名字列(這樣你就可以做$row['username'])和數字(所以你可以做$row[0])的結果。這是默認的PDO行爲。您需要使用PDO::FETCH_* constants才能更改提取的結果。 PDO::FETCH_BOTH是默認值。

您可以設置它,當你取:

$username = $userData->fetchAll(PDO::FETCH_ASSOC); 

或全球在某個時刻:

$this->databaseConnection->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 

在您希望只有一個列的情況下,你可以使用這個取模式:

$usernames = $userData->fetchAll(PDO::FETCH_COLUMN); 
// $usernames = array('gulaschsuppe'); 

這僅取爲每行一列,沒有纏繞在每個結果nother數組(默認獲取列0)。

有關更多詳細信息,請參閱PDOStatement::fetch()文檔。