Refaktor klasy Model do projektu MVC. Kończymy metodę insert. Do dzieła.

Najpierw mały refaktor klasy bazowej:

$conn = new PDOConnection();
$conn->connect();
$conn = $conn->getConnection();

abstract class Model {

    protected static $conn;

    public static function setConn($conn)
    {
        static::$conn = $conn;
    }

    public static function keysString(){
        return "(" . implode(", ", static::$keys) . ")";
    }

    public static function valuesString(){
        $values = array_map(fn($k) => ":$k", static::$keys);
        return "(" . implode(", ", $values) . ")";
    }

    abstract public static  function insert($data);

}

Teraz klasa pochodna:

class PersonModel extends Model {

    protected static $tablename = 'people';
    protected static $keys = ['name', 'age'];

    public static function insert($data){
        $table = self::$tablename;
        $keys = static::keysString();
        $vals = static::valuesString();
        echo "INSERT INTO {$table} {$keys} VALUES {$vals}";
        echo "<br>";
        print_r($data);
    }
}

Sprawdzamy, czy nadal działa:

$person = new PersonModel();
$person->insert(['name' => 'Jane', 'age' => 20]);
//INSERT INTO people (name, age) VALUES (:name, :age)
//Array ( [name] => Jane [age] => 20 )

Ok, pora dokończyć metodę insert:

class PersonModel extends Model {

    protected static $tablename = 'people';
    protected static $keys = ['name', 'age'];

    public static function insert($data){
        $table = self::$tablename;
        $keys = static::keysString();
        $vals = static::valuesString();
        $query = "INSERT INTO {$table} {$keys} VALUES {$vals}";
        $stmt = static::$conn->prepare($query);
        /*
        foreach($data as $key => $value){
            $stmt->bindParam(":$key", $value);
        }
         */   
        return $stmt->execute($data);
    }
}

$person = new PersonModel();
$person->setConn($conn);
if($person->insert(['name' => 'Jane', 'age' => 22]))
    echo "OK!";

Tutaj bindParam w pętli zostało wykomentowane, ze względu na błąd PDO, które jakoś nadpisuje te parametry i w pętlach się gubi (zarówno name jak i age miało wartość 22!).

Zamiast tego przekazujemy do execute tablicę, gdzie klucze i wartości się zgadzają.

Model będziemy rozbudowywać.