2015-08-16 36 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()文档。