【问题标题】:php: Database Class with PDO. How can i make it better?php:带有 PDO 的数据库类。我怎样才能让它变得更好?
【发布时间】:2015-08-16 21:36:09
【问题描述】:

所以我开始在 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] => g。发生了? 我想知道如何改进功能,当我做错了什么时请告诉我。

【问题讨论】:

    标签: php database pdo object-oriented-database


    【解决方案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');
    

    这仅获取每一行的单个列,而不将每个结果包装在另一个数组中(默认获取列 0)。

    有关详细信息,请参阅PDOStatement::fetch() 文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-04
      • 1970-01-01
      • 2021-11-12
      • 2021-05-27
      相关资源
      最近更新 更多