PHP - Spaltennamen als Parameter an PHP Funktion für SQL Befehl übergeben – SELFHTML-Forum Forum als Ergänzung zum SELFHTML-Wiki und zur Dokumentation SELFHTML https://forum.selfhtml.org/self PHP - Spaltennamen als Parameter an PHP Funktion für SQL Befehl übergeben Sun, 16 Dec 18 17:09:59 Z https://forum.selfhtml.org/self/2018/dec/16/php-spaltennamen-als-parameter-an-php-funktion-fuer-sql-befehl-uebergeben/1738697#m1738697 https://forum.selfhtml.org/self/2018/dec/16/php-spaltennamen-als-parameter-an-php-funktion-fuer-sql-befehl-uebergeben/1738697#m1738697 <p>Hallo,</p> <p>in einem PHP Script möchte ich u.a. Spaltennamen als Parameter an eine Funktion übergeben, die diese dann in einen SQL Befehl übernimmt.</p> <pre><code class="block language-php"><span class="token variable">$new_SqlFunctions</span><span class="token operator">-></span><span class="token function">sqlCommandInsertInto</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"tbl_name"</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"Spalte1,Spalte2,Spalte3"</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"'Wert1','Wert2','Wert3'"</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">sqlCommandInsertInto</span> <span class="token punctuation">(</span><span class="token variable">$sqlTableName</span><span class="token punctuation">,</span> <span class="token variable">$sqlColumns</span><span class="token punctuation">,</span> <span class="token variable">$sqlValues</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token variable">$sqlQueryInsertInto</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"INSERT INTO <span class="token interpolation"><span class="token variable">$sqlTableName</span></span> (<span class="token interpolation"><span class="token variable">$sqlColumns</span></span>) VALUES (<span class="token interpolation"><span class="token variable">$sqlValues</span></span>)"</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">mysqli</span><span class="token operator">-></span><span class="token function">query</span><span class="token punctuation">(</span><span class="token variable">$sqlQueryInsertInto</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Es gibt aber immer eine Fehlermeldung:</p> <blockquote> <p>You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '0) VALUES...</p> </blockquote> <p>Ich vermute, dass es daran liegt, dass die Spaltennamen als ein String übergeben werden und der Code dann so "aussieht"...</p> <p>INSERT INTO tbl_name ("Spalte1,Spalte2,Spalte3") oder INSERT INTO tbl_name ("Spalte1","Spalte2","Spalte3")</p> <p>...die Spaltennamen aber ohne Anführungszeichen dort stehen müssen <code>INSERT INTO tbl_name (Spalte1,Spalte2,Spalte3)</code></p> <p>Ich habe die " ersetzt, aber das hat nichts gebracht.</p> <p><strong>Wie kann ich die Spaltenamen richtig übergeben?</strong></p> <p>Gruß ebody</p> PHP - Spaltennamen als Parameter an PHP Funktion für SQL Befehl übergeben Sun, 16 Dec 18 18:02:46 Z https://forum.selfhtml.org/self/2018/dec/16/php-spaltennamen-als-parameter-an-php-funktion-fuer-sql-befehl-uebergeben/1738709#m1738709 https://forum.selfhtml.org/self/2018/dec/16/php-spaltennamen-als-parameter-an-php-funktion-fuer-sql-befehl-uebergeben/1738709#m1738709 <p>Tach!</p> <blockquote> <p>Ich vermute, dass es daran liegt, dass die Spaltennamen als ein String übergeben werden und der Code dann so "aussieht"...</p> </blockquote> <p>Du musst nicht (nur) vermuten, du kannst prüfen. Lass dir einfach das Ergebnis ausgeben, also den Inhalt der Variable <code>$sqlQueryInsertInto</code></p> <blockquote> <p><strong>Wie kann ich die Spaltenamen richtig übergeben?</strong></p> </blockquote> <p>Besser wäre, nicht Teile des Statements anderenorts vorzubereiten, sondern die Namen und Werte einzeln (oder als Array) zu übergeben und das Zusammenbauen innerhalb der Funktion vorzunehmen. Separation of Concerns nennt man das. Der Rest des Programms muss nicht wissen, dass es da ein SQL-Statement gibt und wie dessen Syntax ist.</p> <p>dedlfix.</p> PHP - Spaltennamen als Parameter an PHP Funktion für SQL Befehl übergeben Mon, 17 Dec 18 06:31:43 Z https://forum.selfhtml.org/self/2018/dec/16/php-spaltennamen-als-parameter-an-php-funktion-fuer-sql-befehl-uebergeben/1738738#m1738738 https://forum.selfhtml.org/self/2018/dec/16/php-spaltennamen-als-parameter-an-php-funktion-fuer-sql-befehl-uebergeben/1738738#m1738738 <p>Moin,</p> <p>Darf ich dezent darauf hinweisen, dass hier eventuell ein Scheunentor für SQL-injections gebaut wurde? Besser, wenn man die mysqli-Erweiterung nutzt, ist es, pepeared-Statements zu verwenden. Zumindest sollte die Funktion, so es denn eine Methode ist, entsprechend gekapselt werden. So wie sie da steht ist es m.E.n. eine Sicherheitslücke.</p> <p>Gruß Bobby</p> <div class="signature">-- <br> -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <- ### Henry L. Mencken ### -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <- ### Viktor Frankl ### ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:) </div> PHP - Spaltennamen als Parameter an PHP Funktion für SQL Befehl übergeben Mon, 17 Dec 18 08:23:52 Z https://forum.selfhtml.org/self/2018/dec/16/php-spaltennamen-als-parameter-an-php-funktion-fuer-sql-befehl-uebergeben/1738744#m1738744 https://forum.selfhtml.org/self/2018/dec/16/php-spaltennamen-als-parameter-an-php-funktion-fuer-sql-befehl-uebergeben/1738744#m1738744 <p>Hallo bobby,</p> <p>grundsätzlich ein berechtigter Hinweis.</p> <p>Wie ist das bei prepared Statements mit den Spaltentypen? Kann ich grundsätzlich alles als String übergeben und MySQL parsed daraus Zahlen, Datümer und sonstiges? Oder muss ich zwingend typgerecht binden? Dann wäre ein Auto-Prepare nämlich mühsam, und du fängst an, ein ORM zu bauen.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> PHP - Spaltennamen als Parameter an PHP Funktion für SQL Befehl übergeben Mon, 17 Dec 18 10:21:25 Z https://forum.selfhtml.org/self/2018/dec/16/php-spaltennamen-als-parameter-an-php-funktion-fuer-sql-befehl-uebergeben/1738756#m1738756 https://forum.selfhtml.org/self/2018/dec/16/php-spaltennamen-als-parameter-an-php-funktion-fuer-sql-befehl-uebergeben/1738756#m1738756 <p>Moin,</p> <p>Bei mysqli kannst du in der prepare-Methode den Typ angeben:</p> <pre><code class="block language-php"><span class="token variable">$stmt</span><span class="token operator">-></span><span class="token function">bind_param</span><span class="token punctuation">(</span>‚iss‘<span class="token punctuation">,</span> <span class="token variable">$pId</span><span class="token punctuation">,</span> <span class="token variable">$pVorname</span><span class="token punctuation">,</span> <span class="token variable">$pNachname</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Bei PDO ähnlich wo bei erstmal alles als PDO::PARAM_STR behandelt werden.</p> <pre><code class="block language-php"><span class="token variable">$sth</span><span class="token operator">-></span><span class="token function">bindParam</span><span class="token punctuation">(</span><span class="token string single-quoted-string">':calories'</span><span class="token punctuation">,</span> <span class="token variable">$calories</span><span class="token punctuation">,</span> <span class="token class-name static-context">PDO</span><span class="token operator">::</span><span class="token constant">PARAM_INT</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Allerdings wir bei PDO der Typ automatisch erkannt, wenn man die Variablen direkt beim execute bindet wenn ich das richtig verstanden habe:</p> <pre><code class="block language-php"><span class="token variable">$params</span> <span class="token operator">=</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">21</span><span class="token punctuation">,</span> <span class="token number">63</span><span class="token punctuation">,</span> <span class="token number">171</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$sth</span><span class="token operator">-></span><span class="token function">execute</span><span class="token punctuation">(</span><span class="token variable">$params</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Gruß Bobby</p> <div class="signature">-- <br> -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <- ### Henry L. Mencken ### -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <- ### Viktor Frankl ### ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:) </div>