ursus contionabundo: Objekteigenschaften in Datenbank speichern

Beitrag lesen

Müsste ich da jetzt alle Eigenschaften einzeln in einer INSERT-Anweisung aufführen? Also so "INSERT INTO books (title, price, description) VALUES($this->title, $this->price, $this->description)"?

Ich denke, mir fehlt eine genau Begrifflichkeit, die ich nicht kenne, mit der die Suche eher zum Erfolg führt.

get_object_vars() hilft Dir schon mal dabei, herauszufinden, welche Eigenschaften ein Objekt hat.

Hier mal der Schnellschrieb, der (siehe Hinweise unten, außer zu Testzwecken) nicht übernommen werden kann:

<?php

class foo {
    public $a;
    public $b;
    public $c;
    
    function __construct( $a, $b, $c )  {
		$this -> a = intval( $a );
		$this -> b = floatval( $b );
		$this -> c = trim( $c );
		#$this ->DBH = mysqli_connect("host", "user", "password", "base");
    }

    function safeInDatabase() {
    
		$ar = array_keys( get_object_vars( $this ) );
		$colums=[];
		$values=[];
		
		foreach ( $ar as $key )  {
		    if ('DBH' != $key ) {
				    $colums[] = '`' . $key . '`';
				    $type = gettype ( $this -> $key );
				    if     ( 'double'  == $type ) { $values[] = $this -> $key; }
				    elseif ( 'integer' == $type ) { $values[] = $this -> $key; }
				    elseif ( 'boolean' == $type ) { $values[] = $this -> $key; }
				    #elseif ( 'string' == $type ) { $values[] = mysqli_real_escape_string( $this -> DBH,  $this -> $key ); }
				    elseif ( 'string' == $type ) { $values[] = '"' . str_replace( '"', '\"',  $this -> $key ) . '"'; }
			 }
		}
		$sql  = 'INSERT INTO `foo` ('
			  .  implode(',',  $colums )
		      . ') VALUES ('
		      .  implode(',',  $values )
		      . ');';
		return $sql;
    }

}

$test = new foo( 42, 4.2, "Restaurant" );
echo $test-> safeInDatabase();

Resultat:

INSERT INTO `foo` (`a`,`b`,`c`) VALUES (42,4.2,"Restaurant");

Man kann den SQL-String an die Datenbank schicken, freilich auch das Binding durchführen, statt den String erst zurück- und dann auszugeben. Ebenso kann man natürlich das Verbindungsobjekt global nutzen, PDO benutzen und tausend andere Teile davon auf tausend andere Arten erledigen und sich natürlich gegen alle Fehler absichern, sogar die Tabelle darauf prüfen, ob die Spalten überhaupt existieren...