{"id":446,"date":"2017-05-11T12:42:46","date_gmt":"2017-05-11T10:42:46","guid":{"rendered":"http:\/\/evileu.de\/zum-schwarzen-pinguin\/?p=446"},"modified":"2017-05-11T12:46:57","modified_gmt":"2017-05-11T10:46:57","slug":"datenbankeditor-die-vierte-aenderungen-speichern","status":"publish","type":"post","link":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/2017\/05\/11\/datenbankeditor-die-vierte-aenderungen-speichern\/","title":{"rendered":"Datenbankeditor die Vierte: \u00c4nderungen speichern"},"content":{"rendered":"<h2>Jetzt haben wir unsere Adressdaten editiert, und nu?<\/h2>\n<p>Speichern wollen wir sie nat\u00fcrlich noch, und daf\u00fcr darf wieder unser wpdb-Objekt herhalten. Welche Daten wir speichern wollen, lesen wir aus dem Unterformular, das sind unsere Werte aus <em>$_POST[&#8218;feldname&#8216;], <\/em>wobei &#8222;feldname&#8220; im Formular festgelegt ist. Ich hab hier einfach die selben Bezeichnungen wie die der Datenbankfelder genommen, das ist am leichtesten zu lesen. Nochmal kurz zur Erinnerung, das Formularfeld f\u00fcr den Vornamen haben wir so definiert:<\/p>\n<p><em>echo &#8218;Vorname: &lt;input type=&#8220;text&#8220; name=&#8220;vorname&#8220; value = &#8222;&#8218;.$einpost-&gt;vorname.'&#8220;\/&gt;&lt;\/br&gt;&#8216;;<\/em><\/p>\n<p>Den aktuellen Wert (den der Benutzer evtl. editiert hat) legen wir nach dem Klick auf den &#8222;\u00c4nderungen speichern&#8220;- Button der besseren \u00dcbersicht halber auf eine Variable:<\/p>\n<p><em>if (isset($_POST[&#8217;speichern&#8216;])){<\/em><\/p>\n<p><em>$neu_vorname = $_POST[&#8218;vorname&#8216;];<\/em><\/p>\n<p><em>}<\/em><\/p>\n<p>Wichtig ist hier die richtige Positionierung der If-Isset-Abfrage, die mu\u00df nach der schlie\u00dfenden Klammer der ersten If-Isset-Abfrage aus dem Hauptformular hin. Wir legen uns alle Feldinhalte des Unterformulars auf Variable, und die verarbeiten wir dann in einem Update auf die Datenbank weiter.<\/p>\n<h2>Ein bi\u00dfchen unhandlich: die wpdb-Update Methode<\/h2>\n<p>Ein kurzer Blick in den <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb#UPDATE_rows\">Codex<\/a>, und es k\u00f6nnte einem etwas das Gruseln kommen. Da wird mit Arrays hantiert und mit Formaten und was wei\u00df ich noch alles, und dabei wollen wir doch nur einen stinknormalen Update auf einen einzelnen Datensatz fahren. Na ja, ich versuchs mal aufzudr\u00f6seln. In <a href=\"https:\/\/code.tutsplus.com\/tutorials\/writing-custom-queries-in-wordpress--wp-25510\">diesem Artikel <\/a>(runterscrollen bis UPDATING DATA in Sicht kommt) ist es recht einleuchtend beschrieben, wie man mit der Update-Methode umgeht. Das sieht dann so aus:<\/p>\n<p><em>global $wpdb;<\/em><br \/>\n<em>\u00a0\u00a0 <\/em><br \/>\n<em>\u00a0\u00a0 \u00a0$wpdb-&gt;update(<\/em><br \/>\n<em>\u00a0\u00a0\u00a0 &#8220;.MAINTABLE.&#8220;,<\/em><br \/>\n<em>\u00a0\u00a0\u00a0 array(<\/em><br \/>\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &#8218;vorname&#8216; =&gt; $neu_vorname\u00a0 \/\/ string<\/em><br \/>\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0<\/em><br \/>\n<em>\u00a0\u00a0\u00a0 ),<\/em><br \/>\n<em>\u00a0\u00a0\u00a0 array( &#8218;id&#8216; =&gt; $ID ),<\/em><br \/>\n<em>\u00a0\u00a0\u00a0 array(<\/em><br \/>\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &#8218;%s&#8216;\u00a0\u00a0 \/\/ value1<\/em><br \/>\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0<\/em><br \/>\n<em>\u00a0\u00a0\u00a0 ),<\/em><br \/>\n<em>\u00a0\u00a0\u00a0 array( &#8218;%d&#8216; )<\/em><br \/>\n<em>);<\/em><\/p>\n<p>Ich gebe den Tabellennamen wieder mit der Konstanten MAINTABLE mit. Dann gehts los.<\/p>\n<ul>\n<li>Wir benutzen die Methode <em>$wpdb-&gt;update(<\/em>).<\/li>\n<li>Im ersten Array wird definiert, welches Feld (hier &#8218;<em>vorname<\/em>&#8218;) mit welchem Wert (hier <em>$neu_vorname<\/em>) aktualisiert werden soll.<\/li>\n<li>Das zweite Array legt die WHERE-Klausel fest, in unserem Fall wird das Feld id mit dem Wert der Variablen $ID verglichen, die habe ich vorher in der Isset-Auswertung mit dem Wert der id aus dem Formular belegt..<\/li>\n<li>Das dritte Array legt fest, welches Format das zu updatende Feld hat. Da wir es nur mit Textfeldern zu tun haben, ist das immer ein %s (f\u00fcr <strong>S<\/strong>tring).<\/li>\n<li>Im vierten Array wird definiert, welches Format das Feld in der WHERE-Klausel hat. Ich habe hier ein %d (f\u00fcr <strong>D<\/strong>ezimal) angegeben, da wir es mit einem ganzzahligen Wert zu tun haben.<\/li>\n<\/ul>\n<p>Wie ich schon sagte, ein bi\u00dfchen unhandlich und gew\u00f6hnungsbed\u00fcrftig, aber letztendlich funktionierts, und das ist die Hauptsache. Einige der genannten Parameter sind optional, aber ich habe noch nicht genau herausget\u00fcftelt welche, wir verwenden das jetzt mal so wie es ist.<\/p>\n<h2>Wichtig: wir updaten immer alle Felder<\/h2>\n<p>Man k\u00f6nnte auf die Idee kommen und erstmal abfragen, in welchen Feldern \u00c4nderungen vorgenommen wurden, aber die Update-Methode macht das von selber, also kann man sich den Aufwand schenken. Also packen wir uns bei Klick auf den <del><\/del>&#8222;\u00c4nderungen speichern&#8220; &#8211; Button einfach immer alle Felder aus dem Formular und schreiben sie mit dem Update in die Datenbank.<\/p>\n<h2>Boing, reingefallen: disabled ist komplett disabled, \u00e4tsch!<\/h2>\n<p>Und wenn der Update jetzt nicht klappt, liegt es daran, da\u00df ich im Formular das Feld f\u00fcr die ID auf &#8222;disabled&#8220; gestellt habe, damit man die ID nicht versehentlich \u00e4ndern kann. Damit kann ich aber den Wert des Formularfeldes nicht mehr abfragen! Beliebter Fehler, mir wars blo\u00df entfallen. Das m\u00fcssen wir noch \u00e4ndern. Ich stelle das Feld auf &#8222;hidden&#8220; und gebe die ID nur zur Kontrolle mit aus. Die Zeile im Formular sieht jetzt so aus:<\/p>\n<p><em>echo &#8218;ID: &amp;nbsp&#8216;.$einpost-&gt;id.'&lt;input type=&#8220;text&#8220; name=&#8220;id&#8220; value = &#8222;&#8218;.$einpost-&gt;id.'&#8220; <strong>hidden<\/strong>\/&gt;&lt;\/br&gt;&#8216;;<\/em><\/p>\n<p>Es w\u00e4re ohnehin nichts passiert, weil wir in unserem Update das Feld id gar nicht mit drin haben, aber so ist es logischer und f\u00fcr den Benutzer besser verst\u00e4ndlich.<\/p>\n<h2>Der Update f\u00fcr den kompletten Datensatz<\/h2>\n<p>&#8230; wird genau nach obigem Muster zusammengebaut. Ich lege mir die Formularinhalte auf Variable, und setze diese in das Array im Update ein. Dabei auf die richtigen Kommas hinter den Argumenten achten!<\/p>\n<p>Ich mach mal nur noch zwei weitere Felder beispielhaft, den Nachnamen und die E-Mail-Adresse, denn Rest k\u00f6nnen sie nach Belieben selber noch einbauen. Wir geben dann noch eine Meldung aus, da\u00df die \u00c4nderungen gespeichert sind, und das wars. Wenn unser Benutzer jetzt auf &#8222;\u00c4nderungen speichern&#8220;\u00a0 klickt, passiert Folgendes:<\/p>\n<p><em>if (isset($_POST[&#8217;speichern&#8216;])){<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0<\/em><em>\u00a0\u00a0\u00a0 <\/em><br \/>\n<em>\u00a0\u00a0 \u00a0$ID = $_POST[&#8218;id&#8216;];<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0$neu_vorname = $_POST[&#8218;vorname&#8216;];<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0$neu_nachname = $_POST[&#8217;nachname&#8216;];<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0$neu_your_email = $_POST[&#8218;your_email&#8216;];<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0global $wpdb;<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0$wpdb-&gt;update(<\/em><br \/>\n<em>\u00a0\u00a0\u00a0 &#8220;.MAINTABLE.&#8220;,<\/em><br \/>\n<em>\u00a0\u00a0\u00a0 array(<\/em><br \/>\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &#8218;vorname&#8216; =&gt; $neu_vorname,\u00a0 \/\/ string<\/em><br \/>\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &#8217;nachname&#8216; =&gt; $neu_nachname, \/\/string<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&#8218;your_email&#8216; =&gt; $neu_your_email \/\/string<\/em><br \/>\n<em>\u00a0\u00a0\u00a0 ),<\/em><br \/>\n<em>\u00a0\u00a0\u00a0 array( &#8218;id&#8216; =&gt; $ID ),<\/em><br \/>\n<em>\u00a0\u00a0\u00a0 array(<\/em><br \/>\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &#8218;%s&#8216;, \u00a0\u00a0\u00a0 \u00a0\/\/ value1<\/em><br \/>\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &#8218;%s&#8216;,\u00a0\u00a0 \u00a0\/\/ value2<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&#8218;%s&#8216;\u00a0\u00a0 \u00a0\/\/ value3<\/em><br \/>\n<em>\u00a0\u00a0\u00a0 ),<\/em><br \/>\n<em>\u00a0\u00a0\u00a0 array( &#8218;%d&#8216; )<\/em><br \/>\n<em>);<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0echo &#8222;&lt;h1&gt;\u00c4nderungen gespeichert&lt;\/h1&gt;&#8220;;<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0<\/em><br \/>\n<em>} \/\/ende von if isset post speichern<\/em><\/p>\n<p>Das wars! Wenn man jetzt die \u00c4nderungen sehen will, ruft man einfach nochmal die selbe ID auf, und da sind sie auch schon &#8211; wenn alles geklappt hat. Ich geb nachher das ganze Plugin noch als ZIP-Datei mit, dann k\u00f6nnen sie&#8217;s genau nachvollziehen.<\/p>\n<h2>F\u00fcr Perfektionisten: Abfragen, ob der Update geklappt hat<\/h2>\n<p>Die Update-Methode des wpdb-Objekts hat auch R\u00fcckgabewerte, ich zitiere mal kurz den Codex:<\/p>\n<blockquote><p><span id=\"UPDATE_rows\" class=\"mw-headline\">UPDATE rows<\/span><\/p>\n<p>Update a row in the table. Returns <tt>false<\/tt> if errors, or the number of rows affected if successful.<\/p><\/blockquote>\n<p>Man kann sich jetzt den Update auch auf eine Variable legen, das sieht dann zum Besipiel so aus:<\/p>\n<p><em>$speichern=$wpdb-&gt;update(&#8230;Parameterarrays&#8230;)<\/em><\/p>\n<p>Dann kann man die Variable $speichern entsprechend nach dem R\u00fcckgabewert auswerten und ausgeben. Falls sie &#8222;false&#8220; zur\u00fcckgeben sollte, hat man \u00fcbrigens ein echtes Problem, dann haut die Verbindung zur Datenbank aus irgendeinem Grund nicht hin&#8230; ist mir aber noch nie passiert. Ich machs ganz einfach und gebe nur aus, wieviele Zeilen von dem Update betroffen waren:<\/p>\n<p><em>echo $speichern.&#8220;&amp;nbsp Datens\u00e4tze ge\u00e4ndert&#8220;;<\/em><\/p>\n<p>Hier kommt \u00fcbrigens 0 (Null) zur\u00fcck, wenn der Benutzer zwar keine \u00c4nderungen gemacht, aber trotzdem auf &#8222;\u00c4nderungen speichern&#8220; geklickt hat. Das liegt daran, da\u00df der Update nichts tut, wenn die zu speichernden Werte mit den bereits vorhandenen Werten in der Tabelle identisch sind. Aber das sind jetzt echt Feinheiten, da k\u00f6nnen sich Perfektionisten selber durchrecherchieren, ich mach hier mal nen Punkt, und einen neuen Beitrag.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Jetzt haben wir unsere Adressdaten editiert, und nu? Speichern wollen wir sie nat\u00fcrlich noch, und daf\u00fcr darf wieder unser wpdb-Objekt herhalten. Welche Daten wir speichern wollen, lesen wir aus dem Unterformular, das sind unsere Werte aus $_POST[&#8218;feldname&#8216;], wobei &#8222;feldname&#8220; im Formular festgelegt ist. Ich hab hier einfach die selben Bezeichnungen wie die der Datenbankfelder genommen, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[20,21,11,4,8,2],"tags":[],"_links":{"self":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/446"}],"collection":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/comments?post=446"}],"version-history":[{"count":6,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/446\/revisions"}],"predecessor-version":[{"id":452,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/446\/revisions\/452"}],"wp:attachment":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/media?parent=446"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/categories?post=446"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/tags?post=446"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}