• Как создать форму на css для календаря (смотреть картинку)?

    inkShio
    @inkShio
    Как вариант, но надо смотреть поддержку браузерами.
    Ответ написан
    1 комментарий
  • Какой лучше взять ORM?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это хороший вопрос, но ответ на него зависит от вашего уровня. Очень сильно зависит.
    Специалисты вам наверняка посоветуют Doctrine или Cycle. Но вы их явно не потянете.
    Для знакомства с ORM я бы порекомендовал Eloquent, при всех минусах этого выбора.

    Но если честно, то учитывая, что вы ищете замену RB, я бы порекомендовал начать с самого простого.
    spoiler
    Написать ORM руками. Причем даже не классический, поддерживающий связи и квери билдер, а совсем простой Table Gateway, типа такого:
    abstract class BasicTableGateway
    {
        protected $db;
        protected $table;
        protected $fields;
        protected $primary = 'id';
    
        public function __construct(\PDO $db)
        {
            $this->db = $db;
        }
        public function read($id): ?array
        {
            $stmt =$this->db->prepare("SELECT * FROM `$this->table` WHERE `$this->primary`=?");
            $stmt->execute([$id]);
            return $stmt->fetch();
        }
        public function insert($data): int
        {
            $this->validate($data);
    
            $fields = '`'.implode("`,`", array_keys($data)).'`';
            $placeholders = str_repeat('?,', count($data) - 1) . '?';
            $sql = "INSERT INTO `$this->table` ($fields) VALUES ($placeholders)";
            $this->db->prepare($sql)->execute(array_values($data));
            return $this->db->lastInsertId();
        }
        protected function validate($data)
        {
            $diff = array_diff(array_keys($data), $this->fields);
            if ($diff) {
                throw new \InvalidArgumentException("Unknown field(s): ". implode($diff));
            }
        }
    }

    И дальше применять его примерно так
    class UserGateway extends BasicTableGateway {
        protected $table = 'gw_users';
        protected $fields = ['email', 'password', 'name', 'birthday'];
    }
    $userGateway = new UserGateway($pdo);
    $data = [
        'email' => 'foo@bar.com',
        'password' => 123,
        'name' => 'Fooster',
    ];
    $id = $userGateway->insert($data);
    $user = $userGateway->read($id);
    echo json_encode($user),PHP_EOL;

    И никаких тебе "бинов" - обычный ПДО, обычные массивы, все просто и наглядно.


    Хотя пожалуй Dr. Bacon прав, вам и это будет сложновато. Возьмите лучше просто функцию:
    function pdo($pdo, $sql, $args = NULL)
    {
        if (!$args)
        {
             return $pdo->query($sql);
        }
        $stmt = $pdo->prepare($sql);
        $stmt->execute($args);
        return $stmt;
    }

    и дальше просто запросами

    // Create
    pdo($pdo, "INSERT INTO users VALUES (null, ?,?,?)", [$name, $email, $password]);
    // Read
    $user = pdo($pdo, "SELECT * FROM users WHERE email=?", [$email])->fetch();
    // Update
    pdo($pdo, "UPDATE users SET name=:name WHERE id=:id", ['id'=>$id, 'name'=>$name]);
    // Delete
    $deleted = pdo($pdo, "DELETE FROM users WHERE id=?", [$id])->rowCount();


    После того, как SQL будет отскакивать от зубов - можно будет посмотреть в сторону какого-нибудь ORM
    Ответ написан
    1 комментарий