eigenes Plugin schreibt nicht in die Datenbank
-
Folgender Code-Schnipsel ist innerhalb der Abfrage, ob ein Formular abgesendet wurde.
Das Absenden funktioniert soweit, da als Ergebnis das Array des Formulars angezeigt wird. Leider kommt aber in der Datenbank nichts an.Sieht jemand von euch, ob hier irgendein Fehler vorliegt?
Vielen Dank!
return $_POST;
$wpdb->insert(
$wpdb->prefix.“kontaktliste“,
array(
/* ‚ID‘ => “, */
‚plz‘ => $eintrag[‚plz‘],
’stadt‘ => $eintrag[’stadt‘],
‚land‘ => $eintrag[‚land‘],
‚vorname‘ => $eintrag[‚vorname‘],
’nachname‘ => $eintrag[’nachname‘],
‚email‘ => $eintrag[‚email‘],
’show_email‘ => $eintrag[’show_email‘],
‚info‘ => $eintrag[‚info‘]
),
array(
/* ‚%s‘, //ID, autoincrement -> sollte leer sein */
‚%s‘, //plz*
‚%s‘, //stadt*
‚%s‘, //land*
‚%s‘, //vorname*
‚%s‘, //nachname
‚%s‘, //email(*)
‚%s‘, //show_email -> 0/1 speichert, ob eMail-Adresse angezeigt werden soll
‚%s‘ //info
)
);
-
Das Lesen aus der Datenbank funktioniert grundsätzlich. In einer anderen Funktion lese ich sie aus und alles wird angezeigt.
return $_POST;
Damit springst du aus der Funktion und alles was danach in der Funktion kommt, wird nicht mehr ausgeführt.
Vielen Dank!
Ich habe das „return“ jetzt hinter das Array geschoben. Damit ändert sich der Output von$id = $wpdb->insert_id;
if($id !== false) {
echo $id; //in der Variable befindet sich nun die Primärschlüssel ID des Eintrags */
} else {
echo „Beim Eintragen ist ein Fehler aufgetreten“;
}return $_POST
immerhin von „Array“ zu „0Array“
Erfolgreich ist es damit allerdings immer noch nicht und es kommt nicht in der Datenbank an.
Lass dir mal nach dem Insert einen eventuellen Fehler anzeigen:
$wpdb->print_error();
Außerdem würde ich mir mal $eintrag anzeigen lassen, um zu sehen, ob da auch wirklich das drinsteht, was man erwartet.
Es wäre vielleicht auch nicht schlecht, wenn du die ganze Funktion mal zeigen würdest. Aber bitte dabei die Code-Tags hier im Forum benutzen.
- Diese Antwort wurde geändert vor 5 Jahren, 11 Monaten von bscu.
$wpdb->print_error();
gibt zurück, dass der übermittelte Datensatz leer ist; was ja auch mit dem Ergebnis übereinstimmt, dass zumindest einer angelegt wird, aber nichts drin ist.
Die inzwischen angepasste gesamte Funktion ist:function kontaktliste_eintrag(){ global $wpdb; $wpdb->show_errors(); if ($_POST) { echo '<pre>'; echo htmlspecialchars(print_r($_POST, true)); echo '</pre>'; $wpdb->insert( $wpdb->prefix.'kontaktliste', array( 'ID' => '', 'plz' => print_r($_POST['plz'], true), 'stadt' => print_r($_POST['stadt'], true), 'land' => print_r($_POST['land'], true), 'vorname' => print_r($_POST['vorname'], true), 'nachname' => print_r($_POST['nachname'], true), 'email' => print_r($_POST['email'], true), 'show_email' => intval(print_r($_POST['show_email'], true)), 'info' => print_r($_POST['info'], true) ), array( '%d', //ID, autoincrement -> sollte leer sein '%s', //plz* '%s', //stadt* '%s', //land* '%s', //vorname* '%s', //nachname '%s', //email(*) '%d', //show_email -> 0/1 speichert, ob eMail-Adresse angezeigt werden soll '%s' //info ) ); $id = $wpdb->insert_id; if($id !== false) { echo $id; //in der Variable befindet sich nun die Primärschlüssel ID des Eintrags */ } else { echo "Beim Eintragen ist ein Fehler aufgetreten"; } /* var_dump($id); */ $wpdb->print_error(); return $_POST; } $form = '<div id="formtitle">Trage hier die Daten des neuen Kontaktes ein. In der Tabellenansicht werden nur Postleitzahl, Stadt, Land und Vorname angezeigt. Es sei denn, die eMail-Adresse wird auf ANZEIGEN gestellt.</div><div id="formbody"><form action="" method="post" id="eintragkontaktliste">' . "\n" . '<div class="formzeile">' . "\n" . '<p><input type="text" id="plz" placeholder="Postleitzahl" name="eintrag[plz]" /></p>' . "\n" . '<p><input type="text" id="stadt" placeholder="Stadt/Raum/Kreis" name="eintrag[stadt]" /></p>' . "\n" . '<p><select radio id="land" name="eintrag[land]">' . "\n" . '<option value="D">Deutschland</option>' . "\n" . '<option value="CH">Schweiz</option>' . "\n" . '<option value="A">Üsterreich</option>' . "\n" . '</select></p>' . "\n" . '</div>' . "\n" . '<div class="formzeile">' . "\n" . '<p><input type="text" id="vorname" placeholder="Vorname" name="eintrag[vorname]" /></p>' . "\n" . '<p><input type="text" id="nachname" placeholder="Nachname (wird nicht angezeigt)" name="eintrag[nachname]" /></p>' . "\n" . '</div>' . "\n" . '<div class="formzeile">' . "\n" . '<p><input type="email" id="email" placeholder="eMail-Adresse" name="eintrag[email]" /></p>' . "\n" . '</div>' . "\n" . '<div class="formzeile">' . "\n" . '<p>Soll Direktkontakt möglich sein?</p>' . "\n" . '<p><select type="radio" id="direkt" name="eintrag[show_email]">' . "\n" . '<option value="1">ja (eMail anzeigen)</option>' . "\n" . '<option value="0">nein (eMail verbergen)</option>' . "\n" . '</select></p>' . "\n" . '</div>' . "\n" . '<div class="formzeile">' . "\n" . '<p><textarea id="info" placeholder="Weiterführende Infos (werden nicht angezeigt)" name="eintrag[info]" cols="20" rows="4"></textarea></p>' . "\n" . '</div>' . "\n" . '<div class="formzeile-submit">' . "\n" . '<p><input type="submit" id="submit" name="submit" value="Eintragen" /></p>' . "\n" . '</div>' . "\n" . '</form></div>' . "\n"; echo $form; }
Der ausgegebene Fehler ist:
WordPress-Datenbank-Fehler: []INSERT INTO
smb_kontaktliste
(ID
,plz
,stadt
,land
,vorname
,nachname
,email
,show_email
,info
) VALUES (0, “, “, “, “, “, “, 0, “)- Diese Antwort wurde geändert vor 5 Jahren, 11 Monaten von marcushorndt.
ES SCHREIBT!
Der Fehler war, dass $_POST ein multidimensionales Array ist und ich es nicht korrekt angesprochen habe.
So funktioniert es…meine Frage ist aber, ob man das vom Code her optimieren könnte?$wpdb->insert( $wpdb->prefix.'kontaktliste', array( 'ID' => '', 'plz' => print_r($_POST['eintrag']['plz'], true), 'stadt' => print_r($_POST['eintrag']['stadt'], true), 'land' => print_r($_POST['eintrag']['land'], true), 'vorname' => print_r($_POST['eintrag']['vorname'], true), 'nachname' => print_r($_POST['eintrag']['nachname'], true), 'email' => print_r($_POST['eintrag']['email'], true), 'show_email' => intval(print_r($_POST['eintrag']['show_email'], true)), 'info' => print_r($_POST['eintrag']['info'], true) ), array( '%d', //ID, autoincrement -> sollte leer sein '%s', //plz* '%s', //stadt* '%s', //land* '%s', //vorname* '%s', //nachname '%s', //email(*) '%d', //show_email -> 0/1 speichert, ob eMail-Adresse angezeigt werden soll '%s' //info )
meine Frage ist aber, ob man das vom Code her optimieren könnte?
Ich wüsste nicht wie.
Nur die Zeile
return $_POST;
könntest du dir sparen, da $_POST eine Superglobale variable ist und überall zur Verfügung steht.
- Diese Antwort wurde geändert vor 5 Jahren, 11 Monaten von bscu.
Inzwischen habe ich das auch rausgenommen und nur
return;
notiert (weil ich denke, das muss ich machen?)Es gibt noch ein klitzekleines Problem mit dem Dokument und dem PHP: Wenn ich den WordPress-Beitrag mit dem Shortcode (der die Funktion aufruft) bearbeiten will („Beitrag bearbeiten“ im WordPress), schreibt mir die Funktion einen leeren Datensatz in die Tabelle.
Wie kann das sein und kennt jemand Abhilfe?Ich danke euch!
(weil ich denke, das muss ich machen?
Nein, muss man nicht.
Ohne den Quellcode zu kennen, wird es schwer dir zu helfen. Das hört sich für mich so an, dass du auch beim Bearbeiten ein Insert statt eines Updates macht.
Das war ein Missverständnis. Wenn ich in WordPress auf „Beitrag bearbeiten“ gehe, dann legt es einen leeren Datensatz an.
Ich poste jetzt nochmal die gesamte Funktion:
add_shortcode( 'kontakt_aufnehmen' , 'kontaktliste_eintrag' ); function kontaktliste_eintrag(){ global $wpdb; /* $wpdb->show_errors(); */ if ($_POST) { echo '<div><a href="https://stiefmutterblog.com/2019/01/08/kontaktliste-eintrag">» Neuen Datensatz hinzufügen...</a></div>'; echo '<div class="notice">Ich habe folgendes in die Datenbank eingetragen:</div>'; echo '<pre>'; echo htmlspecialchars(print_r($_POST, true)); echo '</pre>'; $wpdb->insert( $wpdb->prefix.'kontaktliste', array( 'ID' => '', 'plz' => print_r($_POST['plz'], true), 'stadt' => print_r($_POST['stadt'], true), 'land' => print_r($_POST['land'], true), 'vorname' => print_r($_POST['vorname'], true), 'nachname' => print_r($_POST['nachname'], true), 'email' => print_r($_POST['email'], true), 'show_email' => intval(print_r($_POST['show_email'], true)), 'info' => print_r($_POST['info'], true) ), array( '%d', //ID, autoincrement -> sollte leer sein '%s', //plz* '%s', //stadt* '%s', //land* '%s', //vorname* '%s', //nachname '%s', //email(*) '%d', //show_email -> 0/1 speichert, ob eMail-Adresse angezeigt werden soll '%s' //info ) ); /* $id = $wpdb->insert_id; if($id !== false) { echo $id; //in der Variable befindet sich nun die Primärschlüssel ID des Eintrags } else { echo "Beim Eintragen ist ein Fehler aufgetreten"; } */ /* var_dump($id); */ /* $wpdb->print_error(); */ /* var_dump($_POST['eintrag']['plz']); */ return /* $_POST */; } $form = '<div id="formtitle">Trage hier die Daten des neuen Kontaktes ein. In der Tabellenansicht werden nur Postleitzahl, Stadt, Land und Vorname angezeigt. Es sei denn, die eMail-Adresse wird auf ANZEIGEN gestellt.</div><div id="formbody"><form action="" method="post" id="eintragkontaktliste">' . "\n" . '<div class="formzeile">' . "\n" . '<p><input type="text" id="plz" placeholder="Postleitzahl" name="plz" autofocus /></p>' . "\n" . '<p><input type="text" id="stadt" placeholder="Stadt/Raum/Kreis" name="stadt" /></p>' . "\n" . '<p><select radio id="land" name="land">' . "\n" . '<option value="D" selected>Deutschland</option>' . "\n" . '<option value="CH">Schweiz</option>' . "\n" . '<option value="A">Österreich</option>' . "\n" . '</select></p>' . "\n" . '</div>' . "\n" . '<div class="formzeile">' . "\n" . '<p><input type="text" id="vorname" placeholder="Vorname" name="vorname" /></p>' . "\n" . '<p><input type="text" id="nachname" placeholder="Nachname (wird nicht angezeigt)" name="nachname" /></p>' . "\n" . '</div>' . "\n" . '<div class="formzeile">' . "\n" . '<p><input type="email" id="email" placeholder="eMail-Adresse" name="email" /></p>' . "\n" . '</div>' . "\n" . '<div class="formzeile">' . "\n" . '<p>Soll Direktkontakt möglich sein?</p>' . "\n" . '<p><select type="radio" id="direkt" name="show_email">' . "\n" . '<option value="1">ja (eMail anzeigen)</option>' . "\n" . '<option value="0" selected>nein (eMail verbergen)</option>' . "\n" . '</select></p>' . "\n" . '</div>' . "\n" . '<div class="formzeile">' . "\n" . '<p><textarea id="info" placeholder="Weiterführende Infos (werden nicht angezeigt)" name="info" cols="20" rows="4"></textarea></p>' . "\n" . '</div>' . "\n" . '<div class="formzeile-submit">' . "\n" . '<p><input type="submit" id="submit" name="submit" value="Eintragen" /></p>' . "\n" . '</div>' . "\n" . '</form></div>' . "\n"; echo $form; }
„Datensatz bearbeiten“ und ein Insert passen nicht zusammen, du brauchst ein Update.
Neu -> Insert
Ändern -> Update
Und soetwas
'plz' => print_r($_POST['plz'], true),
kannst du auch so schreiben
'plz' => $_POST['plz'],
Und wenn ein Script nicht richtig funktioniert, ist es nicht besonders sinnvoll, alle Fehlerausgaben zu unterdrücken.
Aber bis jetzt bearbeite ich wirklich nicht. Ich lege nur an. Die WordPress-Seite, die ich im backend bearbeite und in die ich das Formular per Shortcorde bringe, um die geht es. Wenn ich im frontend bin und Daten eingebe, funktioniert es jetzt einwandfrei (daher die auskommentierten Fehlerausgaben), aber wenn ich ins backend (Beitrag bearbeiten) gehen will, dann legt das Script einen leeren Datensatz an.
Könnte es damit zusammenhängen, dass „Beitrag bearbeiten“ auch eine $_POST-Variable zurück gibt? Kann man dem Script noch genauer sagen, auf welche Variable es reagieren soll, bzw die Variable „spezieller“ machen?
EDIT: Nicht bei „Beitrag bearbeiten“, sondern wenn ich aus dem Bearbeitungs-Modus zurück ins frontend wechsle wird ein leerer Datensatz angelegt.
- Diese Antwort wurde geändert vor 5 Jahren, 11 Monaten von marcushorndt.
Wenn du im Backend auf „Beitrag bearbeiten“ gehst, dann brauchst du ein anderes Script. Zum einen muss das Formular ja erst mal mit den Werten belegt werden und dann, nach dem absenden, muss ein Update der Datenbank erfolgen.
Nochmal für mich zur Klärung:
– das Skript funktioniert, solange ich den WordPress-Beitrag nicht bearbeite und von dort ins frontend wechsele (-> leerer Datensatz wird angelegt)
– es gibt eine Möglichkeit, ein Formular zu verarbeiten, bei der das nicht passiertWenn ja, kannst du mir einen Hinweis geben, auf welche Art ich das umsetzen kann?
Dank dir!
- Das Thema „eigenes Plugin schreibt nicht in die Datenbank“ ist für neue Antworten geschlossen.