Делая абстрактный класс твар в PHP


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

protected function properties(){
    $properties = array();
    foreach (self::$table_fields as $db_field){
        if(property_exists($this, $db_field)){
            $properties[$db_field] = $this->$db_field;
        }
    }
    return $properties;
}

public function create(){
    $db = db::getConnection()->conn;
    $properties = $this->properties();

    $key = implode(",",array_keys($properties));
    $value = implode(",:",array_keys($properties));

    $sql = "INSERT INTO ".self::$table."(" . $key . ") ";
    $sql.= "VALUES (:" . $value . ")";
    $stmt = $db->prepare($sql);
    foreach($properties as $key=>$value){
        $stmt->bindParam($key,$value);
    }
    if($stmt->execute()){
        print_r($stmt);
        $this->id = db::the_insert_id();
        return true;
    }else{
        print_r($stmt);
        return false;
    }
    return $stmt;
}

Это хорошо работает: я получаю истинное как ответ и он создает пользователя в базе данных, но я просто не знаю об этом.



159
0
задан 25 января 2018 в 09:01 Источник Поделиться
Комментарии
1 ответ


  1. Формат все идентификаторы, чтобы избежать синтаксической ошибки. Если предположить, что это MySQL, использовать обратные кавычки для целей:

    $key = "`".implode("`,`",array_keys($properties))."`";

  2. Вы собираетесь повторить вторую половину кода в каждый метод твар. Чтобы избежать этого, добавьте запроса() метод, чтобы ваш дБ класс

    public function query($sql, $params = []) {
    $stmt = self::getConnection()->conn->prepare($sql);
    $stmt->execute($params);
    return $stmt;
    }

    так вы сможете сделать ваш CRUD-методы гораздо более кратким.

    public function create(){
    $properties = $this->properties();

    $key = "`".implode("`,`",array_keys($properties))."`";
    $value = implode(",:",array_keys($properties));

    $sql = "INSERT INTO `".self::$table."` (" . $key . ") ";
    $sql.= "VALUES (:" . $value . ")";
    db::query($sql, $properties);
    $this->id = db::the_insert_id();
    }


  3. Нет смысла возвращать true или false от такого метода, единственная причина для того, чтобы возвращать false в базе ошибка и такие ошибки должны быть выданы в виде исключения и решается в других странах, делая все это ложные вещи, а бесполезно.

  4. Ваши текущие настройки после активной записи узором, что делает объект данных, содержащий все взаимодействия с базой данных, связанных с кодом. Рассмотреть вопрос о переходе к схеме сопоставления данных, где у вас есть два класса - класс данных и картографа, которая отвечает за все взаимодействие с базой данных.

0
ответ дан 25 января 2018 в 10:01 Источник Поделиться