PDO: Dynamische Read- und Write-Funktion schreiben
bearbeitet von borisbaerHallo zusammen,
in meiner Model-Class möchte ich Funktionen unterbringen, um mit der mySQL-Datenbank zu interagieren. Ich habe bereits eine read-Funktion geschrieben, mit der ich prinzipiell zufrieden bin:
~~~ PHP
public static function read( $table, $column, $condition = [] )
{
$attrs = array_keys( $condition );
$sql = implode( 'AND', array_map( fn( $attr ) => "$attr = :$attr", $attrs ) );
if ( !$condition ) {
$stmt = self::prepare( "SELECT $column FROM $table" );
} else {
$stmt = self::prepare( "SELECT $column FROM $table WHERE $sql" );
foreach ( $condition as $key => $value ) {
$stmt -> bindValue( ":$key", $value );
}
}
$stmt -> execute();
$results = $stmt -> fetchAll( PDO::FETCH_ASSOC );
return $results;
}
~~~
Ein entsprechender Aufruf wäre zum Beispiel: `$releases = Model::read( 'releases', 'id, value, game', [ 'game' => $page ] );`
Ich habe versucht, eine ähnliche Funktion für das Einfügen in die Datenbank zu schreiben …
~~~ PHP
public function dbWrite( $table, $condition, $values )
{
$attrs = array_values( $condition );
$condition = implode( ',', $condition );
$sql = implode( ',', array_map( fn( $attr ) => ":$attr", $attrs ) );
$stmt = self::prepare( "INSERT INTO $table ( $condition ) VALUES ( $sql )" );
foreach ( $values as $key => $value ) {
$stmt -> bindValue ( ":$key", $value );
}
$stmt -> execute();
}
~~~
… bin jedoch nicht wirklich zufrieden damit, da ich das Gefühl habe, es könnte besser gehen.
Um zum Beispiel einen neuen Benutzer zur Datenbank hinzuzufügen, könnte man schreiben: `Model::dbWrite( 'users', [ 'username', 'email', 'password' ], [ 'username' => $username, 'email' => $email, 'password' => $password ] );`
Dies scheint mir ein wenig zu viel des Guten in Bezug auf die Länge des Befehls. Wie könnte man das Ganze eleganter lösen?
Ich wäre sehr dankbar für ein wenig Hilfe.
Grüße
Boris