PHP ООП сохранение, получение свойств класса в базу данных - PullRequest
1 голос
/ 26 февраля 2012

Я пытаюсь научиться упс. Я работаю с PHP-MySQL. И у меня проблемы с базами данных с помощью oop way (сохранение, обновление, получение и т. Д.).

Позвольте мне объяснить это на примере проекта.

Допустим, я хочу создать сайт с несколькими типами пользователей. У меня есть одна таблица базы данных с полем enum типа. И я сделал такие уроки:

abstract class User {
 //common properties, functions etc.. like id, username.
}

class Admin extends User {
 protected $type = "ADMIN";
 //I want here to have admin specific fields, functions etc...
}

... и некоторые другие типы пользователей. Вот эта вещь. Я хочу общий класс, который может сохранять и обновлять объекты в базе данных. Какой способ сделать это? Я сделаю объект вроде $ user = new User (); бла .. бла .. и я скажу "Сохранить этого пользователя", но как? Нужно ли создавать функции для каждого из моих классов, которые имеют конкретные операторы SQL, такие как «INSERT INTO table (name, pass и т.д.) VALUES ('name', 'pass' и т.д.)"?

Еще один момент - я хочу общий фабричный класс, который возвращает мне объект. В качестве примера я скажу: «Найдите мне пользователя, у которого есть этот идентификатор, и создайте его экземпляр с помощью класса admin, если этот пользователь является администратором или другими подобными классами».

И мне нужна помощь о том, «как создать экземпляр объекта mysqli_fetch_assoc () с объектами». Это возвращает массив. Мне нужно сделать как "$ object-> setId (return_array [" id "])"?

Я посмотрел некоторые книги, такие как PHP в действии, PHP Objects, Patterns и Practice, но не смог найти темы для этой базы данных. Я надеюсь, что смог объяснить это хорошо и извините за мой плохой английский :)

Ответы [ 2 ]

1 голос
/ 26 февраля 2012

Вот пример использования класса PDO CRUD и пример использования, надеюсь, он направит вас в правильном направлении:

<?php
/*** a new crud object ***/
$crud = new crud();

/*** The DSN ***/
$crud->dsn = "mysql:dbname=yourDB;host=localhost";

/*** MySQL username and password ***/
$crud->username = 'username';
$crud->password = 'password';


/*** array of values to insert ***/
$values = array(array('user'=>'bob', 'some_colum'=>'somevalue'));
/*** insert the array of values ***/
$crud->dbInsert('users', $values);

/*** select all records from table ***/
$records = $crud->rawSelect('SELECT * FROM users');

/*** fetch only associative array of values ***/
$rows = $records->fetchAll(PDO::FETCH_ASSOC);

/*** example display the records ***/
foreach($rows as $row){
    foreach($row as $fieldname=>$value){
        echo $fieldname.' = '.$value.'<br />';
    }
}

/*** update the user ***/
$crud->dbUpdate('users', 'user', 'bobs_new', 'id', 3);

/*** get the 3rd record ***/
$res = $crud->dbSelect('users', 'id', 3 );

/*** show the results ***/
foreach($res as $row){
    echo $row['user'].' = '.$row['some_colum'].'<br />';
}



class crud{

    private $db;
    /**
     * Set variables
     */
    public function __set($name, $value)
    {
        switch($name)
        {
            case 'username':
                $this->username = $value;
                break;

            case 'password':
                $this->password = $value;
                break;

            case 'dsn':
                $this->dsn = $value;
                break;

            default:
                throw new Exception("$name is invalid");
        }
    }

    /**
     * @check variables have default value
     */
    public function __isset($name){
        switch($name)
        {
            case 'username':
                $this->username = null;
                break;

            case 'password':
                $this->password = null;
                break;
        }
    }

    /**
     * @Connect to the database and set the error mode to Exception
     * @Throws PDOException on failure
     */
    public function conn(){
        isset($this->username);
        isset($this->password);
        if (!$this->db instanceof PDO)
        {
            $this->db = new PDO($this->dsn, $this->username, $this->password);
            $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
    }


    /**
    * @select values from table
    * @access public
    * @param string $table The name of the table
    * @param string $fieldname
    * @param string $id
    * @return array on success or throw PDOException on failure
    */
    public function dbSelect($table, $fieldname=null, $id=null){
        $this->conn();
        $sql = "SELECT * FROM `$table` WHERE `$fieldname`=:id";
        $stmt = $this->db->prepare($sql);
        $stmt->bindParam(':id', $id);
        $stmt->execute();
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }


    /**
     * @execute a raw query
     * @access public
     * @param string $sql
     * @return array
     */
    public function rawSelect($sql){
        $this->conn();
        return $this->db->query($sql);
    }

    /**
     * @run a raw query
     * @param string The query to run
     */
    public function rawQuery($sql){
        $this->conn();
        $this->db->query($sql);
    }


    /**
     * @Insert a value into a table
     * @acces public
     * @param string $table
     * @param array $values
     * @return int The last Insert Id on success or throw PDOexeption on failure
     */
    public function dbInsert($table, $values){
        $this->conn();
        /*** snarg the field names from the first array member ***/
        $fieldnames = array_keys($values[0]);
        /*** now build the query ***/
        $size = sizeof($fieldnames);
        $i = 1;
        $sql = "INSERT INTO $table";
        /*** set the field names ***/
        $fields = '( ' . implode(' ,', $fieldnames) . ' )';
        /*** set the placeholders ***/
        $bound = '(:' . implode(', :', $fieldnames) . ' )';
        /*** put the query together ***/
        $sql .= $fields.' VALUES '.$bound;

        /*** prepare and execute ***/
        $stmt = $this->db->prepare($sql);
        foreach($values as $vals)
        {
            $stmt->execute($vals);
        }
    }

    /**
     * @Update a value in a table
     * @access public
     * @param string $table
     * @param string $fieldname, The field to be updated
     * @param string $value The new value
     * @param string $pk The primary key
     * @param string $id The id
     * @throws PDOException on failure
    */
    public function dbUpdate($table, $fieldname, $value, $pk, $id){
        $this->conn();
        $sql = "UPDATE `$table` SET `$fieldname`='{$value}' WHERE `$pk` = :id";
        $stmt = $this->db->prepare($sql);
        $stmt->bindParam(':id', $id, PDO::PARAM_STR);
        $stmt->execute();
    }


    /**
     * @Delete a record from a table
     * @access public
     * @param string $table
     * @param string $fieldname
     * @param string $id
     * @throws PDOexception on failure
     * */
    public function dbDelete($table, $fieldname, $id){
        $this->conn();
        $sql = "DELETE FROM `$table` WHERE `$fieldname` = :id";
        $stmt = $this->db->prepare($sql);
        $stmt->bindParam(':id', $id, PDO::PARAM_STR);
        $stmt->execute();
    }
}

?>
0 голосов
/ 26 февраля 2012

Я думаю, вам нужен каркас ORM. Трудно создать хороший самостоятельно, но вы можете найти несколько существующих фреймворков. Будьте осторожны, не используйте фреймворк с активным шаблоном записи, потому что это антипаттерн.

Чтобы получить объекты: http://www.php.net/manual/en/mysqli-result.fetch-object.php

Но я также рекомендую использовать mysqli ОО:

$resource = new mysqli(/* ... */);
$resource->fetch_object(/* ... */)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...