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ć.