Поэтому я начал немного больше практиковаться в php и хочу создать объектно-ориентированный форум. Поэтому я хочу иметь класс базы данных, такой как:
<?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] => ж. произошло?
Я хотел бы знать, как я могу улучшить функции, и, пожалуйста, скажите мне, когда я делаю что-то совершенно не так.
Array (
[0] => Array (
[username] => gulaschsuppe
[0] => gulaschsuppe
)
)
Вы получаете результат с обоими столбцами имен (так что вы могли бы сделать $row['username']
) и численно (так что вы можете сделать $row[0]
). Это поведение PDO по умолчанию. Вам нужно использовать PDO :: FETCH_ * константы для того, чтобы изменить извлеченные результаты. 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()
документация для более подробной информации.
Других решений пока нет …