tag:forum.selfhtml.org,2005:/self PHP Oop Datenbank Klasse – SELFHTML-Forum 2017-11-17T09:39:03Z https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708015#m1708015 j4nk3y 2017-11-09T16:17:48Z 2017-11-09T16:17:48Z PHP Oop Datenbank Klasse <p>Einen wunderschönen guten Abend zusammen,</p> <p>Da ich seit einiger Zeit im Frontend Objekt orientiert Arbeite und mein PHP seit langem nicht mehr angefasst habe, habe ich mich entschlossen mein vorhandenes Backend auf meinen derzeitigen Kenntnisstand zu aktualisieren.</p> <p>Nach einiger Recherche und einigen Beispielen habe ich <a href="https://www.johnmorrisonline.com/simple-php-class-prepared-statements-mysqli/" rel="nofollow noopener noreferrer">dieses</a> Beispiel einer Datenbank Klasse gefunden.</p> <p>Wie die URL schon sagt ist es ein einfaches Beispiel, welches selbst meiner Meinung nach sowohl die Vorteile von Prepared Statements vollkommen übergeht als auch logisch einen Nachteil hat, da für jede Query eine neues <code>mysqli</code>-Objekt erstellt wird und somit eine eigene Datenbankverbindung für jede Query.</p> <p>Dennoch habe ich aus dem Beispiel einiges für mich extrahieren können was ich noch nicht wusste.</p> <p>Nun habe ich mindestens noch eine Fragen.</p> <ol> <li><code>call_user_func_array( array( $stmt, 'bind_param'), $foo);</code>, wie muss $foo generell aufgebaut sein? Aus dem Beispiel sieht es für mich so aus, als ob es etwa so aussehen müsste:<br> <code>$foo = ['sdi', "colA" => "Foo", "colB" => 13.37, "colC" => 42]</code>. Wäre das so Korrekt?</li> </ol> <p>Weitere Fallen mir gerade nicht ein, denn wenn meine Vermutung bei 1. richtig ist, erübrigen sich meine Fragen die ich Gestern noch hatte.</p> <p>Schon einmal Danke im voraus und noch einen schönen Abend.</p> <p>Gruß<br> Jo</p> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708017#m1708017 dedlfix 2017-11-09T16:33:30Z 2017-11-09T16:33:30Z PHP Oop Datenbank Klasse <p>Tach!</p> <blockquote> <p>Nach einiger Recherche und einigen Beispielen habe ich <a href="https://www.johnmorrisonline.com/simple-php-class-prepared-statements-mysqli/" rel="nofollow noopener noreferrer">dieses</a> Beispiel einer Datenbank Klasse gefunden.</p> </blockquote> <p>Lass das lieber. Das ist 4 Jahre alt. Nimm PDO, das ist auch objektorientiert und im Lieferumfang von PHP enthalten, und somit mit jedem Update PHPs aktuell.</p> <blockquote> <p>Dennoch habe ich aus dem Beispiel einiges für mich extrahieren können was ich noch nicht wusste.</p> <p>Nun habe ich mindestens noch eine Fragen.</p> <ol> <li><code>call_user_func_array( array( $stmt, 'bind_param'), $foo);</code>, wie muss $foo generell aufgebaut sein? Aus dem Beispiel sieht es für mich so aus, als ob es etwa so aussehen müsste:<br> <code>$foo = ['sdi', "colA" => "Foo", "colB" => 13.37, "colC" => 42]</code>. Wäre das so Korrekt?</li> </ol> </blockquote> <p>Da fängt es schon an, unschön zu werden. Bei einem der zwei Bindings (Parameter oder Ergebnisse, habs vergessen welches der beiden) muss man noch extra Referenzen aus den Array-Elementen machen. Mit PDO sind solche Verrenkungen nicht notwendig.</p> <p>Jedenfalls will call_user_func_array() nur ein einfaches Array und kein assoziatives.</p> <p>dedlfix.</p> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708018#m1708018 Rolf B 2017-11-09T17:00:09Z 2017-11-09T17:00:09Z PHP Oop Datenbank Klasse <p>Hallo j4nk3y,</p> <p>ständiges Neuerstellen eines mysqli Handles ist ein Problem, oder auch nicht. Es gilt bei manchen sogar als good practice, eine DB-Connection wie eine heiße Kartoffel zu behandeln: Schnappen, kurz halten, fallenlassen. Dafür wird aber implizit vorausgesetzt, dass die Datenbankanbindung Connection Pooling betreibt, d.h. nicht jedes new mysqli() erzeugt physisch eine neue Connection, sondern es wird eine existierende Connection aus dem Pool wiederverwendet. Das kannst Du in mysqli aktivieren (<a href="http://php.net/manual/de/mysqli.persistconns.php" rel="noopener noreferrer">siehe hier</a>). Ohne das Connection Pooling würde tatsächlich immer eine neue physische Connection hergestellt, das kostet Zeit.</p> <p>Das Array bei call_user_func_array ersetzt die einzelnen Parameter, die call_user_func bekäme. Wichtig ist hier, dass das Array ab der zweiten Position <strong>Referenzen</strong> auf Variablen enthält (<a href="http://php.net/manual/en/mysqli-stmt.bind-param.php" rel="noopener noreferrer">siehe hier, 2. Note</a>). Mir wäre unbekannt, dass die Array-Einträge besondere Schlüssel bräuchten, die Zuordnung zu Parametern erfolgt in der Reihenfolge, wie die Einträge ins Array gekommen sind. Werte einzutragen, wie Du es gemacht hast, funktioniert nicht. Man kann SQL-Parameter nur an Variablen binden. Sinn ist, dass Du das einmal tust und dann pro Aufruf des SQL-Statements die Variablenwerte änderst.</p> <p>Aber - vergiss die von Dir verlinkte Klasse für produktive Aufgaben, sie ist schlecht gemacht.</p> <ul> <li>Parameterbindung und Statementausführung muss trennbar sein, sonst erfüllt die Binderei nur die Hälfte ihres Zwecks (Zweck 1: Escapen der Werte vermeiden, Zweck 2: Der Server bekommt das Statement nur einmal und muss es nur einmal optimieren, danach kann man es N mal benutzen)</li> <li>Einen Connect zu machen und dann nicht zu disconnecten führt zu einer Menge "vergessener" Datenbank-Handles. Wenn man pro Statement neu connected, dann muss man auch pro Statement disconnecten</li> </ul> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708062#m1708062 j4nk3y 2017-11-10T11:21:00Z 2017-11-10T11:21:00Z PHP Oop Datenbank Klasse <p>Moin,</p> <p>Allgemeine Frage Nummer 2.</p> <pre><code class="block language-php"><span class="token keyword">function</span> <span class="token function-definition function">fooBar</span> <span class="token punctuation">(</span> <span class="token variable">$foo</span><span class="token punctuation">,</span> <span class="token variable">$bar</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string single-quoted-string">'*'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token variable">$foobar</span><span class="token operator">=</span><span class="token constant">null</span> <span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token comment">//do something</span> <span class="token punctuation">}</span> <span class="token function">fooBar</span> <span class="token punctuation">(</span> <span class="token string double-quoted-string">"foo"</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// I</span> <span class="token function">fooBar</span> <span class="token punctuation">(</span> <span class="token string double-quoted-string">"foo"</span><span class="token punctuation">,</span> <span class="token comment">/* *** */</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string double-quoted-string">"foo"</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'foo'</span><span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// II</span> </code></pre> <p>Wie kann ich die Funktion <code>fooBar</code> aufrufen ohne eine 2te Variable mitzugeben, sodass <code>$bar= ['*']</code> ist und <code>$foobar = ["foo" => 'foo']</code> (Aufruf II)?</p> <p>Gruß<br> Jo</p> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708066#m1708066 pl 2017-11-10T11:38:19Z 2017-11-10T11:44:25Z PHP Oop Datenbank Klasse <blockquote> <p>Wie die URL schon sagt ist es ein einfaches Beispiel, welches selbst meiner Meinung nach sowohl die Vorteile von Prepared Statements vollkommen übergeht als auch logisch einen Nachteil hat, da für jede Query eine neues mysqli-Objekt erstellt wird und somit eine eigene Datenbankverbindung für jede Query.</p> </blockquote> <p>Mach doch die Verbindung, egalob mysqli oder PDO, zu einer Eigenschaft der Instanz dann steht sie in jeder Methode zur Verfügung. MfG</p> <p>PS: Falls Du auf PDO umsteigst, ändert sich ggf. der Syntax in den einzelnen Methoden. Du könntest ja auch die vorliegende Klasse als Basisklasse nehmen und die Methoden einfach nach Deinen Bedürfnissen überschreiben.</p> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708118#m1708118 j4nk3y 2017-11-11T08:27:28Z 2017-11-11T08:31:52Z PHP Oop Datenbank Klasse <p>Guten Morgen zusammen,</p> <p>Ich hatte gestern schonmal ein wenig Zeit mich an einen ersten Entwurf zu setzen.</p> <p>Mir ist bewusst, dass es sicher noch Verbesserungspotenzial gibt aber seht selbst. Für Verbessunrgsvorschläge bin ich gerne offen.</p> <pre><code class="block language-php"><span class="token keyword">class</span> <span class="token class-name-definition class-name">DB</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token variable">$user</span><span class="token punctuation">,</span> <span class="token variable">$password</span><span class="token punctuation">,</span> <span class="token variable">$database</span><span class="token punctuation">,</span> <span class="token variable">$host</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'localhost'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token variable">$user</span> <span class="token operator">=</span> <span class="token variable">$user</span><span class="token punctuation">;</span> <span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token variable">$password</span> <span class="token operator">=</span> <span class="token variable">$password</span><span class="token punctuation">;</span> <span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token variable">$database</span> <span class="token operator">=</span> <span class="token variable">$database</span><span class="token punctuation">;</span> <span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token variable">$host</span> <span class="token operator">=</span> <span class="token variable">$host</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">__clone</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">public</span> <span class="token keyword">static</span> <span class="token keyword">function</span> <span class="token function-definition function">getInstance</span><span class="token punctuation">(</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 operator">!</span><span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token variable">$instance</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token variable">$instance</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">PDO</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"mysql:dbname=<span class="token interpolation"><span class="token variable">$this</span></span>-><span class="token interpolation"><span class="token variable">$database</span></span>;host=<span class="token interpolation"><span class="token variable">$this</span></span>-><span class="token interpolation"><span class="token variable">$host</span></span>"</span><span class="token punctuation">,</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token variable">$user</span><span class="token punctuation">,</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token variable">$password</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token variable">$instance</span> <span class="token operator">-></span> <span class="token function">setAttribute</span><span class="token punctuation">(</span><span class="token class-name static-context">PDO</span><span class="token operator">::</span><span class="token constant">ATTR_ERRMODE</span><span class="token punctuation">,</span> <span class="token class-name static-context">PDO</span><span class="token operator">::</span><span class="token constant">ERRMODE_EXCEPTION</span><span class="token punctuation">,</span> <span class="token class-name static-context">PDO</span><span class="token operator">::</span><span class="token constant">ATTR_DEFAULT_FETCH_MODE</span><span class="token punctuation">,</span> <span class="token class-name static-context">PDO</span><span class="token operator">::</span><span class="token constant">FETCH_ASSOC</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token variable">$instance</span> <span class="token operator">-></span> <span class="token function">beginTransaction</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">return</span> <span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token variable">$instance</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">select</span> <span class="token punctuation">(</span> <span class="token variable">$table</span><span class="token punctuation">,</span> <span class="token variable">$columns</span><span class="token punctuation">,</span> <span class="token variable">$where</span><span class="token punctuation">,</span> <span class="token variable">$limit</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$stmt</span> <span class="token operator">=</span> <span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token variable">$instance</span> <span class="token operator">-></span> <span class="token function">prepare</span><span class="token punctuation">(</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">prepareQuery</span> <span class="token punctuation">(</span> <span class="token string single-quoted-string">'select'</span><span class="token punctuation">,</span> <span class="token variable">$table</span><span class="token punctuation">,</span> <span class="token variable">$columns</span><span class="token punctuation">,</span> <span class="token variable">$where</span><span class="token punctuation">,</span> <span class="token variable">$limit</span> <span class="token punctuation">)</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 function">is_array</span><span class="token punctuation">(</span> <span class="token variable">$where</span><span class="token punctuation">[</span><span class="token number">0</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">$result</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">$where</span> <span class="token keyword">as</span> <span class="token variable">$value</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$stmt</span> <span class="token operator">-></span> <span class="token function">bindValues</span> <span class="token punctuation">(</span> <span class="token variable">$value</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 operator">!</span><span class="token variable">$stmt</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> <span class="token keyword">return</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$result</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$stmt</span> <span class="token operator">-></span> <span class="token function">fetchAll</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">return</span> <span class="token variable">$result</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token variable">$stmt</span> <span class="token operator">-></span> <span class="token function">bindValues</span> <span class="token punctuation">(</span> <span class="token variable">$where</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 operator">!</span><span class="token variable">$stmt</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> <span class="token keyword">return</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token variable">$stmt</span> <span class="token operator">-></span> <span class="token function">fetchAll</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 keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">insert</span> <span class="token punctuation">(</span> <span class="token variable">$table</span><span class="token punctuation">,</span> <span class="token variable">$data</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$stmt</span> <span class="token operator">=</span> <span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token variable">$instance</span> <span class="token operator">-></span> <span class="token function">prepare</span><span class="token punctuation">(</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">prepareQuery</span> <span class="token punctuation">(</span> <span class="token string single-quoted-string">'insert'</span><span class="token punctuation">,</span> <span class="token variable">$table</span><span class="token punctuation">,</span> <span class="token variable">$data</span> <span class="token punctuation">)</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 function">is_array</span><span class="token punctuation">(</span> <span class="token variable">$data</span><span class="token punctuation">[</span><span class="token number">0</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">foreach</span> <span class="token punctuation">(</span> <span class="token variable">$data</span> <span class="token keyword">as</span> <span class="token variable">$value</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$stmt</span> <span class="token operator">-></span> <span class="token function">bindValues</span> <span class="token punctuation">(</span> <span class="token variable">$value</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 operator">!</span><span class="token variable">$stmt</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> <span class="token keyword">return</span> <span class="token constant boolean">false</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">$result</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token variable">$stmt</span> <span class="token operator">-></span> <span class="token function">bindValues</span> <span class="token punctuation">(</span> <span class="token variable">$data</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 operator">!</span><span class="token variable">$stmt</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> <span class="token keyword">return</span> <span class="token constant boolean">false</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 constant boolean">true</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">getLastInsertId</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 keyword static-context">self</span><span class="token operator">::</span><span class="token variable">$instance</span><span class="token operator">-></span><span class="token function">lastInsertId</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">public</span> <span class="token keyword">function</span> <span class="token function-definition function">update</span> <span class="token punctuation">(</span> <span class="token variable">$table</span><span class="token punctuation">,</span> <span class="token variable">$data</span><span class="token punctuation">,</span> <span class="token variable">$where</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$stmt</span> <span class="token operator">=</span> <span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token variable">$instance</span> <span class="token operator">-></span> <span class="token function">prepare</span><span class="token punctuation">(</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">prepareQuery</span> <span class="token punctuation">(</span> <span class="token string single-quoted-string">'update'</span><span class="token punctuation">,</span> <span class="token variable">$table</span><span class="token punctuation">,</span> <span class="token variable">$data</span><span class="token punctuation">,</span> <span class="token variable">$where</span> <span class="token punctuation">)</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 function">is_array</span><span class="token punctuation">(</span> <span class="token variable">$data</span><span class="token punctuation">[</span><span class="token number">0</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">foreach</span> <span class="token punctuation">(</span> <span class="token variable">$data</span> <span class="token keyword">as</span> <span class="token variable">$key</span> <span class="token operator">=></span> <span class="token variable">$value</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$i</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span> <span class="token variable">$value</span> <span class="token keyword">as</span> <span class="token variable">$val</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$toBind</span><span class="token punctuation">[</span><span class="token variable">$i</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$val</span><span class="token punctuation">;</span> <span class="token operator">++</span><span class="token variable">$i</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">$where</span> <span class="token keyword">as</span> <span class="token variable">$val</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$toBind</span><span class="token punctuation">[</span><span class="token variable">$i</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$val</span><span class="token punctuation">;</span> <span class="token operator">++</span><span class="token variable">$i</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$stmt</span> <span class="token operator">-></span> <span class="token function">bindValues</span> <span class="token punctuation">(</span> <span class="token variable">$toBind</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 operator">!</span><span class="token variable">$stmt</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> <span class="token keyword">return</span> <span class="token constant boolean">false</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">$result</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token variable">$stmt</span> <span class="token operator">-></span> <span class="token function">bindValues</span> <span class="token punctuation">(</span> <span class="token variable">$data</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 operator">!</span><span class="token variable">$stmt</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> <span class="token keyword">return</span> <span class="token constant boolean">false</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 constant boolean">true</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">delete</span> <span class="token punctuation">(</span> <span class="token variable">$table</span><span class="token punctuation">,</span> <span class="token variable">$where</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$stmt</span> <span class="token operator">=</span> <span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token variable">$instance</span> <span class="token operator">-></span> <span class="token function">query</span><span class="token punctuation">(</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token function">prepareQuery</span> <span class="token punctuation">(</span> <span class="token string single-quoted-string">'delete'</span><span class="token punctuation">,</span> <span class="token variable">$table</span><span class="token punctuation">,</span> <span class="token variable">$where</span> <span class="token punctuation">)</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 operator">!</span><span class="token variable">$stmt</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> <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">commit</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token variable">$instance</span> <span class="token operator">-></span> <span class="token function">commit</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">rollBack</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token variable">$instance</span> <span class="token operator">-></span> <span class="token function">rollBack</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">prepareQuery</span> <span class="token punctuation">(</span> <span class="token variable">$type</span><span class="token punctuation">,</span> <span class="token variable">$table</span><span class="token punctuation">,</span> <span class="token variable">$data</span><span class="token punctuation">,</span> <span class="token variable">$where</span> <span class="token operator">=</span> <span class="token constant">null</span><span class="token punctuation">,</span> <span class="token variable">$limit</span> <span class="token operator">=</span> <span class="token constant">null</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$query</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span> <span class="token variable">$columns</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span> <span class="token variable">$placeholders</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</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">if</span> <span class="token punctuation">(</span> <span class="token operator">!</span><span class="token function">is_null</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">)</span> <span class="token operator">&&</span> <span class="token variable">$type</span> <span class="token operator">===</span> <span class="token string single-quoted-string">'select'</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$data</span> <span class="token operator">=</span> <span class="token punctuation">[</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 keyword">if</span> <span class="token punctuation">(</span> <span class="token variable">$data</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">$data</span> <span class="token keyword">as</span> <span class="token variable">$column</span> <span class="token operator">=></span> <span class="token variable">$value</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 variable">$type</span> <span class="token operator">===</span> <span class="token string single-quoted-string">'Select'</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$columns</span> <span class="token operator">.=</span> <span class="token string double-quoted-string">"<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$value</span><span class="token punctuation">}</span></span>,"</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 variable">$type</span> <span class="token operator">===</span> <span class="token string single-quoted-string">'insert'</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$columns</span> <span class="token operator">.=</span> <span class="token string double-quoted-string">"<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$column</span><span class="token punctuation">}</span></span>,"</span><span class="token punctuation">;</span> <span class="token variable">$placeholders</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 keyword">elseif</span> <span class="token punctuation">(</span> <span class="token variable">$type</span> <span class="token operator">===</span> <span class="token string single-quoted-string">'update'</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$columns</span> <span class="token operator">.=</span> <span class="token string double-quoted-string">"<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$column</span><span class="token punctuation">}</span></span>=?,"</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">$value</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">substr</span><span class="token punctuation">(</span><span class="token variable">$columns</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">substr</span><span class="token punctuation">(</span><span class="token variable">$placeholders</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</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 variable">$type</span> <span class="token operator">===</span> <span class="token string single-quoted-string">'Select'</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$query</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"SELECT <span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$columns</span><span class="token punctuation">}</span></span> FROM <span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$table</span><span class="token punctuation">}</span></span>"</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 variable">$type</span> <span class="token operator">===</span> <span class="token string single-quoted-string">'insert'</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$query</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"INSERT INTO <span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$table</span><span class="token punctuation">}</span></span> (<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$columns</span><span class="token punctuation">}</span></span>) VALUES (<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$placeholders</span><span class="token punctuation">}</span></span>)"</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 variable">$type</span> <span class="token operator">===</span> <span class="token string single-quoted-string">'update'</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$query</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"UPDATE <span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$table</span><span class="token punctuation">}</span></span> SET <span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$columns</span><span class="token punctuation">}</span></span>"</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 variable">$type</span> <span class="token operator">===</span> <span class="token string single-quoted-string">'delete'</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$query</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"DELETE FROM <span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$table</span><span class="token punctuation">}</span></span>"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token constant boolean">false</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 variable">$where</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$query</span> <span class="token operator">.=</span> <span class="token string double-quoted-string">" WHERE "</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span> <span class="token variable">$where</span> <span class="token keyword">as</span> <span class="token variable">$column</span> <span class="token operator">=></span> <span class="token variable">$value</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$clause</span> <span class="token operator">.=</span> <span class="token string double-quoted-string">"<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$column</span><span class="token punctuation">}</span></span> =? AND "</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">substr</span><span class="token punctuation">(</span><span class="token variable">$clause</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$query</span> <span class="token operator">.=</span> <span class="token variable">$clause</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 variable">$limit</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$query</span> <span class="token operator">.=</span> <span class="token string double-quoted-string">" LIMIT = <span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$limit</span><span class="token punctuation">}</span></span>"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token variable">$query</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">bindValues</span> <span class="token punctuation">(</span> <span class="token variable">$data</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$i</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span> <span class="token variable">$data</span> <span class="token keyword">as</span> <span class="token variable">$value</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$varType</span> <span class="token operator">=</span> <span class="token function">is_null</span><span class="token punctuation">(</span> <span class="token variable">$value</span> <span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token class-name class-name-fully-qualified static-context"><span class="token punctuation">\</span>PDO</span><span class="token operator">::</span><span class="token constant">PARAM_NULL</span> <span class="token punctuation">:</span> <span class="token function">is_bool</span><span class="token punctuation">(</span> <span class="token variable">$value</span> <span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token class-name class-name-fully-qualified static-context"><span class="token punctuation">\</span>PDO</span><span class="token operator">::</span><span class="token constant">PARAM_BOOL</span> <span class="token punctuation">:</span> <span class="token function">is_int</span><span class="token punctuation">(</span> <span class="token variable">$value</span> <span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token class-name class-name-fully-qualified static-context"><span class="token punctuation">\</span>PDO</span><span class="token operator">::</span><span class="token constant">PARAM_INT</span> <span class="token punctuation">:</span> <span class="token class-name class-name-fully-qualified static-context"><span class="token punctuation">\</span>PDO</span><span class="token operator">::</span><span class="token constant">PARAM_STR</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token operator">!</span><span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token variable">$instance</span><span class="token operator">-></span><span class="token function">bindValue</span> <span class="token punctuation">(</span> <span class="token operator">++</span><span class="token variable">$i</span><span class="token punctuation">,</span> <span class="token variable">$value</span><span class="token punctuation">,</span> <span class="token variable">$varType</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 constant boolean">false</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 constant boolean">true</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">commit</span> <span class="token punctuation">(</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 operator">!</span><span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token variable">$instance</span> <span class="token operator">-></span> <span class="token function">commit</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">return</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token constant boolean">true</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">rollBack</span> <span class="token punctuation">(</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 operator">!</span><span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token variable">$instance</span> <span class="token operator">-></span> <span class="token function">rollBack</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">return</span> <span class="token constant boolean">false</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <p>Ziel ist es für mich, die Querys in der folgenden Form zu übergeben:</p> <pre><code class="block language-php"><span class="token function">select</span> <span class="token punctuation">(</span> <span class="token string double-quoted-string">"tablename"</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string double-quoted-string">"colA"</span><span class="token punctuation">,</span><span class="token string double-quoted-string">"colB"</span><span class="token punctuation">]</span> <span class="token operator">||</span> <span class="token keyword type-declaration">null</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string double-quoted-string">"colA"</span> <span class="token operator">=></span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"colB"</span> <span class="token operator">=></span> <span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">||</span> <span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"colA"</span> <span class="token operator">=></span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"colB"</span> <span class="token operator">=></span> <span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string double-quoted-string">"colA"</span> <span class="token operator">=></span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"colB"</span> <span class="token operator">=></span> <span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">10</span> <span class="token operator">||</span> <span class="token keyword type-declaration">null</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">insert</span> <span class="token punctuation">(</span> <span class="token string double-quoted-string">"tablename"</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string double-quoted-string">"colA"</span> <span class="token operator">=></span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"colB"</span> <span class="token operator">=></span> <span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">||</span> <span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"colA"</span> <span class="token operator">=></span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"colB"</span> <span class="token operator">=></span> <span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string double-quoted-string">"colA"</span> <span class="token operator">=></span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"colB"</span> <span class="token operator">=></span> <span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string double-quoted-string">"colA"</span> <span class="token operator">=></span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"colB"</span> <span class="token operator">=></span> <span class="token number">3</span><span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">update</span> <span class="token punctuation">(</span> <span class="token string double-quoted-string">"tablename"</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string double-quoted-string">"colA"</span> <span class="token operator">=></span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"colB"</span> <span class="token operator">=></span> <span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">||</span> <span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token string double-quoted-string">"colA"</span> <span class="token operator">=></span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"colB"</span> <span class="token operator">=></span> <span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string double-quoted-string">"colA"</span> <span class="token operator">=></span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"colB"</span> <span class="token operator">=></span> <span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string double-quoted-string">"colA"</span> <span class="token operator">=></span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"colB"</span> <span class="token operator">=></span> <span class="token number">3</span><span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">delete</span> <span class="token punctuation">(</span> <span class="token string double-quoted-string">"tablename"</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token string double-quoted-string">"colA"</span> <span class="token operator">=></span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"colB"</span> <span class="token operator">=></span> <span class="token number">3</span><span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Dann noch einmal kurz auf die Sicherheit. Escapen bzw die übergebenen Daten behandeln damit eine Injection nicht möglich ist, brauchte ich bei PDO nicht mehr, richtig?</p> <p>Und noch ein kleiner Punkt, wie ist das, wenn ich noch keine Datenbank erstellt habe? Reicht es dann <code>mysql:dbname=$this->$database;host=$this->$host</code> zu <code>mysql:dbname=$this->$database</code> zu ändern? Und wie verbinde ich mich dann zu der Datenbank wenn ich diese durch einen <code>CREATE DATABASE</code>-Query erstellt habe?</p> <p>Vielen Dank und noch ein schönes Wochenende.</p> <p>Gruß<br> Jo</p> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708315#m1708315 pl 2017-11-14T08:39:56Z 2017-11-14T08:39:56Z PHP Oop Datenbank Klasse <p>Noch eine Überlegung zum Sinn und Zweck einer solchen Klasse. Man könnte eine Universal-Methode vorhalten z.B. für Insert-Statements. So wäre der Name der Tabelle das erste zu übergebende Argument und die weiteren Argumente liegen in einem assoziativen Array nach dem Schema <code>colname=>value</code></p> <p>In der Methode wird dann kumulative ein Pool gebildet, in welchem sich je Tabellenname die Statements befinden. D.h., bei jedem Aufruf der Methode wird anhand des übergebenen Tabellennamen das entsprechende Statement aus dem Pool gefischt oder es wird zunächst neu erstellt bevor es ausgeführ wird.</p> <p>Gesammelte Statements setzen natürlich voraus, daß Verbindung nicht jedesmal neu aufgebaut werden muss. Nun kannste Dir ungefähr vorstellen wie eine solche Instanz aufgebaut sein muss. Der Rest ist Tipparbeit. Aber Du wirst eine dauerhafte Freude daran haben, für Insert Statements einfach nur noch eine Funktion aufrufen zu müssen, die auch in einer Schleife notiert sein kann:</p> <pre><code class="block language-php"><span class="token variable">$pdo</span><span class="token operator">-></span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'address'</span><span class="token punctuation">,</span> <span class="token keyword">array</span><span class="token punctuation">(</span>name <span class="token operator">=></span> <span class="token string single-quoted-string">'Fuß'</span><span class="token punctuation">,</span> vname <span class="token operator">=></span> <span class="token string single-quoted-string">'Konrad'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>MfG</p> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708019#m1708019 Rolf B 2017-11-09T17:02:57Z 2017-11-09T17:04:23Z PHP Oop Datenbank Klasse <p>Hallo dedlfix,</p> <p>es ist call_user_func_array total egal ob das Array assoziativ ist oder nicht, es interessiert sich nicht dafür (eben in PHP Sandbox getestet). PHP speichert bekanntlich die Reihenfolge, in der Werte in ein Array gekommen sind, und nur die zählt. Selbst numerische Indexierung wird nicht für eine Reihenfolge beachtet.</p> <pre><code class="block language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">function</span> <span class="token function-definition function">test</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 keyword">echo</span> <span class="token string double-quoted-string">"a=<span class="token interpolation"><span class="token variable">$a</span></span>, b=<span class="token interpolation"><span class="token variable">$b</span></span>, c=<span class="token interpolation"><span class="token variable">$c</span></span>\n"</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 punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token variable">$ar</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"1"</span><span class="token punctuation">;</span> <span class="token variable">$ar</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"22"</span><span class="token punctuation">;</span> <span class="token variable">$ar</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"333"</span><span class="token punctuation">;</span> <span class="token function">call_user_func_array</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"test"</span><span class="token punctuation">,</span> <span class="token variable">$ar</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Ausgabe: a=1, b=22, c=333</span> </span></code></pre> <p>Und mysqli braucht, soweit ich das in der php Doku gerade gesehen habe, für Parameter UND Ergebnisse Referenzen auf Variablen. PDO kennt ein bind_value, aber mysqli nicht.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708024#m1708024 j4nk3y 2017-11-09T18:22:31Z 2017-11-09T18:22:31Z PHP Oop Datenbank Klasse <p>Hey,</p> <blockquote> <blockquote> <p>Nach einiger Recherche und einigen Beispielen habe ich <a href="https://www.johnmorrisonline.com/simple-php-class-prepared-statements-mysqli/" rel="nofollow noopener noreferrer">dieses</a> Beispiel einer Datenbank Klasse gefunden.</p> </blockquote> <p>Lass das lieber. Das ist 4 Jahre alt. Nimm PDO, das ist auch objektorientiert und im Lieferumfang von PHP enthalten, und somit mit jedem Update PHPs aktuell.</p> </blockquote> <p>Ja, das hab ich mir im Laufe des gestrigen Tages auch schon durch den Kopf gehen lassen. (Auch wenn es mir schon des öfteren in der Vergangenheit gesagt wurde).</p> <p>Bevor ich jetzt ein "schlechtes" Beispiel suche/finde, hättest du einen Link für mich?</p> <p>Gruß<br> Jo</p> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708025#m1708025 j4nk3y 2017-11-09T18:25:17Z 2017-11-09T18:25:17Z PHP Oop Datenbank Klasse <p>Hey,</p> <blockquote> <p>Aber - vergiss die von Dir verlinkte Klasse für produktive Aufgaben, sie ist schlecht gemacht.</p> <ul> <li>Parameterbindung und Statementausführung muss trennbar sein, sonst erfüllt die Binderei nur die Hälfte ihres Zwecks (Zweck 1: Escapen der Werte vermeiden, Zweck 2: Der Server bekommt das Statement nur einmal und muss es nur einmal optimieren, danach kann man es N mal benutzen)</li> <li>Einen Connect zu machen und dann nicht zu disconnecten führt zu einer Menge "vergessener" Datenbank-Handles. Wenn man pro Statement neu connected, dann muss man auch pro Statement disconnecten</li> </ul> </blockquote> <p>Genau das ist mir beim durchsehen eben auch aufgefallen, weshalb ich von vornherein eine gewisse Skepsis aufrechterhalten konnte und nicht einfach nur kopiere.</p> <p>Vielen Dank für deine Hinweise!</p> <p>Gruß<br> Jo</p> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708027#m1708027 dedlfix 2017-11-09T18:41:59Z 2017-11-09T18:41:59Z PHP Oop Datenbank Klasse <p>Tach!</p> <blockquote> <p>ständiges Neuerstellen eines mysqli Handles ist ein Problem, oder auch nicht. Es gilt bei manchen sogar als good practice, eine DB-Connection wie eine heiße Kartoffel zu behandeln: Schnappen, kurz halten, fallenlassen. Dafür wird aber implizit vorausgesetzt, dass die Datenbankanbindung Connection Pooling betreibt</p> </blockquote> <p>Nach meinem Wissen hieß es von Seiten MySQLs, dass der Verbindungsaufbau so schnell vonstattengeht, dass man ruhig einmal mehr eine Verbindung aufbauen kann. Es sei extra für diese Eigenheiten des Webbetriebs mit Scripts statt dauerlaufender Applikationen ausgelegt.</p> <p>dedlfix.</p> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708022#m1708022 dedlfix 2017-11-09T18:14:36Z 2017-11-09T18:14:36Z PHP Oop Datenbank Klasse <p>Tach!</p> <blockquote> <p>es ist call_user_func_array total egal ob das Array assoziativ ist oder nicht, es interessiert sich nicht dafür (eben in PHP Sandbox getestet).</p> </blockquote> <p>Na gut, das Handbuch schrub "indexed array". Unabhängig davon, dass es auch mit assoziativen Arrays geht, würde ich das aber trotzdem nicht so verwenden, weil es eher verwirrt, wenn da Elementnamen stehen, die aber gar nicht verwendet werden.</p> <blockquote> <p>PHP speichert bekanntlich die Reihenfolge, in der Werte in ein Array gekommen sind, und nur die zählt. Selbst numerische Indexierung wird nicht für eine Reihenfolge beachtet.</p> </blockquote> <p>Wenn sie foreach und nicht for mit i nehmen.</p> <blockquote> <p>Und mysqli braucht, soweit ich das in der php Doku gerade gesehen habe, für Parameter UND Ergebnisse Referenzen auf Variablen. PDO kennt ein bind_value, aber mysqli nicht.</p> </blockquote> <p>Eben, deswegen PDO und nicht mysqli. Das kann sogar ganz ohne Binding einfach Values im Execute übergeben bekommen.</p> <p>dedlfix.</p> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708026#m1708026 dedlfix 2017-11-09T18:38:05Z 2017-11-09T18:38:05Z PHP Oop Datenbank Klasse <p>Tach!</p> <blockquote> <p>Bevor ich jetzt ein "schlechtes" Beispiel suche/finde, hättest du einen Link für mich?</p> </blockquote> <p>Ja, das <a href="http://php.net/manual/en/book.pdo.php" rel="noopener noreferrer">PDO-Kapitel im PHP-Handbuch</a>. Das hat genügend Beispiele drin.</p> <p>dedlfix.</p> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708028#m1708028 j4nk3y 2017-11-09T20:30:27Z 2017-11-09T20:30:27Z PHP Oop Datenbank Klasse <p>Hey,</p> <blockquote> <blockquote> <p>Bevor ich jetzt ein "schlechtes" Beispiel suche/finde, hättest du einen Link für mich?</p> </blockquote> <p>Ja, das <a href="http://php.net/manual/en/book.pdo.php" rel="noopener noreferrer">PDO-Kapitel im PHP-Handbuch</a>. Das hat genügend Beispiele drin.</p> </blockquote> <p>Danke, aber ich finde das Manual zum Anfang immer etwas unübersichtlich und macht den Start oft etwas schwierig, weil man mit Informationen und Beispielen für oft sehr spezielle Aufgaben fast schon bombardiert wird. Mittlerweile bin ich aber auch dort angekommen.</p> <p>Dazu hab ich kurz <a href="http://www.peterkropff.de/site/php/pdo_aufbereiten.htm" rel="nofollow noopener noreferrer">hier</a> reingeschaut und etwas entdeckt was mir etwas Kopfschmerzen bereitet. Und zwar ganz unten in der "wichtig!" markierten box.<br> Was passiert denn dann mit Fließkommazahlen wenn meine Spalte vom Typ float/double ist und PDO die nur als String behandelt?</p> <p>Gruß<br> Jo</p> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708031#m1708031 Rolf B 2017-11-09T20:56:08Z 2017-11-09T20:56:08Z PHP Oop Datenbank Klasse <p>Hallo dedlfix,</p> <p>solange es auf localhost läuft, würde ich zustimmen.</p> <p>Aber wenn nicht, dann dauern die Roundtrips wohl länger. Oder macht connect gar keinen Roundtrip, sondern initialisiert nur lokal und führt den eigentlichen Connect bei erstbester Gelegenheit durch?</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708030#m1708030 Rolf B 2017-11-09T20:54:09Z 2017-11-09T20:54:09Z PHP Oop Datenbank Klasse <p>Hallo j4nk3y,</p> <p>probier's im Zweifelsfall aus, ich hab's noch nicht gebraucht. Aber ich würde befürchten, dass Du die double-Zahl als String formatieren und es MySQL überlassen musst, daraus wieder ein double zu interpretieren. Der MySQL Server weiß ja, dass in die DB eine Fließkommazahl gehört.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708032#m1708032 dedlfix 2017-11-09T20:59:46Z 2017-11-09T20:59:46Z PHP Oop Datenbank Klasse <p>Tach!</p> <blockquote> <blockquote> <p>Ja, das <a href="http://php.net/manual/en/book.pdo.php" rel="noopener noreferrer">PDO-Kapitel im PHP-Handbuch</a>. Das hat genügend Beispiele drin.</p> </blockquote> <p>Danke, aber ich finde das Manual zum Anfang immer etwas unübersichtlich und macht den Start oft etwas schwierig, weil man mit Informationen und Beispielen für oft sehr spezielle Aufgaben fast schon bombardiert wird.</p> </blockquote> <p>Wenn du in die Beschreibungen der Methoden schaust, ist das wohl so. Aber es gibt auch ein paar Kapitel bevor die Klasse PDO vorgestellt wird. Die sind eher allgemein gehalten.</p> <blockquote> <p>Dazu hab ich kurz <a href="http://www.peterkropff.de/site/php/pdo_aufbereiten.htm" rel="nofollow noopener noreferrer">hier</a> reingeschaut und etwas entdeckt was mir etwas Kopfschmerzen bereitet. Und zwar ganz unten in der "wichtig!" markierten box.</p> </blockquote> <p>Ich hab schon ganz oben Kopfschmerzen gefunden:</p> <p>"bindValue - Diese Methode arbeitet praktisch genau so wie bind_param von MySQLi."</p> <p>Der Satz stimmt überhaupt nicht.</p> <p>"Was das im Detail soll, weiß ich auch noch nicht ganz."</p> <p>Hat keine Ahnung, aber erklärt anderen die Welt. - Okay. Geht mir ja grundlegend nicht anders. Aber wenn ich so ein Tutorial schreiben wollte, dann würde ich mich wenigstens mal soweit schlau machen, dass ich so einen Satz nicht schreiben muss.</p> <blockquote> <p>Was passiert denn dann mit Fließkommazahlen wenn meine Spalte vom Typ float/double ist und PDO die nur als String behandelt?</p> </blockquote> <p>Ich kann da nur vermuten, weil ich mich nicht erinnern kann, Fließkommazahlen im DBMS benötigt zu haben. Meist brauch ich die Präzision von Decimal. Hab ich aber auch noch nicht mit PDO verarbeitet. Passieren kann da eigentlich nichts, wenn man das als String behandelt. Aus der Zahl wird ein Literal erstellt, und das DBMS parst das wieder zu einer Zahl. Das ist auch beim Floats nicht grundlegend anders. Literale für Zahlen unterscheiden sich meist auch nicht zwischen den Systemen.</p> <p>Wenn man ein SQL-Statement wie <code>SELECT * FROM table WHERE id=42</code> schreibt, ist die 42 auch nur ein Literal der Zahl 42, das erst geparst werden muss, bevor es mit den Werten der Spalte id verglichen werden kann. Also, Grund für Kopfschmerzen gibts in dem Fall nicht.</p> <p>dedlfix.</p> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708033#m1708033 dedlfix 2017-11-09T21:04:16Z 2017-11-09T21:04:16Z PHP Oop Datenbank Klasse <p>Tach!</p> <blockquote> <p>Aber wenn nicht, dann dauern die Roundtrips wohl länger. Oder macht connect gar keinen Roundtrip, sondern initialisiert nur lokal und führt den eigentlichen Connect bei erstbester Gelegenheit durch?</p> </blockquote> <p>Da gibts schon zwei, drei Roundtrips. Hab ich aber erst als negativ bemerkt, als ich mal eine Datenbank in Fernost befragen musste.</p> <p>dedlfix.</p> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708063#m1708063 dedlfix 2017-11-10T11:26:13Z 2017-11-10T11:26:13Z PHP Oop Datenbank Klasse <p>Tach!</p> <blockquote> <p>Wie kann ich die Funktion <code>fooBar</code> aufrufen ohne eine 2te Variable mitzugeben, [...]?</p> </blockquote> <p>Das geht (so) nicht. Du kannst nicht nichts übergeben.</p> <p>Aber du kannst mit etwas Logik in der Funktion ein übergebenes null auswerten und dann daraufhin einen Defaultwert setzen.</p> <p>dedlfix.</p> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708065#m1708065 j4nk3y 2017-11-10T11:31:32Z 2017-11-10T11:31:32Z PHP Oop Datenbank Klasse <p>Moin,</p> <blockquote> <p>Das geht (so) nicht. Du kannst nicht nichts übergeben.</p> <p>Aber du kannst mit etwas Logik in der Funktion ein übergebenes null auswerten und dann daraufhin einen Defaultwert setzen.</p> </blockquote> <p>Danke schön.</p> <p>Sprich:</p> <pre><code class="block language-php"><span class="token keyword">function</span> <span class="token function-definition function">fooBar</span> <span class="token punctuation">(</span> <span class="token variable">$foo</span><span class="token punctuation">,</span> <span class="token variable">$bar</span> <span class="token operator">=</span> <span class="token constant">null</span><span class="token punctuation">,</span> <span class="token variable">$foobar</span><span class="token operator">=</span><span class="token constant">null</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 operator">!</span><span class="token variable">$bar</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token variable">$bar</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string single-quoted-string">'*'</span><span class="token punctuation">]</span><span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <p>Gruß<br> Jo</p> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708100#m1708100 Rolf B 2017-11-10T15:15:12Z 2017-11-10T15:15:12Z PHP Oop Datenbank Klasse <p>Hallo j4nk3y,</p> <p>Vorsicht vor dem Type Juggler. Seine Bälle sind explosiv. Es gibt etliche Werte, die PHP als FALSE ansieht und durch Negation dann in TRUE verwandelt. Siehe <a href="http://php.net/manual/en/language.types.boolean.php" rel="noopener noreferrer">hier - Converting to booleans</a>. Beachte Niederträchtigkeiten wie "", "0" und ARRAY().</p> <p>Wenn Du auf null testen willst, dann tu das. Frage <code>is_null($bar)</code> oder <code>$bar === null</code> ab. Achtung, <code>$bar == null</code> wäre falsch, weil <code>0 == null</code> wahr ist (wie auch <code>false == null</code>, <code>[] == null</code> und <code>"" == null</code>). Ausnahme ist "0", das ist zwar falsy, aber es ist <code>"0" != null</code>.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708119#m1708119 dedlfix 2017-11-11T08:49:55Z 2017-11-11T08:49:55Z PHP Oop Datenbank Klasse <p>Tach!</p> <blockquote> <p>Mir ist bewusst, dass es sicher noch Verbesserungspotenzial gibt aber seht selbst.</p> </blockquote> <p>bindValues() brauchst du nicht. Da du sowieso nur Einzelstatements abarbeiten kannst und nicht einmal Preparieren und mehrfach Binden und Ausführen, kannst du die Parameter als Array dem execute() übergeben.</p> <p>prepareQuery() würde ich separieren für die einzelnen Typen. Lediglich die Where-Klauselerzeugung ist allen gleich, die kann in eine eigene Methode. So wie du es jetzt hast, lassen sich ungültige Statements erzeugen (INSERT mit LIMIT). UPDATE kann zwar auch LIMIT, aber das nimmt man da wohl eher nicht. Statt Schleife zum Zusammenstellen der Feld-/Parameterliste mit anschließendem Entfernen überflüssiger Verkettungsoperatoren kannst du implode() nehmen.</p> <blockquote> <p>Dann noch einmal kurz auf die Sicherheit. Escapen bzw die übergebenen Daten behandeln damit eine Injection nicht möglich ist, brauchte ich bei PDO nicht mehr, richtig?</p> </blockquote> <p>Wenn du das Prinzip verstanden hast, beantwortet sich diese Frage von selbst. Warum muss man denn maskieren? Weil man Bezeichner und Werte in die Query einfügt und dabei die Begrenzungszeichen beachten muss, damit eine gültige Syntax entsteht und nicht ein unmaskiertes Begrenzungszeichen in einem Bezeichner oder Wert die Query kaputtmacht. Bei Prepared Statements geht die Query separat auf Reisen. Die Werte werden in einem zweiten Schritt verarbeitet. Dabei übergibst du die Werte in Rohform, also nicht wie im Statement als Literal (Stringdarstellung der Werte). Für den sicheren Transport sorgt die API. Deshalb ist da kein Maskieren notwendig. Du musst aber sehr wohl maskieren, wenn du Bezeichner einfügst. Die sind vom Prepared-Statement-Mechanismus nicht betroffen. Auch Stellen wie das LIMIT sind weiterhin zu beachten.</p> <p>dedlfix.</p> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708129#m1708129 pl 2017-11-11T10:04:34Z 2017-11-11T10:04:34Z PHP Oop Datenbank Klasse <p>Moin,</p> <p>ERRMODE::EXCEPTION ist auf jeden Fall eine gute Idee. Zwei Anmerkungen zur Namensgebung:</p> <ol> <li> <p>Bedenke, dass PDO ein austauschbarer Layer ist, der also neben MySQL auch andere Engines unterstützt. Wenn Du also nur mit MySQL arbeitest und nie vorhast eine andere Engine einzusetzen, wäre der Name DB für Deine Klasse ok. Kommen jedoch weitere Layer (Sybase, Oracle..) ins Spiel, kann das anhand des Klassennamen nicht unterschieden werden. Meine Idee wären Subklassen, DB::MySQL, DB::Oracle usw.</p> </li> <li> <p>Der Name der Methode <code>getInstance()</code> ist irreführend weil ja der Konstruktor die Methode ist, welche die Instanz erstellt. Deine Methode <code>getInstance()</code> erstellt ja keine Instanz Deiner Klasse sondern stellt eine DB-Sitzung her, also eine Instanz der Klasse PDO.</p> </li> </ol> <p>Wenn man von PDO erben könnte (was ich nicht beurteilen kann) wären für Deine Klassen auch Namen wie PDO::MySQL, PDO::Sybase usw. denkbar. Ich würde mir das mal angucken. Auf jeden Fall ist eine solche Nomenklatur, was den Aufbau von Klassenhierarchien betrifft, eine Sache die sich auch in Perl bewährt hat, siehe CPAN.</p> <p>Ansonsten führt ERRMODE::EXCEPTION zwangsläufig zu einer auf Exceptions basierenden Fehlerbehandlung, Stichwort Exception Chaining. D.h., daß Exceptions bis zur Anwendung Deiner Klasse duchgereicht werden und der Anwender das in Sachen Fehlerbehandlung berücksichtigen muss. Z.B. indem er jeden Methodenaufruf zwingend in einen try/catch Block setzen muss.</p> <p>PS: Die Übergabe des Ports würde ich auf jeden Fall noch reinnehmen und den Default auf 3306 setzen. Ein Default für den Host jedoch würde ich nicht setzen, das ist ein systematischer Fehler weil Du nicht gleich merkst, wenn Du auf dem falschen Host gelandest bist.</p> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708140#m1708140 j4nk3y 2017-11-11T12:33:42Z 2017-11-11T12:33:42Z PHP Oop Datenbank Klasse <p>Hey,</p> <p>Danke für deine Hinweise.</p> <p>Ein wenig denke ich konnte ich schon umsetzen, hier nur kurz die einzelnen Methoden:</p> <pre><code class="block language-php"><span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">select</span> <span class="token punctuation">(</span> <span class="token variable">$columns</span><span class="token punctuation">,</span> <span class="token variable">$tablel</span><span class="token punctuation">,</span> <span class="token variable">$where</span><span class="token punctuation">,</span> <span class="token variable">$limit</span> <span class="token operator">=</span> <span class="token constant">null</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 operator">!</span><span class="token function">is_null</span><span class="token punctuation">(</span> <span class="token variable">$columns</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$columns</span> <span class="token operator">=</span> <span class="token punctuation">[</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 variable">$columns</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">$columns</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$query</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"SELECT <span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$columns</span><span class="token punctuation">}</span></span> FROM <span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$table</span><span class="token punctuation">}</span></span>"</span><span class="token punctuation">;</span> <span class="token variable">$query</span> <span class="token operator">.=</span> <span class="token variable">$this</span> <span class="token operator">-></span> <span class="token function">whereClause</span><span class="token punctuation">(</span> <span class="token variable">$where</span><span class="token punctuation">,</span> <span class="token variable">$limit</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$stmt</span> <span class="token operator">=</span> <span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token variable">$instance</span> <span class="token operator">-></span> <span class="token function">prepare</span><span class="token punctuation">(</span> <span class="token variable">$query</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 function">is_array</span><span class="token punctuation">(</span> <span class="token variable">$where</span><span class="token punctuation">[</span><span class="token number">0</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">foreach</span> <span class="token punctuation">(</span> <span class="token variable">$where</span> <span class="token keyword">as</span> <span class="token variable">$toBind</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 operator">!</span><span class="token variable">$stmt</span> <span class="token operator">-></span> <span class="token function">execute</span><span class="token punctuation">(</span> <span class="token variable">$toBind</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 constant boolean">false</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$result</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$stmt</span> <span class="token operator">-></span> <span class="token function">fetchAll</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 keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token operator">!</span><span class="token variable">$stmt</span> <span class="token operator">-></span> <span class="token function">execute</span><span class="token punctuation">(</span> <span class="token variable">$where</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 constant boolean">false</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$result</span> <span class="token operator">=</span> <span class="token variable">$stmt</span> <span class="token operator">-></span> <span class="token function">fetchAll</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">return</span> <span class="token variable">$result</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">insert</span> <span class="token punctuation">(</span> <span class="token variable">$table</span><span class="token punctuation">,</span> <span class="token variable">$data</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$columns</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 function">array_keys</span><span class="token punctuation">(</span> <span class="token function">is_array</span><span class="token punctuation">(</span> <span class="token variable">$data</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token variable">$data</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token punctuation">:</span> <span class="token variable">$data</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$placeholders</span> <span class="token operator">=</span> <span class="token function">substr</span> <span class="token punctuation">(</span> <span class="token function">str_repeat</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"?, "</span><span class="token punctuation">,</span> <span class="token function">count</span><span class="token punctuation">(</span> <span class="token function">is_array</span><span class="token punctuation">(</span> <span class="token variable">$data</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token variable">$data</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token punctuation">:</span> <span class="token variable">$data</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">2</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$query</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"INSERT INTO <span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$table</span><span class="token punctuation">}</span></span> (<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$columns</span><span class="token punctuation">}</span></span>) VALUES (<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$placeholders</span><span class="token punctuation">}</span></span>)"</span><span class="token punctuation">;</span> <span class="token variable">$stmt</span> <span class="token operator">=</span> <span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token variable">$instance</span> <span class="token operator">-></span> <span class="token function">prepare</span><span class="token punctuation">(</span> <span class="token variable">$query</span> <span class="token punctuation">)</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 function">is_array</span><span class="token punctuation">(</span> <span class="token variable">$data</span><span class="token punctuation">[</span><span class="token number">0</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">foreach</span> <span class="token punctuation">(</span> <span class="token variable">$data</span> <span class="token keyword">as</span> <span class="token variable">$toBind</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 operator">!</span><span class="token variable">$stmt</span> <span class="token operator">-></span> <span class="token function">execute</span><span class="token punctuation">(</span> <span class="token variable">$toBind</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 constant boolean">false</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">else</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token operator">!</span><span class="token variable">$stmt</span> <span class="token operator">-></span> <span class="token function">execute</span><span class="token punctuation">(</span> <span class="token variable">$toBind</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 constant boolean">false</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 constant boolean">true</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">update</span> <span class="token punctuation">(</span> <span class="token variable">$table</span><span class="token punctuation">,</span> <span class="token variable">$data</span><span class="token punctuation">,</span> <span class="token variable">$where</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$columns</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 function">array_keys</span><span class="token punctuation">(</span> <span class="token function">is_array</span><span class="token punctuation">(</span> <span class="token variable">$data</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token variable">$data</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token punctuation">:</span> <span class="token variable">$data</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$query</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"UPDATE <span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$table</span><span class="token punctuation">}</span></span> SET <span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$columns</span><span class="token punctuation">}</span></span>"</span><span class="token punctuation">;</span> <span class="token variable">$query</span> <span class="token operator">.=</span> <span class="token variable">$this</span> <span class="token operator">-></span> <span class="token function">whereClause</span><span class="token punctuation">(</span> <span class="token variable">$where</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$stmt</span> <span class="token operator">=</span> <span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token variable">$instance</span> <span class="token operator">-></span> <span class="token function">prepare</span><span class="token punctuation">(</span> <span class="token variable">$query</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 function">is_array</span><span class="token punctuation">(</span> <span class="token variable">$data</span><span class="token punctuation">[</span><span class="token number">0</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">$i</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span> <span class="token variable">$data</span> <span class="token keyword">as</span> <span class="token variable">$value</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">$value</span> <span class="token keyword">as</span> <span class="token variable">$val</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$toBind</span><span class="token punctuation">[</span><span class="token variable">$i</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$val</span><span class="token punctuation">;</span> <span class="token operator">++</span><span class="token variable">$i</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">$where</span> <span class="token keyword">as</span> <span class="token variable">$val</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$toBind</span><span class="token punctuation">[</span><span class="token variable">$i</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$val</span><span class="token punctuation">;</span> <span class="token operator">++</span><span class="token variable">$i</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 operator">!</span><span class="token variable">$stmt</span> <span class="token operator">-></span> <span class="token function">execute</span><span class="token punctuation">(</span> <span class="token variable">$toBind</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 constant boolean">false</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$i</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span> <span class="token variable">$data</span> <span class="token keyword">as</span> <span class="token variable">$val</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$toBind</span><span class="token punctuation">[</span><span class="token variable">$i</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$val</span><span class="token punctuation">;</span> <span class="token operator">++</span><span class="token variable">$i</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">$where</span> <span class="token keyword">as</span> <span class="token variable">$val</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$toBind</span><span class="token punctuation">[</span><span class="token variable">$i</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$val</span><span class="token punctuation">;</span> <span class="token operator">++</span><span class="token variable">$i</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 operator">!</span><span class="token variable">$stmt</span> <span class="token operator">-></span> <span class="token function">execute</span><span class="token punctuation">(</span> <span class="token variable">$toBind</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 constant boolean">false</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 constant boolean">true</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">delete</span> <span class="token punctuation">(</span> <span class="token variable">$table</span><span class="token punctuation">,</span> <span class="token variable">$where</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$query</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"DELETE FROM <span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$table</span><span class="token punctuation">}</span></span>"</span><span class="token punctuation">;</span> <span class="token variable">$query</span> <span class="token operator">.=</span> <span class="token variable">$this</span> <span class="token operator">-></span> <span class="token function">whereClause</span><span class="token punctuation">(</span> <span class="token variable">$where</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$stmt</span> <span class="token operator">=</span> <span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token variable">$instance</span> <span class="token operator">-></span> <span class="token function">query</span><span class="token punctuation">(</span> <span class="token variable">$query</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">$where</span> <span class="token keyword">as</span> <span class="token variable">$toBind</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 operator">!</span><span class="token variable">$stmt</span> <span class="token operator">-></span> <span class="token function">execute</span><span class="token punctuation">(</span> <span class="token variable">$toBind</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 constant boolean">false</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 constant boolean">true</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">query</span> <span class="token punctuation">(</span> <span class="token variable">$query</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 operator">!</span> <span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token variable">$instance</span><span class="token operator">-></span><span class="token function">exec</span><span class="token punctuation">(</span> <span class="token variable">$query</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 constant boolean">false</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token constant boolean">true</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">whereClause</span> <span class="token punctuation">(</span> <span class="token variable">$where</span><span class="token punctuation">,</span> <span class="token variable">$limit</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 operator">!</span><span class="token function">is_null</span><span class="token punctuation">(</span> <span class="token variable">$where</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$query</span> <span class="token operator">.=</span> <span class="token string double-quoted-string">" WHERE "</span><span class="token punctuation">;</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span> <span class="token variable">$where</span> <span class="token keyword">as</span> <span class="token variable">$column</span> <span class="token operator">=></span> <span class="token variable">$value</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$clause</span> <span class="token operator">.=</span> <span class="token string double-quoted-string">"<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$column</span><span class="token punctuation">}</span></span> =? AND "</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">substr</span><span class="token punctuation">(</span><span class="token variable">$clause</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$query</span> <span class="token operator">.=</span> <span class="token variable">$clause</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 operator">!</span><span class="token function">is_null</span><span class="token punctuation">(</span> <span class="token variable">$limit</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$query</span> <span class="token operator">.=</span> <span class="token string double-quoted-string">" LIMIT = <span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$limit</span><span class="token punctuation">}</span></span>"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token variable">$query</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Gruß<br> Jo</p> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708130#m1708130 dedlfix 2017-11-11T10:42:54Z 2017-11-11T10:42:54Z PHP Oop Datenbank Klasse <p>Tach!</p> <blockquote> <p>ERRMODE::EXCEPTION ist auf jeden Fall eine gute Idee.</p> </blockquote> <p>PDO::ERRMODE_EXCEPTION</p> <blockquote> <p>Meine Idee wären Subklassen, DB::MySQL, DB::Oracle usw.</p> </blockquote> <p>Themengebiet ist PHP. Bei der Schreibweise X::Y steht X für eine Klasse, Y für ein Mitglied dieser Klasse. Klassen können in PHP keine Mitglieder anderer Klassen sein. Wenn man kennzeichen möchte, dass DB und MySQL zusammenhängen, kann man das über Namspaces wie in DB\MySQL oder über eine Namenskonvention à la DB_MySQL tun. (Der Unterstrich hat keine syntaktische Bedeutung, ist nur ein anders als die Buchstaben aussehendes Zeichen.)</p> <blockquote> <p>Wenn man von PDO erben könnte (was ich nicht beurteilen kann) wären für Deine Klassen auch Namen wie PDO::MySQL, PDO::Sybase usw. denkbar.</p> </blockquote> <p>Nicht in der Syntax. Und ja, man kann von PDO erben, es ist nicht als final gekennzeichnet.</p> <blockquote> <p>Ich würde mir das mal angucken. Auf jeden Fall ist eine solche Nomenklatur, was den Aufbau von Klassenhierarchien betrifft, eine Sache die sich auch in Perl bewährt hat, siehe CPAN.</p> </blockquote> <p>Da hat es den Sinn, eine große Bibliothek zu erstellen, die viele verschiedene Themengebiete abdeckt. Das kann man auch in seinen eigenen Projekten so handhaben, aber das lohnt sich erst dann wirklich, wenn das Projekt ein bisschen grüßer geworden ist. Namespaces wären in PHP das Mittel der Wahl für eine hierarchiche Ordnung.</p> <blockquote> <p>Ansonsten führt ERRMODE::EXCEPTION zwangsläufig zu einer auf Exceptions basierenden Fehlerbehandlung, Stichwort Exception Chaining. D.h., daß Exceptions bis zur Anwendung Deiner Klasse duchgereicht werden und der Anwender das in Sachen Fehlerbehandlung berücksichtigen muss.</p> </blockquote> <p>"Ein allgemeiner Fehler ist aufgetreten." Da weiß man ja sofort, was die Ursache ist. - Exception chaining kann man machen, finde ich aber absolut unprickelnd, wenn man nur eine generische Exception bekomt und erstmal durch einen Rattenschwanz innerer Exceptions mit nichtssagenden Meldungstexten durchhangeln muss, um an die eigentliche Ursache zu kommen. Wenn man weiter oben sowieso nur eine generelle Exception abfangen kann, dann fängt <code>catch (Exception $e)</code> auch die spezielle.</p> <p>dedlfix.</p> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708134#m1708134 pl 2017-11-11T11:43:44Z 2017-11-11T11:43:44Z PHP Oop Datenbank Klasse <p>Tach!</p> <blockquote> <blockquote> <p>ERRMODE::EXCEPTION ist auf jeden Fall eine gute Idee.</p> </blockquote> <p>PDO::ERRMODE_EXCEPTION</p> <blockquote> <p>Meine Idee wären Subklassen, DB::MySQL, DB::Oracle usw.</p> </blockquote> <p>Themengebiet ist PHP. Bei der Schreibweise X::Y steht X für eine Klasse, Y für ein Mitglied dieser Klasse. Klassen können in PHP keine Mitglieder anderer Klassen sein. Wenn man kennzeichen möchte, dass DB und MySQL zusammenhängen, kann man das über Namspaces wie in DB\MySQL oder über eine Namenskonvention à la DB_MySQL tun.</p> </blockquote> <p>Ja klar. In meinen PHP-Klassenhierarchien habe ich mich auch für den Unterstrich entschieden.</p> <blockquote> <p>Und ja, man kann von PDO erben, es ist nicht als final gekennzeichnet.</p> </blockquote> <p>Gut. Klassenentwurf beginnt mit der am weitesten unten liegenden Anwenderklasse (nach E.F. Johnson), z.B. mit PDO_MySQL_WebLog wobei die Klasse WebLog sämtliche Statements in Methoden kapselt, die für eine Log-Auswertung gebraucht werden. Der Anwender einer solchen Klasse hantiert also nicht mit Statements sondern mit Methoden, z.B.</p> <pre><code class="block language-perl"><span class="token variable">$dbh</span><span class="token operator">-></span>showlog<span class="token punctuation">(</span>url <span class="token operator">=></span> <span class="token string">'/index.html'</span><span class="token punctuation">,</span> from <span class="token operator">=></span> <span class="token string">'1.1.2017'</span><span class="token punctuation">,</span> to <span class="token operator">=></span> <span class="token string">'12.10.2017'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>was freilich auch mit PHP geht nur mit einem anderen Syntax. Das Ergebnis wird direkt an die Templating Engine übergeben die damit eine Tabelle in den Browser rendert.</p> <p>Er kann jedoch auch eigene Statements in seiner Anwendung platzieren weil ja PDP_MySQL_WebLog von PDO_MySQL erbt und die DBSession somit eine public Eigenschaft in der eigenen Instanz ist.</p> <p>So jedenfalls sehe ich die Ziele von DB-Klassen, stets offen für Erweiterungen. MfG</p> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708182#m1708182 j4nk3y 2017-11-12T08:07:06Z 2017-11-12T08:07:06Z PHP Oop Datenbank Klasse <p>Guten morgen zusammen,</p> <p>Habe da noch eine Frage, da ich die Antwort nicht finden kann.</p> <pre><code class="block language-php"><span class="token variable">$stmt</span> <span class="token operator">-></span> <span class="token function">execute</span><span class="token punctuation">(</span> <span class="token variable">$toBind</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Kann das Array <code>$toBind</code> Schlüssel enthalten? Sprich <code>$toBind = ["colA" => 1]</code> oder sollten es nur die Werte mit den Standard Schlüsseln der Form: <code>$toBind = array_values(["colA" => 1])</code>?</p> <p>Gruß<br> Jo</p> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708184#m1708184 dedlfix 2017-11-12T08:35:52Z 2017-11-12T08:35:52Z PHP Oop Datenbank Klasse <p>Tach!</p> <blockquote> <p>Habe da noch eine Frage, da ich die Antwort nicht finden kann.</p> </blockquote> <p>Die steht <a href="http://php.net/manual/en/pdostatement.execute.php" rel="noopener noreferrer">im PHP-Handbuch</a>, Beispiele 2 und 3.</p> <p>dedlfix.</p> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708317#m1708317 dedlfix 2017-11-14T08:44:35Z 2017-11-14T08:44:35Z PHP Oop Datenbank Klasse <p>Tach!</p> <blockquote> <p>Gesammelte Statements setzen natürlich voraus, daß Verbindung nicht jedesmal neu aufgebaut werden muss.</p> </blockquote> <p>Wird es aber bei PHP. Der Aufwand lohnt sich nicht für die drei Statements die im Script abgesetzt werden, bevor das PHP-Script ans Ende kommt, damit der Cache für die Statements verschwindet (wenn es lediglich eine PHP-Variable ist) und die Verbindung zur Datenbank getrennt wird.</p> <p>dedlfix.</p> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708339#m1708339 j4nk3y 2017-11-14T10:20:06Z 2017-11-14T10:20:06Z PHP Oop Datenbank Klasse <blockquote> <p>Noch eine Überlegung zum Sinn und Zweck einer solchen Klasse. Man könnte eine Universal-Methode vorhalten z.B. für Insert-Statements. So wäre der Name der Tabelle das erste zu übergebende Argument und die weiteren Argumente liegen in einem assoziativen Array nach dem Schema <code>colname=>value</code></p> </blockquote> <blockquote> <pre><code class="block language-php"><span class="token variable">$pdo</span><span class="token operator">-></span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'address'</span><span class="token punctuation">,</span> <span class="token keyword">array</span><span class="token punctuation">(</span>name <span class="token operator">=></span> <span class="token string single-quoted-string">'Fuß'</span><span class="token punctuation">,</span> vname <span class="token operator">=></span> <span class="token string single-quoted-string">'Konrad'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> </blockquote> <p>Das war der Sinn warum ich damit angefangen habe. <code>DB->insert()</code> sieht gerade so bei mir aus:</p> <pre><code class="block language-php"><span class="token comment">//DB -> insert ('tablename', </span> <span class="token comment">// ["colA" => 1, "colB" => 2, ...] || [["colA" => 1, "colB" => 2], ["colA" => 2, "colB" => 3], ...] )</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">insert</span> <span class="token punctuation">(</span> <span class="token variable">$table</span><span class="token punctuation">,</span> <span class="token variable">$data</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$columns</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 function">array_keys</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token variable">$data</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token punctuation">:</span> <span class="token variable">$data</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$placeholders</span> <span class="token operator">=</span> <span class="token function">substr</span> <span class="token punctuation">(</span> <span class="token function">str_repeat</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"?, "</span><span class="token punctuation">,</span> <span class="token function">count</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token variable">$data</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token punctuation">:</span> <span class="token variable">$data</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">2</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$query</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"INSERT INTO <span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$table</span><span class="token punctuation">}</span></span> (<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$columns</span><span class="token punctuation">}</span></span>) VALUES (<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$placeholders</span><span class="token punctuation">}</span></span>)"</span><span class="token punctuation">;</span> <span class="token variable">$stmt</span> <span class="token operator">=</span> <span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token variable">$instance</span> <span class="token operator">-></span> <span class="token function">prepare</span><span class="token punctuation">(</span> <span class="token variable">$query</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 keyword">isset</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">[</span><span class="token number">0</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">foreach</span> <span class="token punctuation">(</span> <span class="token variable">$data</span> <span class="token keyword">as</span> <span class="token variable">$toBind</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 operator">!</span><span class="token variable">$stmt</span> <span class="token operator">-></span> <span class="token function">execute</span><span class="token punctuation">(</span> <span class="token function">array_values</span><span class="token punctuation">(</span> <span class="token variable">$toBind</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">return</span> <span class="token constant boolean">false</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">else</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token operator">!</span><span class="token variable">$stmt</span> <span class="token operator">-></span> <span class="token function">execute</span><span class="token punctuation">(</span> <span class="token function">array_values</span><span class="token punctuation">(</span> <span class="token variable">$data</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">return</span> <span class="token constant boolean">false</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 constant boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Logisch schwieriger finde ich es bei einem Select-Statement und Update-Statements. Nehmen wir an es gibt einen Wald in meiner Datenbank. Dieser Wald besteht aus Bäumen, welche Äste besitzen an denen Blätter hängen.</p> <p>Nun geht ein Wanderer immer den gleichen Weg durch den Wald und kennt jeden Baum am Rand seines Weges.</p> <p>Objekt orientiert würde ich jetzt für jeden Baum, den er kennt, einzeln ein Objekt erzeugen welches die Daten über sein Äste aus der Datenbank holt, um dann für jeden Ast, neue Blätter Objekte zu erzeugen welche die Daten wieder einzeln aus der Datenbank holen.</p> <p>Das nutzt nach meinem Verständnis aber nicht die Vorteile von Prepared Statements. (<a href="https://forum.selfhtml.org/self/2017/mar/5/performance-mysql-updaten/1688949#m1688949" rel="noopener noreferrer">siehe dazu</a>).</p> <p>Wohingegen procedual, ich einfach 3 Statments vorbereiten kann (nämlich Select Baum, Select Ast, Select Blatt) und für den entsprechenden Wald ich in geschachtelten Schleifen alle Statments ausführen kann um dann ein Array mit allen Daten habe.</p> <p>Zudem muss ich mir jetzt überlegen ob ich unterschiedliche Klassen für einen Wald mache, einmal zum erzeugen des Waldes und einmal zum bearbeiten des Waldes (Bäume wachsen, Blättern fallen im Herbst, Wanderer entscheiden sich einen neuen Weg zu gehen).</p> <p>Gruß<br> Jo</p> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708571#m1708571 pl 2017-11-17T07:20:30Z 2017-11-17T07:20:30Z PHP Oop Datenbank Klasse <p>Mit der Wiederverwendung von Prepared Statements meine ich nicht das Cachen der Verbindung. Der Vorteil der sich aus der Wiederverwendung von Prepared Statements ergibt, ist ja auch in der Doku zu PDO beschrieben <a href="http://php.net/manual/de/pdo.prepared-statements.php" rel="noopener noreferrer">Siehe auch</a>.</p> <p>Wenn man jedoch eine Methode hat, die bei jeden Aufruf das Statement jedesmal neu prepared, dann wird o.g. Vorteil nicht genutzt. Also wird man ein bestimmtes Statement nur einmal preparieren und solange speichern wie die Instanz am Leben ist.</p> <p>Einen solchen Speicher können wir auch als Cache bezeichnen und natürlich funktioniert ein Solcher nur solange wie auch eine Verbindung vorhanden ist. In einer Universal Methode wird man also anhand der übergebenen Argumente feststellen, ob es dafür bereits ein prepared Statement gibt, es verwenden können oder vor der ersten Verwendung erstellen müssen.</p> <p>MfG</p> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708383#m1708383 pl 2017-11-14T14:34:56Z 2017-11-14T15:51:15Z PHP Oop Datenbank Klasse <p>Mahlzeit;</p> <p>für die Implementierung einer Insert-Universal-Methode gibt es zumindest in Perl 2 Möglichkeiten</p> <ol> <li>über prepared Statements</li> <li>direktes insert</li> </ol> <p>Bei beiden wären Tabellenname und <code>col=>val</code> zu übergeben, bei (1) zusätzlich und optional eine sog. <code>finish</code> Anweisung. Stell Dir vor, Du feuerst eine Reihe von Inserts über eine Schleife, erst hier kommen ja prepared Statements erst richtig zum Tragen. Also wäre das Statement zu cachen, das kannst Du über <code>static</code> machen oder in der Instanz. Ob (2) in PHP überhaupt möglich ist, kann ich nicht beurteilen. Auf jeden Fall ist es unnötig, für ein einmaliges Insert ein extra Statement zu präpariern, weil es ja nur einmal gebraucht wird. Das setzt natürlich voraus, daß eine Methode zum Quoten vorhanden ist, in Perl gibt es 2 Methoden, <code>quote_identifier</code> und <code>quote</code> zur Vermeidung von Injektions.</p> <blockquote> <p>Zudem muss ich mir jetzt überlegen ob ich unterschiedliche Klassen für einen Wald mache, einmal zum erzeugen des Waldes und einmal zum bearbeiten des Waldes (Bäume wachsen, Blättern fallen im Herbst, Wanderer entscheiden sich einen neuen Weg zu gehen).</p> </blockquote> <p>Genau. Hier kommen Klassenerweiterungen ins Spiel. Ich hab das immer so gemacht, daß jede qualifizierte Subklasse eine Methode <code>create</code> hat womit für sämtliche Tabellen die Create-Statements verewigt sind. Damit sind sie auch dokumentiert. Bspw. definiert meine Klasse <code>MyDBI_Log</code> in der create-Methode das Create-Statement zum Erstellen der Tabelle <code>log</code>.</p> <p>Eine Methode truncate() hingegen kann wiederum in der Basisklasse definiert sein, da wird ja eh nur der Tabellenname übergeben. Weitere Kandidaten für Universalmethoden wären <code>describe</code>, <code>show tables</code> und <code>show create</code> und evntl. auch die Möglichkeit zur freien Übergabe von SQL Anweisungen. Mit der richtigen Klasse in der Hand kannst Du das ganze DB-Management auf der Kommandozeile abfackeln ohne mit der Maus in phpmyadmin rumzufummeln.</p> <p>Und falls Deine gesammelten Werke einer Versionskontrolle unterliegen könntest Du auch über eine Metohde alter() nachdenken. Dann landen auch die gesammelten Änderungen am DB Design im Repository. Nicht vergessen, dann auch die create()-Methode anzupassen.</p> <p>MfG</p> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708575#m1708575 dedlfix 2017-11-17T07:49:58Z 2017-11-17T07:49:58Z PHP Oop Datenbank Klasse <p>Tach!</p> <blockquote> <p>Mit der Wiederverwendung von Prepared Statements meine ich nicht das Cachen der Verbindung. Der Vorteil der sich aus der Wiederverwendung von Prepared Statements ergibt, ist ja auch in der Doku zu PDO beschrieben <a href="http://php.net/manual/de/pdo.prepared-statements.php" rel="noopener noreferrer">Siehe auch</a>.</p> </blockquote> <p>Soweit so klar und ein alter Hut.</p> <blockquote> <p>Wenn man jedoch eine Methode hat, die bei jeden Aufruf das Statement jedesmal neu prepared, dann wird o.g. Vorteil nicht genutzt. Also wird man ein bestimmtes Statement nur einmal preparieren und solange speichern wie die Instanz am Leben ist.</p> </blockquote> <p>Die Instanz ist nicht länger als eine Scriptlaufzeit am Leben. Selbst wenn die Verbindung in einem Pool gecached wird, das Prepared Statement wird es nicht. Man müsste also den Anwendungsfall haben, dass das Statement mehrfach im Script genutzt wird. Das ist der Fall, wenn mehrere Datensätze einfügen möchte. Sowas kommt gelegentlich vor und wird sich meistens an genau einer Stelle innerhalb einer Schleife abspielen. Aber recht unwahrscheinlich ist, dass diese Nutzungen desselben Statements unabhängig voneinander von mehreren Stellen des Scripts aus ausgeführt werden sollen.</p> <blockquote> <p>Einen solchen Speicher können wir auch als Cache bezeichnen und natürlich funktioniert ein Solcher nur solange wie auch eine Verbindung vorhanden ist.</p> </blockquote> <p>Ich halte eine generelle Ausführung ohne konkreten Anlass eines solchen Features für unnötigen Aufwand mit kaum bis keinem Nutzen.</p> <p>dedlfix.</p> https://forum.selfhtml.org/self/2017/nov/9/php-oop-datenbank-klasse/1708582#m1708582 pl 2017-11-17T09:39:03Z 2017-11-17T09:39:03Z PHP Oop Datenbank Klasse <p>Moin,</p> <blockquote> <p>Die Instanz ist nicht länger als eine Scriptlaufzeit am Leben.</p> </blockquote> <p>Genau.</p> <blockquote> <p>Selbst wenn die Verbindung in einem Pool gecached wird, das Prepared Statement wird es nicht.</p> </blockquote> <p>Von sich aus nicht.</p> <blockquote> <p>Man müsste also den Anwendungsfall haben, dass das Statement mehrfach im Script genutzt wird. Das ist der Fall, wenn mehrere Datensätze einfügen möchte.</p> </blockquote> <p>Richtig! Und das heißt bezogen auf den Entwurf einer eigenen Klasse, daß eine diesbezügliche Methode mehrfach aufgerufen wird..</p> <blockquote> <p>Sowas kommt gelegentlich vor und wird sich meistens an genau einer Stelle innerhalb einer Schleife abspielen.</p> </blockquote> <p>.. und beliebig oft aufgerufen werden kann solange die Instanz noch am Leben ist.</p> <blockquote> <p>Aber recht unwahrscheinlich ist, dass diese Nutzungen desselben Statements unabhängig voneinander von mehreren Stellen des Scripts aus ausgeführt werden sollen.</p> </blockquote> <p>Das interessiert doch den Anwender nicht. Er ruft einfach nur eine Methode auf und darf das auch an an mehreren Stellen in seiner Anwendung ohne sich darum kümmern zu müssen welche Statements dafür innerhalb dieser Methode präpariert werden. Genau deswegen entwickeln wir ja eine Klasse und dokumentieren die API.</p> <blockquote> <blockquote> <p>Einen solchen Speicher können wir auch als Cache bezeichnen und natürlich funktioniert ein Solcher nur solange wie auch eine Verbindung vorhanden ist.</p> </blockquote> <p>Ich halte eine generelle Ausführung ohne konkreten Anlass eines solchen Features für unnötigen Aufwand mit kaum bis keinem Nutzen.</p> </blockquote> <p>Die Performance steigt um mindestens den Faktor 2 (zwei). Ich hatte mal eine etwas umfangreichere Anwendung so zu optimieren, die war danach zehnmal so schnell. MfG</p>