borisbaer: PDO: Dynamische Read- und Write-Funktion schreiben

Beitrag lesen

Hallo 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:

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 …

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

P.S.: Soweit ich gelesen habe, ist es nicht nötig, filter_input zu verwenden, wenn man mit PDO arbeitet, oder?

akzeptierte Antworten