Warum bekomme ich diesen Fehler? WordPress-databaseerrors:

Ich benutze WordPress 3.4.2, neueste Version! Ich habe keine Plugins installiert außer dem, dass ich schreibe.

Also hier ist der Deal, ich lese einen json-Feed und ich versuche, seinen Inhalt in eine Tabelle zu importieren, die ich in meiner WordPress-database erstellt habe. Ich habe einen ähnlichen Code in einem anderen Plugin verwendet, das ich geschrieben habe und es funktioniert gut dort. Ich verstehe nicht, warum es hier nicht funktioniert.

Wenn ich dieses andere Plugin benutze, das ich schreibe, bekomme ich die gefürchtete und ach so klare “WordPress databaseerrors: [Abfrage war leer]”.

Hier ist mein Code …

// Setup the array $values = array(); foreach ($bugs as $bug) { $status_text = $bug['text']; $tContent = htmlSpecialChars(html_entity_decode($status_text)); $imported = 2; [ shortened to keep this post short, but other values are listed here. ] // for the values insert part $values[] = '("'.$tContent. '", "'.$imported.'")'; } if(is_array($values)) { echo "
WHAT TO IMPORT?
"; var_dump(implode(',', $values)); }

Dies gibt alle Werte wie erwartet aus. Alles ist in Klammern und durch ein Komma getrennt.

Dann mache ich das …

 global $wpdb; $table_name = $wpdb->prefix . "bugtbl_temp"; $sql = $wpdb->prepare ( "INSERT INTO $table_name (`post_content`, `imported`) VALUES ". implode(',', $values) . " ON DUPLICATE KEY UPDATE imported = 1" ); $wpdb->query($sql); // execute query $wpdb->print_error(); // any errors? $wpdb->last_query; // show the qry $wpdb->flush(); // cleanup 

Und dann, wenn ich diese function ausführe, bekomme ich den “WordPress-databaseerrors: [Abfrage war leer]” und nichts wird in meine Tabelle importiert.

Ich sah hier einen anderen Kerl hatte Probleme mit $ wpdb-> vorzubereiten. Benutze ich es falsch?

Solutions Collecting From Web of "Warum bekomme ich diesen Fehler? WordPress-databaseerrors:"

Ich sah hier einen anderen Kerl hatte Probleme mit $wpdb->prepare . Benutze ich es falsch?

Wie Sie im Codex lesen können, ist es ein einfaches Nein .

Sie müssen es wie sprintf/printf() . Die einzigen zulässigen Eingaben sind

  • Zeichenfolge: %s
  • Ziffer: %d

Beispiel

 $sql = $wpdb->prepare( " INSERT INTO %s (`post_content`, `imported`) VALUES %s ON DUPLICATE KEY UPDATE imported = 1 " ,"{$wpdb->prefix}bugtbl_temp" ,implode( ',', $values ) ); 

Haftungsausschluss: Die ↑ angezeigte Abfrage bedeutet nicht unbedingt, dass Sie Ergebnisse erhalten, nur weil Sie dann das $wpdb->prepare() Recht verwendet haben.

Ich hatte den gleichen Fehler, als ich vergaß, das letzte numerische Argument in einer Aktualisierungsanweisung hinzuzufügen; Überprüfen Sie, ob Ihre Argumente mit den Ersatz-Token übereinstimmen.

Angenommen, Sie haben eine SQL-Zeichenfolge wie folgt:

 $sql = "update mytable set column1 = %s where id = %d;" $wpdb->query($wpdb->prepare($sql, 'foobar')); 

Die Lösung besteht offensichtlich darin, die ID hinzuzufügen

 $id = 5; $wpdb->query($wpdb->prepare($sql, 'foobar', $id)); 

Erfolg! Ich habe die wpdb-> fertig zu arbeiten, endlich und ich würde gerne mein Code-Snippet hier teilen – Hoffentlich wird jemand anderes dieses nützlich finden.

Meine Situation

Ich habe versucht, Daten von einem Feed in eine benutzerdefinierte Tabelle von einem Plugin, das ich schreibe, zu importieren. Mehrere Websites und sogar die Leute, die auf diesen Thread geantwortet haben, ermutigten mich, meine Importabfragen zu schützen. Aber auch nachdem ich den Codex gelesen hatte, war ich nicht in der Lage, das richtig oder überhaupt zu funktionieren.

Bemerkenswerte Fehler

Ein paar Dinge, die ich falsch gemacht habe, waren:

  1. Ziehen Sie alle Werte in ein Array. Ich musste das überhaupt nicht tun.
  2. Ich habe versucht, mehr als eine Zeile mit nur einem wpdb-> prepare zu importieren. Die Lösung war, einen wp-db-> pro Zeile vorzubereiten. Ich habe den Befehl wpdb-> prepare in meine foreach-statement verschoben. Die Sache ist manchmal, dass ich mehr als ein Ergebnis bekommen werde, das ich auf einmal importieren möchte, und das tut den Trick. Ich werde nie mehr als 20 Ergebnisse haben, also sollte das gut funktionieren.

Eine Lösung

Dies ist wahrscheinlich nicht der einzige Weg dies zu tun, aber so habe ich es geschafft, es zum Laufen zu bringen. Hier ist das letzte funktionierende Code-Snippet. Ich füge das in meine foreach-Erklärung ein. Ich hoffe es hilft.

 foreach ($rows as $row) { // I've omitted the part in my where i take all of the values from the query and define variables, but that part would happen here. // Prepare query $sql = $wpdb->prepare(" INSERT INTO $tablename (`ijAuthorID`, `ijDate`, `ijDescription`, `ijTitle`, `ijSlug`, `ijPostType`, `ijImported`, `ijUKID`) VALUES (%d, %s, %s, %s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE ijImported = 1", $tAuthor, $tPubDate, $tContent, $tTitle, $tPostName, $tPostType, $tImported, $tID ); // Execute query $wpdb->query($sql); } 

Danke an diese Leute, die meinen ursprünglichen Beitrag beantwortet haben.