Objekteigenschaften in Datenbank speichern – SELFHTML-Forum Forum als Ergänzung zum SELFHTML-Wiki und zur Dokumentation SELFHTML https://forum.selfhtml.org/self Objekteigenschaften in Datenbank speichern Fri, 26 Apr 19 12:50:24 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747472#m1747472 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747472#m1747472 <p>Guten Tag,</p> <p>ich arbeite mit PHP und möchte gern ein Objekt, genauer gesagt, dessen Eigenschaften in eine Datenbank speichern. Bisher habe ich nur Hinweise gefunden, wie ich das Objekt mittels Serialisierung komplett abspeichern kann. Das ist aber nicht das, was ich will.</p> <p>Sondern ich möchte bspw. die Eigenschaften $singleBook->title, $singleBook->price und $singleBook->description in der Tabelle 'books' in die zugehörigen Spalten 'title', 'price' und 'description' speichern, damit ich danach mit einem Datenbank-"SELECT ... FROM books WHERE ..." bestimmte Bücher wieder auslesen kann.</p> <p>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)"?</p> <p>Oder lässt sich ein Objekt auch eleganter speichern? Also dass automatisch alle Objekteigenschaften auf die entsprechenden Tabellenfelder gemappt werden?</p> <p>Mir reicht auch gern einfach ein Stichwort, nach dem ich googlen kann.</p> <p>Mit "PHP objekt datenbank speichern" bzw. der englischen Enstprechung dafür, habe ich nur die Serialisierung gefunden.</p> <p>Ich denke, mir fehlt eine genau Begrifflichkeit, die ich nicht kenne, mit der die Suche eher zum Erfolg führt.</p> <p>Danke Franz</p> Objekteigenschaften in Datenbank speichern Fri, 26 Apr 19 13:02:35 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747473#m1747473 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747473#m1747473 <p>Tach!</p> <blockquote> <p>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)"?</p> </blockquote> <p>Ja, prinzipiell schon.</p> <blockquote> <p>Oder lässt sich ein Objekt auch eleganter speichern?</p> </blockquote> <p>Naja, du kannst eine Funktion drumherumbauen, die das auf diese Weise erzeugt. Aber von Haus aus hat PHP keinen Mechanismus, dem man lediglich das Objekt gibt und dazu die Eigenschaftsnamen und der macht das für dich.</p> <blockquote> <p>Also dass automatisch alle Objekteigenschaften auf die entsprechenden Tabellenfelder gemappt werden?</p> </blockquote> <p>Natürlich musst du das vorgenannte nicht nochmal selbst erfinden, denn ORMs (Objekt-Relation-Mapper) gibt es bereits.</p> <p>Bedenke aber, dass das eine Zwischenschicht ist, die Ausführungszeit braucht. Das lohnt sich erst in Projekten bestimmter Größenordnung richtig, weil die eingesparte Programmiererzeit wichtiger ist als mehr Power im Server.</p> <p>dedlfix.</p> Objekteigenschaften in Datenbank speichern Fri, 26 Apr 19 13:22:13 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747475#m1747475 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747475#m1747475 <p>hi,</p> <blockquote> <p>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)"?</p> </blockquote> <p>Korrekt!</p> <blockquote> <p>Eleganter.. Also dass automatisch alle Objekteigenschaften auf die entsprechenden Tabellenfelder gemappt werden?</p> </blockquote> <p>Bei diesem Tabellendesign würde ich von einer Automatisierung absehen. Denn erstens notierst Du das INSERT Statement sowieso nur einmal (prepared), zweitens bleibt es leserlich und drittens bist Du bei etwaigen Änderungen ruckzuck fertig. MFG</p> Objekteigenschaften in Datenbank speichern Fri, 26 Apr 19 13:34:51 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747479#m1747479 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747479#m1747479 <p>Tach!</p> <blockquote> <p>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)"?</p> </blockquote> <p>Nachtrag: So geht "SQL-Statement" natürlich nicht. Da fehlt die kontextgerechte Behandlung der Werte. Oder aber die Verwendung von Prepared Statements.</p> <p>dedlfix.</p> Objekteigenschaften in Datenbank speichern Fri, 26 Apr 19 14:21:30 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747484#m1747484 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747484#m1747484 <blockquote> <p>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)"?</p> </blockquote> <blockquote> <p>Ich denke, mir fehlt eine genau Begrifflichkeit, die ich nicht kenne, mit der die Suche eher zum Erfolg führt.</p> </blockquote> <p><a href="https://www.php.net/manual/de/function.get-object-vars.php" rel="nofollow noopener noreferrer">get_object_vars()</a> hilft Dir schon mal dabei, herauszufinden, welche Eigenschaften ein Objekt hat.</p> <p>Hier mal der Schnellschrieb, der (siehe Hinweise unten, außer zu Testzwecken) nicht übernommen werden kann:</p> <pre><code class="block language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">foo</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token variable">$a</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token variable">$b</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token variable">$c</span><span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span> <span class="token variable">$a</span><span class="token punctuation">,</span> <span class="token variable">$b</span><span class="token punctuation">,</span> <span class="token variable">$c</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span> <span class="token operator">-></span> <span class="token property">a</span> <span class="token operator">=</span> <span class="token function">intval</span><span class="token punctuation">(</span> <span class="token variable">$a</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$this</span> <span class="token operator">-></span> <span class="token property">b</span> <span class="token operator">=</span> <span class="token function">floatval</span><span class="token punctuation">(</span> <span class="token variable">$b</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$this</span> <span class="token operator">-></span> <span class="token property">c</span> <span class="token operator">=</span> <span class="token function">trim</span><span class="token punctuation">(</span> <span class="token variable">$c</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">#$this ->DBH = mysqli_connect("host", "user", "password", "base");</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function-definition function">safeInDatabase</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$ar</span> <span class="token operator">=</span> <span class="token function">array_keys</span><span class="token punctuation">(</span> <span class="token function">get_object_vars</span><span class="token punctuation">(</span> <span class="token variable">$this</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$colums</span><span class="token operator">=</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token variable">$values</span><span class="token operator">=</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span> <span class="token variable">$ar</span> <span class="token keyword">as</span> <span class="token variable">$key</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token string single-quoted-string">'DBH'</span> <span class="token operator">!=</span> <span class="token variable">$key</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$colums</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'`'</span> <span class="token operator">.</span> <span class="token variable">$key</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'`'</span><span class="token punctuation">;</span> <span class="token variable">$type</span> <span class="token operator">=</span> <span class="token function">gettype</span> <span class="token punctuation">(</span> <span class="token variable">$this</span> <span class="token operator">-></span> <span class="token variable">$key</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token string single-quoted-string">'double'</span> <span class="token operator">==</span> <span class="token variable">$type</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$values</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$this</span> <span class="token operator">-></span> <span class="token variable">$key</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">elseif</span> <span class="token punctuation">(</span> <span class="token string single-quoted-string">'integer'</span> <span class="token operator">==</span> <span class="token variable">$type</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$values</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$this</span> <span class="token operator">-></span> <span class="token variable">$key</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">elseif</span> <span class="token punctuation">(</span> <span class="token string single-quoted-string">'boolean'</span> <span class="token operator">==</span> <span class="token variable">$type</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$values</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$this</span> <span class="token operator">-></span> <span class="token variable">$key</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">#elseif ( 'string' == $type ) { $values[] = mysqli_real_escape_string( $this -> DBH, $this -> $key ); }</span> <span class="token keyword">elseif</span> <span class="token punctuation">(</span> <span class="token string single-quoted-string">'string'</span> <span class="token operator">==</span> <span class="token variable">$type</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$values</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'"'</span> <span class="token operator">.</span> <span class="token function">str_replace</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'"'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'\"'</span><span class="token punctuation">,</span> <span class="token variable">$this</span> <span class="token operator">-></span> <span class="token variable">$key</span> <span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'"'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token variable">$sql</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'INSERT INTO `foo` ('</span> <span class="token operator">.</span> <span class="token function">implode</span><span class="token punctuation">(</span><span class="token string single-quoted-string">','</span><span class="token punctuation">,</span> <span class="token variable">$colums</span> <span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string single-quoted-string">') VALUES ('</span> <span class="token operator">.</span> <span class="token function">implode</span><span class="token punctuation">(</span><span class="token string single-quoted-string">','</span><span class="token punctuation">,</span> <span class="token variable">$values</span> <span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string single-quoted-string">');'</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$sql</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token variable">$test</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">foo</span><span class="token punctuation">(</span> <span class="token number">42</span><span class="token punctuation">,</span> <span class="token number">4.2</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"Restaurant"</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token variable">$test</span><span class="token operator">-></span> <span class="token function">safeInDatabase</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </span></code></pre> <p>Resultat:</p> <pre><code class="block language-sql"><span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> <span class="token identifier"><span class="token punctuation">`</span>foo<span class="token punctuation">`</span></span> <span class="token punctuation">(</span><span class="token identifier"><span class="token punctuation">`</span>a<span class="token punctuation">`</span></span><span class="token punctuation">,</span><span class="token identifier"><span class="token punctuation">`</span>b<span class="token punctuation">`</span></span><span class="token punctuation">,</span><span class="token identifier"><span class="token punctuation">`</span>c<span class="token punctuation">`</span></span><span class="token punctuation">)</span> <span class="token keyword">VALUES</span> <span class="token punctuation">(</span><span class="token number">42</span><span class="token punctuation">,</span><span class="token number">4.2</span><span class="token punctuation">,</span><span class="token string">"Restaurant"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>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 <strong>und sich natürlich gegen alle Fehler absichern, sogar die Tabelle darauf prüfen, ob die Spalten überhaupt existieren...</strong></p> Objekteigenschaften in Datenbank speichern Sun, 28 Apr 19 15:18:26 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747623#m1747623 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747623#m1747623 <blockquote> <p>Oder lässt sich ein Objekt auch eleganter speichern? Also dass automatisch alle Objekteigenschaften auf die entsprechenden Tabellenfelder gemappt werden?</p> </blockquote> <p>Undefiniert viele Eigenschaften sollte man nicht in Feldern speichern.</p> <p>Lang ists her, da habe ich ein Konzept für Smartphones entwickelt. Genauer: Das Finden geeigneter Modelle aufgrund von geforderten Eigenschaften.</p> <p>Smartphones sind Objekte mit ungezählten Eigenschaften und ständig kommen Eigenschaften hinzu bei neuen Smartphones.</p> <p>Ich brauche dazu drei Tabellen:</p> <ul> <li>Smartphone-Modelle</li> <li>Eigenschaften</li> <li>Verknüpfung Modelle - Eigenschaften n:n</li> </ul> <p>Der suchende Kunde kann nun beliebig viele Eigenschaften markieren (checkbox) und dann die Modelle mit Beschreibung sehen.</p> <p>Ist es das, was du suchst?</p> <p>EDIT: Das System kam nicht zum Einsatz, weil der Handel Kaufentscheidungen per Bauchgefühl möchte.</p> Objekteigenschaften in Datenbank speichern Fri, 26 Apr 19 13:15:25 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747474#m1747474 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747474#m1747474 <p>Vielen Dank für die schnelle Antwort.</p> <p>Und es sieht so aus, dass "Objekt-Relation-Mapper" der Begriff ist, den ich gebraucht habe </p> <p>Ein schönes Wochenende dir!</p> Objekteigenschaften in Datenbank speichern Fri, 26 Apr 19 15:47:13 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747488#m1747488 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747488#m1747488 <p>Hallo,</p> <p>und bevor du dir selbst eins entwickelst, empfehle ich dir noch <a href="https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/index.html" rel="nofollow noopener noreferrer">Doctrine ORM</a>.</p> <p>Das ist wohl das größte und bekannteste ORM. Lass dich davon nicht erschlagen, es ist nicht ganz trivial. Aber es lohnt sich, sich damit zu beschäftigen.</p> <p>Viele Grüße Matti</p> Objekteigenschaften in Datenbank speichern Fri, 26 Apr 19 13:41:10 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747481#m1747481 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747481#m1747481 <blockquote> <p>Nachtrag: So geht "SQL-Statement" natürlich nicht. Da fehlt die kontextgerechte Behandlung der Werte. Oder aber die Verwendung von Prepared Statements.</p> </blockquote> <p>Yepp!</p> <p>Ich verwende generell Prepared Statements.</p> <p>Danke aber für den Hinweis!</p> Objekteigenschaften in Datenbank speichern Fri, 26 Apr 19 15:29:13 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747486#m1747486 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747486#m1747486 <p>Hallo ursus,</p> <p>das zeitweilige Minus war von mir, ich habe nicht richtig hingeschaut. Darum ist es wieder weg. Sorry.</p> <p>Als generische Reflection-Lösung ist das nicht schlecht, allerdings hatte der OP auch geschrieben, dass er nicht alle Attribute mappen will. Deswegen halte ich die Reflection-Lösung hier für suboptimal. Besser wäre - meiner Meinung nach - ein generischer SQL Builder, dem Du einen Satz Spaltennamen und Werte vor die Füße kübelst und der daraus ein INSERT Statement baut.</p> <p>Übrigens bin ich der Meinung, dass man es sich gar nicht erst angewöhnen sollte, Stringliterale in einem SQL Statement in "Anführungszeichen" zu setzen. Der Standard-Delimiter für ANSI SQL Stringliterale ist das 'Hochkomma'. Es gibt in MYSQL und auch MSSQL Schalter, die "Literale" erlauben, aber eigentlich verwendet man diese Notation für Tabellen- oder Spaltennamen, die Sonderzeichen enthalten. Also das, wofür MYSQL auch den `Backtick` anbietet und MSSQL die [eckigen Klammern].</p> <p>Meine Idee, wie man einen SQL Builder einsetzen könnte:</p> <pre><code class="block language-php"><span class="token keyword">function</span> <span class="token function-definition function">saveInDatabase</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name static-context">SQLBuilder</span><span class="token operator">::</span><span class="token function">createInsert</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'books'</span><span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token string double-quoted-string">"title"</span> <span class="token operator">=></span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token constant">DBH</span><span class="token operator">-></span><span class="token function">escape_string</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">title</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"price"</span> <span class="token operator">=></span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token constant">DBH</span><span class="token operator">-></span><span class="token function">escape_string</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">title</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"description"</span> <span class="token operator">=></span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token constant">DBH</span><span class="token operator">-></span><span class="token function">escape_string</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">description</span><span class="token punctuation">)</span> <span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Wenn man an diesem Punkt ist, fragt man sich natürlich, warum man überhaupt das DB-Handle im Datenobjekt hat, eigentlich weiß der SQL Builder damit viel mehr anzufangen. Warum nicht gleich einen SQL Handler draus machen? Das ist jetzt auch ein Schnellschrieb zur Veranschaulichung, keine Garantie auf Funktion :)</p> <pre><code class="block language-php"><span class="token keyword">function</span> <span class="token function-definition function">saveInDatabase</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name static-context">SQLHandler</span><span class="token operator">::</span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'books'</span><span class="token punctuation">)</span> <span class="token operator">-></span><span class="token function">AddString</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'title'</span><span class="token punctuation">,</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">title</span><span class="token punctuation">)</span> <span class="token operator">-></span><span class="token function">AddNumber</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'price'</span><span class="token punctuation">,</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">price</span><span class="token punctuation">)</span> <span class="token operator">-></span><span class="token function">AddString</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'description'</span><span class="token punctuation">,</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">description</span><span class="token punctuation">)</span> <span class="token operator">-></span><span class="token function">execute</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Ich bin ein Fan von verkettbaren APIs. Man baut das so, dass SQLHandler::insert() ein Objekt erzeugt, das den Insert erzeugen kann. Dieses Objekt hat Methoden, die die Daten ergänzen und das Objekt wieder zurückgeben. Dadurch kann man die Aufrufe verketten. Der letzte Aufruf erzeugt dann den INSERT und führt ihn auch gleich aus.</p> <pre><code class="block language-php"><span class="token keyword">class</span> <span class="token class-name-definition class-name">SQLHandler</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token variable">$DB</span><span class="token punctuation">;</span> <span class="token comment">// Hier das MYSQLI-Objekt speichern</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">function</span> <span class="token function-definition function">insert</span><span class="token punctuation">(</span><span class="token variable">$DB</span><span class="token punctuation">,</span> <span class="token variable">$table</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">SQLInsertFactory</span><span class="token punctuation">(</span><span class="token variable">$table</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">SQLInsertFactory</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token variable">$db</span><span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token variable">$table</span><span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token variable">$columns</span><span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token variable">$values</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token variable">$db</span><span class="token punctuation">,</span> <span class="token variable">$table</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">db</span> <span class="token operator">=</span> <span class="token variable">$db</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">table</span> <span class="token operator">=</span> <span class="token variable">$table</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">columns</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">values</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function-definition function">addColumnAndValue</span><span class="token punctuation">(</span><span class="token variable">$col</span><span class="token punctuation">,</span> <span class="token variable">$val</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">array_push</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">columns</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"`<span class="token interpolation"><span class="token variable">$col</span></span>`"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">array_push</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">values</span><span class="token punctuation">,</span> <span class="token variable">$val</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">AddString</span><span class="token punctuation">(</span><span class="token variable">$col</span><span class="token punctuation">,</span> <span class="token variable">$val</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">addColumnAndValue</span><span class="token punctuation">(</span><span class="token variable">$col</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"'"</span><span class="token operator">.</span><span class="token variable">$db</span><span class="token operator">-></span><span class="token function">escape_string</span><span class="token punctuation">(</span><span class="token variable">$val</span><span class="token punctuation">)</span><span class="token operator">.</span><span class="token string double-quoted-string">"'"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">AddNumber</span><span class="token punctuation">(</span><span class="token variable">$col</span><span class="token punctuation">,</span> <span class="token variable">$val</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">addColumnAndValue</span><span class="token punctuation">(</span><span class="token variable">$col</span><span class="token punctuation">,</span> <span class="token function">floatval</span><span class="token punctuation">(</span><span class="token variable">$val</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">execute</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$sql</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"INSERT INTO `<span class="token interpolation"><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">table</span></span>` ("</span> <span class="token operator">.</span> <span class="token function">implode</span><span class="token punctuation">(</span><span class="token string double-quoted-string">", "</span><span class="token punctuation">,</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">columms</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string double-quoted-string">") VALUES ("</span> <span class="token operator">.</span> <span class="token function">implode</span><span class="token punctuation">(</span><span class="token string double-quoted-string">", "</span><span class="token punctuation">,</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">values</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string double-quoted-string">")"</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">db</span><span class="token operator">-></span><span class="token function">query</span><span class="token punctuation">(</span><span class="token variable">$sql</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <p>Sowas kann man noch ausfeilen zu einem InsertOrUpdate, mit Zusatzmethoden um die Key-Columns für den Update zu definieren. Die üblichen CRUD-Statements kann man damit generisch erzeugen.</p> <p>Und wenn man irgendwann von mysqli auf mssql oder postgre wechseln will, lädt man bloß einen anderen SQLHandler ins Projekt.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Objekteigenschaften in Datenbank speichern Sat, 27 Apr 19 06:40:01 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747503#m1747503 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747503#m1747503 <p>Nur am Rande: In Perl gibt es den Hash Slice womit man Feldnamen mit den dazugegörigen Values zweckmäßig verbindet:</p> <pre><code class="block language-perl"><span class="token variable">@fields</span> <span class="token operator">=</span> <span class="token string">qw(isbn author year)</span><span class="token punctuation">;</span> <span class="token comment"># Feldnamen, Eigenschaften</span> <span class="token keyword">my</span> <span class="token variable">@qm</span> <span class="token operator">=</span> map<span class="token punctuation">{</span><span class="token string">"?"</span><span class="token punctuation">}</span><span class="token number">1</span><span class="token operator">..</span>scalar <span class="token variable">@fields</span><span class="token punctuation">;</span> <span class="token comment"># Platzhalter f. Insert</span> <span class="token variable">$dbh</span><span class="token operator">-></span><span class="token keyword">do</span><span class="token punctuation">(</span>qq<span class="token punctuation">(</span> insert into books <span class="token punctuation">(</span><span class="token variable">@</span><span class="token punctuation">{</span><span class="token punctuation">[</span>join <span class="token string">','</span><span class="token punctuation">,</span> <span class="token variable">@fields</span><span class="token punctuation">]</span><span class="token punctuation">}</span><span class="token punctuation">)</span> values<span class="token punctuation">(</span><span class="token variable">@</span><span class="token punctuation">{</span><span class="token punctuation">[</span>join <span class="token string">','</span><span class="token punctuation">,</span> <span class="token variable">@qm</span><span class="token punctuation">]</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token variable">@book</span><span class="token punctuation">{</span><span class="token string">"@fields"</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Womit man das Array mit den Feldnamen/Eignschaften zentral halten kann. Wichtig ist es, in der Tabelle Defaultwerte zu setzen insbesondere bei Erweiterungen. Ansonsten hat man nur noch ein Array was im Code bei Veränderungen anzupassen wäre.</p> Objekteigenschaften in Datenbank speichern Sat, 27 Apr 19 13:00:14 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747534#m1747534 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747534#m1747534 <p>hi,</p> <p>Du hast Feldnamen und Werte in 2 verschiedenen Arrays. Das ist schlecht in Hinsicht auf Datenkonsisenz. Deswegen ja mein Hinweis auf den <a href="https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747503#m1747503" rel="noopener noreferrer">Hashslice</a> was mit Perl möglich ist: Da bleibt das nämlich schön zusammen und man braucht nur noch 1 Array mit den Feldnmamen.</p> <p>Gibt es in PHP keine verleichbare Arrayfunktion? MFG</p> Objekteigenschaften in Datenbank speichern Sat, 27 Apr 19 09:15:25 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747519#m1747519 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747519#m1747519 <p>Hallo pl,</p> <blockquote> <p>Nur am Rande: In Perl […]</p> </blockquote> <p>Es geht hier um PHP. Bitte hör auf ständig auf deinen Perl-Scheiss hinzuweisen. Danke.</p> <p>LG,<br> CK</p> <div class="signature">-- <br> <a href="https://wwwtech.de/about" rel="noopener noreferrer">https://wwwtech.de/about</a> </div> Doodle? Sat, 27 Apr 19 09:22:42 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747520#m1747520 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747520#m1747520 <blockquote> <p>Scheiss</p> </blockquote> <p>Ich habe gerade geschaut, <a href="https://de.wikipedia.org/wiki/Google_Doodle" rel="nofollow noopener noreferrer">ob Google heute ein besonderes Doodle hat</a>. Hab keines gesehen, ganz normales Logo. Fazit: Heute ist, entgegen der von Dir erzeugten Vermutung, nicht der international ausgerufene <em><strong>"Schlechte-Laune-Samstag"</strong></em>.</p> Objekteigenschaften in Datenbank speichern Sat, 27 Apr 19 09:25:35 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747521#m1747521 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747521#m1747521 <p>Hallo ursus,</p> <p>meine Wortwahl hier war bewusst und mit Absicht. Ich habe keine Lust mehr, bei jedem Thread PLs Unsinn und Getrolle – kurz: scheiss – zu lesen.</p> <p>LG,<br> CK</p> <div class="signature">-- <br> <a href="https://wwwtech.de/about" rel="noopener noreferrer">https://wwwtech.de/about</a> </div> Blick über den Tellerrand Sat, 27 Apr 19 11:49:51 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747530#m1747530 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747530#m1747530 <p>Hi Jörg,</p> <p>WIR lassen UNS doch nicht von irgendwelchen HONKs die Laune verderben. DIE sollen doch erstmal zeigen was SIE draufhaben, aber wahrscheinlich kommt da eh nicht viel bis gar nüscht.</p> <p>Schönes Wochenende Dir (und mir natürlich)!</p> <p>PS: Was Perl DBI betrifft, das ist ein Blick übern Tellerrand den sich jeder PHP Programmierer, der sich ernsthaft mit dem Thema Datenbankanbindung befasst, mal antun sollte. Ansonsten bleiben die halt in ihrer Wurstsuppe auf der sie dahergeschwommen kommen.</p> <div class="signature">-- <br> HONK: Hilfskraft Ohne Nennenswerte Kenntnisse </div> "Schlechte-Laune-Samstag" Sat, 27 Apr 19 09:27:33 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747522#m1747522 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747522#m1747522 <blockquote> <p>meine Wortwahl hier war bewusst und mit Absicht.</p> </blockquote> <p>Um so schlimmer.</p> "Schlechte-Laune-Samstag" Sat, 27 Apr 19 09:28:48 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747523#m1747523 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747523#m1747523 <p>Hallo ursus,</p> <p>Bezug nehmend auf deine Überschrift: meine Laune ist nicht schlecht. Es reicht einfach nur. Das Maß ist voll.</p> <p>LG,<br> CK</p> <div class="signature">-- <br> <a href="https://wwwtech.de/about" rel="noopener noreferrer">https://wwwtech.de/about</a> </div> "Schlechte-Laune-Samstag" Sat, 27 Apr 19 09:36:41 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747524#m1747524 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747524#m1747524 <blockquote> <p>meine Laune ist nicht schlecht.</p> </blockquote> <p>Nun. Deine Wortwahl vermittelt - mit allem Verlaub - den gegenteiligen Eindruck.</p> <pre><code class="block">Ich bin so guter Dinge, So heiter und rein, Und wenn ich einen Fehler beginge, Könnt's keiner sein. </code></pre> <p>Johann Wolfgang von Goethe</p> "Schlechte-Laune-Samstag" Sat, 27 Apr 19 09:41:46 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747525#m1747525 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747525#m1747525 <p>Hallo ursus,</p> <p>ich weiß nicht, was du mir in diesem Zusammenhang sagen möchtest.</p> <p>Ich erkläre nochmal, warum meine Wortwahl so ausfiel: PL äußert sich zu beinahe jedem Thread hier im Forum, wahlweise entweder mit Unsinn, mit politisch extremen Ansichten (wahlweise faschistisch oder eher im linken extremen Sprektrum), mit Verschwörungstheorien und <strong>manchmal</strong> mit tatsächlich sinnvollen Beiträgen.</p> <p>Das habe ich mir jahrelang angeschaut. Das ging sogar soweit, dass mir ernsthaft die Lust flöten gegangen ist mich überhaupt noch zu beteiligen (siehe auch meine stark gesunkene Posting-Frequenz).</p> <p>Ich habe die Schnauze voll. Wenn ich sowas sehe, gebe ich jetzt kontra, und das auch deftig. Das muss dir nicht gefallen, ist mir dann aber auch egal.</p> <p>Für mich ist hier auch Ende der Diskussion.</p> <p>LG,<br> CK</p> <div class="signature">-- <br> <a href="https://wwwtech.de/about" rel="noopener noreferrer">https://wwwtech.de/about</a> </div> "Schlechte-Laune-Samstag" Sat, 27 Apr 19 09:51:37 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747526#m1747526 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747526#m1747526 <blockquote> <p>ich weiß nicht, was du mir in diesem Zusammenhang sagen möchtest.</p> </blockquote> <p>Ich glaube nicht, dass der für die Durchsage benutzte Blumenstrauß für Dich zu dicht ist.</p> <p>Möglicherweise hilft es in solchen Situationen, sich etwas Zeit zu lassen und erst mal etwas ganz anderes zu tun. Ich denke, die "Primeldichte" ist im vorstehenden Satz auf einem Maß angelangt, welche es zulässt, dass jeder auch nur halbwegs verständige und aufmerksame Leser weiß was ich meine.</p> "Schlechte-Laune-Samstag" Sat, 27 Apr 19 10:29:17 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747528#m1747528 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747528#m1747528 <p>Hallo, Christian,</p> <p>ich möchte dir vollkommen recht geben, auch wenn ich zu einem anderen Schluss gelangt bin. Ich habe für mich entschieden, dass pl meine Zeit nicht wert ist - er hat wiederholt bewiesen, dass ihm meine Zeit (die ich in Antworten an ihn gesteckt habe) auch egal ist.</p> <p>Meine passiv-aggressive Herangehensweise an ihn scheint auf jedenfall nicht erfolgreich zu sein. Wer weiß, vielleicht freut er sich ja auch, dass er wieder jemanden aus dem Forum vergrault hat? Und daher möchte ich dir sagen, dass ich deine Vorgehensweise begrüße.</p> <p>Viele Grüße Matti</p> "Schlechte-Laune-Samstag" Sat, 27 Apr 19 10:49:10 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747529#m1747529 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747529#m1747529 <blockquote> <p>Und daher möchte ich dir sagen, dass ich deine Vorgehensweise begrüße.</p> </blockquote> <p>Nein, nicht.</p> <blockquote> <p>„Die Gesetzgebung ist an die verfassungsmäßige Ordnung, die vollziehende Gewalt und die Rechtsprechung sind an Gesetz und Recht gebunden.“</p> </blockquote> <p>Das ist das „Rechtsstaatsprinzip“ aus dem Grundgesetz, welches kluge Köpfe einst einführten, weil diese nicht damit damit einverstanden waren, dass es zwar prinzipiell Gesetze gab, diese aber die Mächtigen nicht banden.</p> <p>Wenn das also kluge Köpfe waren, dann kann es keine gute Idee sein, einerseits …</p> <blockquote> <p>Dieser Beitrag ist unkonstruktiv oder provokativ und trägt zu einer Verschlechterung der allgemeinen Stimmung im Forum bei.</p> </blockquote> <p>… als Sperrgrund zu notieren und andererseits selbst so zu formulieren wie es Christian in einem „Haudraufmoment“ getan hat. Denn solches Handeln ist nicht nur provokativ sondern vorliegend auch das Paradebeispiel von <em>"Ich mach die Regeln, halte mich aber selbst nicht daran!"</em> und insofern (sic: und durch die Vorbildwirkung!) trägt es auch zur <em>"Verschlechterung der allgemeinen Stimmung im Forum"</em> bei.</p> "Schlechte-Laune-Samstag" Sat, 27 Apr 19 13:09:45 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747536#m1747536 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747536#m1747536 <p>Tach!</p> <blockquote> <p>ich möchte dir vollkommen recht geben, auch wenn ich zu einem anderen Schluss gelangt bin. Ich habe für mich entschieden, dass pl meine Zeit nicht wert ist - er hat wiederholt bewiesen, dass ihm meine Zeit (die ich in Antworten an ihn gesteckt habe) auch egal ist.</p> </blockquote> <p>Ich empfinde ähnliches. Was aber ist mit denen, die seine Antworten nicht beurteilen können. Sollen wir seine Postings einfach unkommentiert im Forum stehen lassen? Auf dass seine Unkenrufe die Qualität des Forums betreffend sich durch seine Postings von selbst bestätigen?</p> <blockquote> <p>Meine passiv-aggressive Herangehensweise an ihn scheint auf jedenfall nicht erfolgreich zu sein. Wer weiß, vielleicht freut er sich ja auch, dass er wieder jemanden aus dem Forum vergrault hat? Und daher möchte ich dir sagen, dass ich deine Vorgehensweise begrüße.</p> </blockquote> <p>Prinzipiell ja, aber mit der Wortwahl bin ich nicht einverstanden. Man macht sich damit nur selbst angreifbar, wenn man sich auf so ein Niveau begibt.</p> <p>Vielleicht ist es an der Zeit, die Konsequenzen aus seinem immer wieder gezeigten (gelinde gesagt) Unwillen der Zusammenarbeit zu ziehen und seine Postings nur noch mit dem Löschknopf zu kommentieren.</p> <p>dedlfix.</p> Blick über den Tellerrand Sat, 27 Apr 19 12:28:34 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747531#m1747531 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747531#m1747531 <p>Ich hatte gehofft, dass Du dazu schweigst. Ich weiß allerdings auch SEHR GENAU wie schwer das ist.</p> <blockquote> <p>"HONKs", "HONK: Hilfskraft Ohne Nennenswerte Kenntnisse", "Wurstsuppe", "erstmal zeigen was SIE draufhaben".</p> </blockquote> <p>Das war jetzt zwar Deine Meinung, aber in Hinsicht auf <a href="https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747529#m1747529" rel="noopener noreferrer">mein Ansinnen</a> ist ausgerechnet Deine Wortwahl nicht hilfreich. Auch ist einiges davon inhaltlich nicht vertretbar: CK hat was drauf: Er hat immerhin mindestens dieses Forum programmiert.</p> <p>Du willst nicht, dass man Dich beleidigt? Dann ruf einfach nicht in den Wald. Auch nicht als Entgegnung, falls Du das als solche verstanden haben willst.</p> <p>Ja, auch Dir ein schönes Wochenende.</p> Objekteigenschaften in Datenbank speichern Sat, 27 Apr 19 13:06:48 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747535#m1747535 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747535#m1747535 <p>Hallo pl,</p> <p>doch, hätte ich machen können, wäre vermutlich sogar einfacher gewesen. Mein Einstiegsbeispiel verwendet das.</p> <p>Mein c# Background, in dem es „sortierte Dictionarys“ nicht gibt, hat da zugeschlagen.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Objekteigenschaften in Datenbank speichern Sat, 27 Apr 19 13:13:39 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747537#m1747537 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747537#m1747537 <p>Der Hash Slice Hack in Perl geht so, daß anstelle eines Wertes für einen Schlüssel ein Array von Werten für ein Array von Schlüsseln geliefert wird. Und zwar in genau derselben Reihenfolge. Aber offensichtlich gibt es sowas in PHP gar nicht. Für DB Anwendungen jedenfalls ist sowas ungemein praktisch. MFG</p> Objekteigenschaften in Datenbank speichern Sat, 27 Apr 19 13:48:12 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747539#m1747539 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747539#m1747539 <p>Tach!</p> <blockquote> <p>Der Hash Slice Hack in Perl geht so, daß anstelle eines Wertes für einen Schlüssel ein Array von Werten für ein Array von Schlüsseln geliefert wird. Und zwar in genau derselben Reihenfolge. Aber offensichtlich gibt es sowas in PHP gar nicht. Für DB Anwendungen jedenfalls ist sowas ungemein praktisch.</p> </blockquote> <p>Die Daten stecken in einem Objekt. Wenn nur ein paar Felder davon genommen werden sollen, müsste man einen Objekt-Slice erstellen oder das Objekt erst in ein Array konvertieren, um davon dann einen Teil herauszunehmen. So nett ein Array-Slice auch wirken mag, muss man hier also erst die Gegebenheiten anpassen, um es überhaupt nutzen zu können.</p> <p>Wenn es lediglich darum geht, eine Liste von Eigenschaftsnamen (als Magic Strings) anzugeben, dann kann man das auch als Array of Strings tun und es der aufgerufenen Funktion überlassen, über diese zu iterieren und die entsprechenden Daten aus dem Objekt für das Statement zu besorgen. Die Daten als einen Ausschnitt aus einem Array vorliegen zu haben, um dann lediglich mit einem Join zusammenzufügen, mag verlockend aussehen. Aber zum einen ist einen Liste von Eigenschaften anzugeben nicht aufwendiger als eine solche Liste für einen Array-Slice zu notieren. Zum anderen ist ein simples Join als Folgeverarbeitung nicht ausreichend, weil es den Kontextwechsel unberücksichtigt lässt. Da müsste man bei der Verarbeitung des Slices etwas mit Callback haben, um den Wert korrekt maskieren zu können.</p> <p>Da halte ich es für einfacher und flexibler eine simple Schleife über das Array der Eigenschaftsnamen durchzulaufen. Letzten Endes ist das Join in Verbindung mit dem Array-Slice nur Syntactic Sugar, der in diesem Fall noch dazu ein unbrauchbares Ergebnis liefert, wenn man daraus ein herkömmliches SQL-Statement erzeugt.</p> <p>Der Array-Slice-Voschlag berücksichtigt zudem auch nicht, dass die RolfB-Methode ein maßgeschneidertes Vorgehen für die verschiedenen Datentypen ist, die man auch problemlos um weitere Dinge ergänzen kann, zum Beispiel eine Prüfung des tatsächlichen Datentypes oder eines Wertebereiches.</p> <p>dedlfix.</p> Objekteigenschaften in Datenbank speichern Sat, 27 Apr 19 15:53:07 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747541#m1747541 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747541#m1747541 <p>Tach!</p> <blockquote> <blockquote> <p>Der Hash Slice Hack in Perl geht so, daß anstelle eines Wertes für einen Schlüssel ein Array von Werten für ein Array von Schlüsseln geliefert wird. Und zwar in genau derselben Reihenfolge. Aber offensichtlich gibt es sowas in PHP gar nicht. Für DB Anwendungen jedenfalls ist sowas ungemein praktisch.</p> </blockquote> </blockquote> <blockquote> <p>Die Daten stecken in einem Objekt. Wenn nur ein paar Felder davon genommen werden sollen, müsste man einen Objekt-Slice erstellen oder das Objekt erst in ein Array konvertieren, um davon dann einen Teil herauszunehmen. So nett ein Array-Slice auch wirken mag, muss man hier also erst die Gegebenheiten anpassen, um es überhaupt nutzen zu können.</p> </blockquote> <p>Genau so eine Funktion würde ich mir schreiben. Denn das ist das Eigentliche worauf es ankommt und das war ja auch das ursprüngliche Anliegen <a href="https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747472#m1747472" rel="noopener noreferrer"> Also dass automatisch alle Objekteigenschaften auf die entsprechenden Tabellenfelder gemappt werden?</a></p> <p>PHP's <a href="https://www.php.net/manual/de/function.get-object-vars.php" rel="nofollow noopener noreferrer">get_object_vars()</a> ist leider nicht die Lösung. Guck Dir <a href="https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747533#m1747533" rel="noopener noreferrer">meinen Perlcode</a> an da kannst Du was lernen.</p> <p>MFG</p> Objekteigenschaften in Datenbank speichern Sat, 27 Apr 19 16:38:56 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747544#m1747544 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747544#m1747544 <p>Tach!</p> <blockquote> <p>PHP's <a href="https://www.php.net/manual/de/function.get-object-vars.php" rel="nofollow noopener noreferrer">get_object_vars()</a> ist leider nicht die Lösung. Guck Dir <a href="https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747533#m1747533" rel="noopener noreferrer">meinen Perlcode</a> an da kannst Du was lernen.</p> </blockquote> <p>Nein, ich kann daraus nichts lernen, weil ich ihn nicht in allen Einzelheiten verstehe. Es reicht nicht, einfach nur Perlcode hinzuwerfen, wenn PHP das Thema ist. Die Syntax von Perl ist zu speziell, als dass man das problemarm verstehen würde. Ich sehe zudem nicht, dass Perl mir irgendwas gibt, was ich nicht bereits mit den mir bekannten Programmiersprachen erledigen kann.</p> <p>Das was ich aber in deinem Posting sehe, ist fachlich nichts neues für mich. Ich sehe aber auch, dass du dich mal wieder überschätzt, was die Nützlichkeit deiner Antwort für das gegebene Thema angeht.</p> <p>dedlfix.</p> Objekteigenschaften in Datenbank speichern Sun, 28 Apr 19 05:53:45 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747573#m1747573 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747573#m1747573 <p>Tach!</p> <blockquote> <blockquote> <p>PHP's <a href="https://www.php.net/manual/de/function.get-object-vars.php" rel="nofollow noopener noreferrer">get_object_vars()</a> ist leider nicht die Lösung. Guck Dir <a href="https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747533#m1747533" rel="noopener noreferrer">meinen Perlcode</a> an da kannst Du was lernen.</p> </blockquote> <p>Nein, ich kann daraus nichts lernen, weil ich ihn nicht in allen Einzelheiten verstehe.</p> </blockquote> <p>Hab ich doch erklärt: Der Code macht ein Insert genau mit den Feldnamen die vorliegen bzw. vorgegeben sind. Und das ist das worauf es bei Datenbankanwendungen ankommt. Deswegen wird im DB Design ein Default definiert und ein erweitertes INSERRT Statement notiert. Erweitert heißt: Es werden die Feldnamen aufgeführt.</p> <p>Wenn Eigenschaften/Felder fehlen sollten</p> <pre><code class="block language-perl"><span class="token keyword">my</span> <span class="token variable">%book</span> <span class="token operator">=</span> <span class="token punctuation">(</span> isbn <span class="token operator">=></span> <span class="token string">"12-34"</span><span class="token punctuation">,</span> author <span class="token operator">=></span> <span class="token string">'Max-Heinrich Schramm'</span><span class="token punctuation">,</span> title <span class="token operator">=></span> <span class="token string">'Der Weg war völlig umsonst'</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">%book</span> <span class="token operator">=</span> <span class="token punctuation">(</span> author <span class="token operator">=></span> <span class="token string">'Martin Selber'</span><span class="token punctuation">,</span> title <span class="token operator">=></span> <span class="token string">'Mit Spule Draht und Morsetaste'</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Schlägt das Statement nicht fehl, weil vorher mit <code>keys %book</code> die Felder ermittelt werden und damit das Statement präpariert wird.</p> <p>Aber Du hast schon recht, den PerlCode brauchen wir hier nicht, weil es darauf ankommt die Idee zu verstehen! MFG</p> Objekteigenschaften beim Kaufangebot präsentieren - oder ich kauf nix! Sun, 28 Apr 19 20:37:43 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747643#m1747643 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747643#m1747643 <blockquote> <p>Das System kam nicht zum Einsatz, weil der Handel Kaufentscheidungen per Bauchgefühl möchte.</p> </blockquote> <p>Das ist schlicht wahr. Allerdings sehe ich mich immer mehr in der Situation, dass ich einen Kauf NICHT tätige, wenn ich über die mich interessierenden Eigenschaften NICHT informiert werde. In manchen Märkten packe ich eiskalt aus um an die Produktbeschreibung zu kommen oder mir das Gerät anzusehen…</p> <p>Was jetzt Deinen Beitrag betrifft wüsste ich zu gern was daran den Mausklick beförderte. Kann nichts daran finden - vermutlich hat sich jemand schlicht verklickt.</p> Objekteigenschaften in Datenbank speichern Mon, 29 Apr 19 06:18:37 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747653#m1747653 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747653#m1747653 <p>Tach!</p> <blockquote> <blockquote> <p>Oder lässt sich ein Objekt auch eleganter speichern? Also dass automatisch alle Objekteigenschaften auf die entsprechenden Tabellenfelder gemappt werden?</p> </blockquote> <p>Undefiniert viele Eigenschaften sollte man nicht in Feldern speichern.</p> </blockquote> <p>Wenn es denn undefiniert viele sind. Aber undefiniert viele würde ich auch nicht als Eigenschaften von Objekten modellieren wollen. Undefinierte Werte ist besser in Key-Value-Arrays (assoziative Arrays, Dictionarys) aufgehoben. Der Unterschied ist, dass die Namen von Objekteigenschaften Identifier sind, die genau bekannt sind, und damit sind sie auch vom Code direkt ansprechbar. Ein Array ist eine Sammlung mit praktisch unbegrenzter Anzahl von Elementen, deren Keys aber auch zur Entwicklungszeit unbekannt sein können. Ja, Objekt in PHP können ebenfalls zur Laufzeit beliebig viele Eigenschaften dazubekommen, doch das ergibt nur einen Haufen Probleme. Da man ja nicht weiß, welche der Eigenschaften es sind, ist es schwierig, die festen von den variablen Eigenschaften zu trennen, vor allem, wenn man über lediglich letztere iterieren möchten. Ja, Iterieren über Objekteigenschaften geht grundsätzlich, ist aber letztlich nur ein Notbehelf. Um die variablen Eigenschaften ansprechen zu können, braucht man <a href="https://www.php.net/manual/en/language.variables.variable.php" rel="nofollow noopener noreferrer">variable Variablen</a>, aber dann kann man auch gleich einen Array-Zugriff nehmen. Variable Objekteigenschaften bieten keinen allgemeinen Vorteile gegenüber Arrays.</p> <blockquote> <p>Ich brauche dazu drei Tabellen:</p> <ul> <li>Smartphone-Modelle</li> <li>Eigenschaften</li> <li>Verknüpfung Modelle - Eigenschaften n:n</li> </ul> </blockquote> <p>Das typische EAV-Modell. Aber im vorliegenden Fall ging es wohl nicht um beliebig viele unbekannte Eigenschaften, sondern um Objekte mit bekannten Eigenschaften und nur um einen einzelnen Mechanismus, der diese nicht zu kennen braucht, weil er generisch gestaltet werden soll.</p> <blockquote> <p>Ist es das, was du suchst?</p> </blockquote> <p>EAV hat seinen großen Auftritt, wenn es sich zur um erst zur Laufzeit bekannte Eigenschaften handelt. Doch EAV ist kein Allheilmittel. Man wird auch erheblichen nachteiligen Aufwand feststellen, wenn es für bekannte Strukturen verwendet werden soll. Referenzielle Integrität lässt sich zum Beispiel damit nicht vom DBMS sicherstellen. Die Eigenschaftsnamen sind Magic Strings. Hat man den richtigen String, passiert zur Laufzeit das richtige. Aber zur Entwicklungszeit kann man das nicht durch statische Code-Analyse überwachen. EAV hat sich nicht ohne Grund nicht als das allein seelig machende Speichermodell etabliert.</p> <p>dedlfix.</p> Objekteigenschaften beim Kaufangebot präsentieren - oder ich kauf nix! Sun, 28 Apr 19 20:40:54 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747644#m1747644 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747644#m1747644 <p>Hallo ursus,</p> <p>ich war's nicht, aber auf die Frage nach ORM mit einem Beispiel für ein EAV-Tabellendesign zu antworten passt nicht so ganz.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> Nachtrag Mon, 29 Apr 19 09:40:23 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747666#m1747666 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747666#m1747666 <blockquote> <p>aber auf die Frage nach ORM mit einem Beispiel für ein EAV-Tabellendesign zu antworten passt nicht so ganz.</p> </blockquote> <p>Ja. Aber wenn man plötzlich jeden Blick durch die Glaskugel (Hier nach dem Motto: "Was willst Du eigentlich wirklich?") abstrafen wöllte, dann ist das ebenfalls daneben. Ich denke Linuchs wollte ein Beispiel dafür geben, wie man ein solches Konstrukt vermeiden könnte. Und für manchen (ich zähle dazu) ist ein Beispiel aussagekräftiger als "tausend Worte", die bei manchem "mangels verständlicher Wörter" oft auch nur als "Geblahfasel" ankommen.</p> <p>Die Ausgangsfrage war ja, zusammengekürzt diese:</p> <blockquote> <blockquote> <blockquote> <p>ich arbeite mit PHP und möchte gern ein Objekt, genauer gesagt, dessen Eigenschaften in eine Datenbank speichern. Bisher habe ich nur Hinweise gefunden, wie ich <strong>das Objekt mittels Serialisierung komplett abspeichern</strong> kann. Das ist aber nicht das, was ich will.</p> </blockquote> </blockquote> </blockquote> <p>und, vor allem:</p> <blockquote> <blockquote> <blockquote> <p>Oder lässt sich ein Objekt auch eleganter speichern? Also dass <strong>automatisch alle Objekteigenschaften auf die entsprechenden Tabellenfelder gemappt</strong> werden?</p> </blockquote> </blockquote> </blockquote> <p>Das lässt, im Hinblick auf ungenaue und teils sogar unrichtige Problemdarstellungen einer Vielzahl anderer Fragender unter anderem durchaus die (wohl) von Linuchs getroffene Spekulation zu, dass der TO auch beliebige, vorher nicht (zum Zeitpunkt des Programmierens also unbekannte) Eigenschaften abspeichern will. Linuchs schreibt ja (wohl) deshalb auch <em>"Undefiniert viele Eigenschaften sollte man nicht in Feldern speichern."</em></p> <p><strong>Wenn da schon mit negativ bewertet wird, dann geht die Stimmung hier vor die Hunde, weil sich im Hinblick auf anonyme negative Bewertungen mit allenfalls geringfügigster, vorliegend sogar fragwürdiger und vor allem gar nicht <s>gegebener</s> gelieferter Rechtfertigung keiner mehr antwortet.</strong></p> <p><strong>Nachtrag:</strong></p> <p>Wie ich gerade sehe ist die negative Bewertung "spurenfrei" weg. Danke!</p> Objekteigenschaften in Datenbank speichern Mon, 29 Apr 19 18:16:38 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747714#m1747714 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747714#m1747714 <p>Hallo,</p> <blockquote> <blockquote> <p>Ich brauche dazu drei Tabellen:</p> <ul> <li>Smartphone-Modelle</li> <li>Eigenschaften</li> <li>Verknüpfung Modelle - Eigenschaften n:n</li> </ul> </blockquote> <p>Das typische EAV-Modell.</p> </blockquote> <p>So wie ich EAV bisher begriffen habe, wird dabei <em>eine</em> Tabelle mit drei <em>Spalten</em> verwendet. Nicht aber wie Linuchs vorschlägt 3 <em>Tabellen</em>.</p> <p>Gruß<br> Kalk</p> Objekteigenschaften in Datenbank speichern Mon, 29 Apr 19 21:06:22 Z https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747718#m1747718 https://forum.selfhtml.org/self/2019/apr/26/objekteigenschaften-in-datenbank-speichern/1747718#m1747718 <p>Tach!</p> <blockquote> <blockquote> <blockquote> <p>Ich brauche dazu drei Tabellen:</p> <ul> <li>Smartphone-Modelle</li> <li>Eigenschaften</li> <li>Verknüpfung Modelle - Eigenschaften n:n</li> </ul> </blockquote> <p>Das typische EAV-Modell.</p> </blockquote> <p>So wie ich EAV bisher begriffen habe, wird dabei <em>eine</em> Tabelle mit drei <em>Spalten</em> verwendet. Nicht aber wie Linuchs vorschlägt 3 <em>Tabellen</em>.</p> </blockquote> <p>Du meinst das, was Linuchs als die dritte aufgeführt hat, das V. Aber man braucht schon noch die erste Tabelle als die, die das Ding beschreibt, dessen Eigenschaftswerte in Tabelle 3 stehen. Fachbegriff für das Ding ist Entität, also E. Und Tabelle 2 braucht es, um die Eigenschaften mit deren Metadaten zu verwalten, also A.</p> <p>Man kann zur Not auf A verzichten, muss dann aber immer Tabelle V scannen, um alle Eigenschaftsnamen zu erhalten. Aber das wird dann noch unhandlicher, als das EAV-Model schon ist.</p> <p>In der Praxis sieht es sogar noch so aus, dass man mitunter mehrere V-Tabellen hat, je Datentyp eine, damit man nicht alle Nicht-Strings serialisieren oder als Literal speichern muss. Daraus ergibt sich meist auch, mehrere A-Tabellen zu haben, um die referenzielle Integrität mit Fremdschlüssel-Beziehungen sicherstellen zu können.</p> <p>dedlfix.</p>