Лучший способ превратить запрос MySQL в объект - PullRequest
3 голосов
/ 16 января 2011

У меня есть пользовательская таблица, которая содержит несколько столбцов, к которым я хочу получить доступ в запросе mysql для вошедшего в систему пользователя. В конечном итоге я хочу, чтобы значения в этих столбцах формировали объект User. Существует ли стандартная функция для этого или мне нужно в основном передавать каждое значение запроса в новый оператор User, чтобы они передавались в конструктор класса User?

Ответы [ 3 ]

5 голосов
/ 16 января 2011

mysql_fetch_object() позволяет указать имя класса, поэтому экземпляры этого класса будут построены на основе ваших результатов:

$result = mysql_query($sql); // Error handling not included

if (mysql_num_rows($result) == 1) {
    $user = mysql_fetch_object($result, 'User');
}

Если вы не укажете свойства и их модификаторы доступа, которыесоответствуют столбцам, перечисленным в вашем запросе SELECT, по умолчанию они будут public.

Конструктор вашего объекта называется после заполнения его свойств.Любые изменения или дополнительные задачи, которые вы хотите выполнить, могут быть выполнены в конструкторе.

2 голосов
/ 16 января 2011
1 голос
/ 01 апреля 2016

Вы должны оформить заказ mysqli_result::fetch_object. Вы также можете посмотреть расширение PDO PHP .

Таблица

Во-первых, знай свой стол.

CREATE TABLE `user` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `username` VARCHAR(256) NOT NULL,
    `password` VARCHAR(256) NOT NULL,
     PRIMARY KEY (`id`)
);

Доменный объект

Создайте свой объект. Вам не нужно определять ни одно из этих полей, потому что они будут добавлены к вашему объекту как public по умолчанию, но это понятно любому, кто может поддерживать ваш код позже; определить поля для наглядности. Средства доступа и мутаторы необходимы, так как поля являются частными.

class User {
    private $id;
    private $username;
    private $password;

    public function __construct($id, $username, $password) {
        $this->id = $id;
        $this->username = $username;
        $this->password = $password;
    }

    public function getId() { return $this->id; }
    public function setId($id) { $this->id = $id; }

    public function getUsername() { return $this->username; }
    public function setUsername($username) { $this->username = $username; }

    public function getPassword() { return $this->password; }
    public function setPassword($password) { $this->password = $password; }
}

Запрос

Создать класс запросов. Во многом это стандартный код, который можно извлечь в абстрактный класс.

class UserQuery {
    public function create() {
        return new self();
    }

    public function findById($id) {
        $user = null;
        $conn = mysqli_connect("localhost", "root", "pass", "company_db");

        if ($conn->connect_error)
            die("$conn->connect_errno: $conn->connect_error");

        $query = "SELECT * FROM `user` WHERE `id` = ?";
        $stmt = $conn->stmt_init();

        if (!$stmt->prepare($query)) {
            print "Failed to prepare statement\n";
        } else {
            $stmt->bind_param('i', $id); 
            $stmt->execute();
            $result = $stmt->get_result();
            $obj = $result->fetch_object();

            return new User($obj->id, $obj->username, $obj->password);
        }

        $stmt->close();
        $conn->close();

        return null;
    } 
}

Извлечение User объекта из таблицы user.

$user = UserQuery::create()->findById(1);
printf("Found user: %s", $user->getUsername());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...