php:具有 PDO 的数据库 Class。我怎样才能让它变得更好?
php: Database Class with PDO. How can i make it better?
所以我开始在 php 中进行更多练习,并希望创建一个面向对象的论坛。因此,我想要一个数据库 class,例如:
<?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));
?>
我只是想看看效果如何。代码中最重要的部分是 class。我需要一点时间来弄清楚如何获得我想要的信息。这就是我得到的。
Array ( [0] => Array ( [username] => gulaschsuppe [0] => gulaschsuppe ) )
一切正常,但我认为这是获取信息的最佳方式。我得到一个带有数组的数组。另外,现在没有验证,但首先我想关注函数查询和插入。
所以,你能解释一下最后一部分用户名 => g 是怎么回事吗? [0] => g。发生了?
我想知道如何改进功能,当我做错了什么时请告诉我。
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');
这只为每一行提取一个列,而不将每个结果包装在另一个数组中(默认提取第 0
列)。
有关详细信息,请参阅 PDOStatement::fetch()
文档。
所以我开始在 php 中进行更多练习,并希望创建一个面向对象的论坛。因此,我想要一个数据库 class,例如:
<?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));
?>
我只是想看看效果如何。代码中最重要的部分是 class。我需要一点时间来弄清楚如何获得我想要的信息。这就是我得到的。
Array ( [0] => Array ( [username] => gulaschsuppe [0] => gulaschsuppe ) )
一切正常,但我认为这是获取信息的最佳方式。我得到一个带有数组的数组。另外,现在没有验证,但首先我想关注函数查询和插入。
所以,你能解释一下最后一部分用户名 => g 是怎么回事吗? [0] => g。发生了? 我想知道如何改进功能,当我做错了什么时请告诉我。
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');
这只为每一行提取一个列,而不将每个结果包装在另一个数组中(默认提取第 0
列)。
有关详细信息,请参阅 PDOStatement::fetch()
文档。