Fehlerbehandlung mit $wpdb

  • Hallo,

    weiß vielleicht jemand, wie ich unter Benutzung der $wpdb-Class einen möglichen SQL-Fehler abfangen kann?

    Nehmen wir an, ich benutze folgende Funktion:

    PHP
    function block_ip($ip) {
         global $wpdb;
         $query = "INSERT IGNORE INTO wp_blocked_ips (ip) VALUES ('$ip')";
         return $wpdb->get_results($query);
    }

    Die rufe ich dann so auf:

    PHP
    $blocked = block_ip('123.456.789.012');
    
    
    if ($blocked) {
        echo "Everything went fine.";
    } else {
        echo "An error has occured!";
    }

    Das Problem ist nur, dass $blocked immer TRUE ist, auch wenn ich die Abfrage oben so ändere, dass ein Fehler herauskommen muss.

    Ich habe auch bereits andere Implementationen gesehen, wie z.B.

    PHP
    if (count($items) > 0) { ... }

    oder

    PHP
    if (!(empty($results))) { ... }

    wobei $items bzw. $results das query-Ergebnis darstellen.

    Irgendwie wird da aber nur überprüft, ob überhaupt ein Ergebnis vorliegt, nicht, ob ein Fehler aufgetreten ist.

    Hier möchte ich jedoch einen Unterschied machen, weil ich den User darauf hinweisen will, ob nur kein Ergebnis vorlag oder aber ein Fehler (so dass er nachschauen kann, ob die Tabelle überhaupt existiert etc.).

    Weiß jemand, wie das mit der $wpbd-Class funktioniert?

    Die Function Reference sagt dazu:

    Zitat

    If there are any query results, the function will return an integer corresponding to the number of rows affected and the query results will cached for use by other wpdb functions. If there are no results, the function will return (int) 0. If there is a MySQL error, the function will return FALSE. (Note: since both 0 and FALSE can be returned, make sure you use the correct comparison operator: equality == vs. identicality ===).

    Was mache ich bei der Abfrage falsch?

    Vielen Dank im Voraus!

    • Anzeige

    Hallo!

    Wenn du gerade an deiner Website arbeitest oder dein aktuelles Hosting überdenkst: Wir betreiben mit NetzLiving eine Hosting-Plattform, die speziell auf Performance, Sicherheit und einfache Verwaltung ausgelegt ist.

    • ✔️ Schnelle Ladezeiten (optimiert für WordPress & Co.)
    • ✔️ Deutsche Server & DSGVO-konform
    • ✔️ Persönlicher Support (kein 0815-Ticket-System)

    Mehr erfahren

  • Was Du zitierst gilt für die Funktion query(), welche Du aber ja gar nicht aufrufst. get_results() liefert dagegen einfach die Ergebnisse zurück und weiß von MySQL-Fehlern nichts. Du solltest Dir das auf jeden Fall mal anschauen, der Code findet sich in wp-includes/wp-db.php.

    Was Du machen könntest, denke ich, wäre folgendes:

    PHP
    global $wpdb;
    $blocked = block_ip('123.456.789.012');
    
    
    if (mysql_error($wpdb->dbh)) {
      echo "An error has occured!";
    } else {
      echo "Everything went fine.";
    }

    So in etwa macht WordPress in der query-Funktion selber seine Fehlerbehandlung (WP 2.3.3 im übrigen, weiß nicht, wie es in in 2.5 aussieht). Das ist jetzt aber von mir nur geraten. Du müsstest ausprobieren, ob der DB-Handler an der Stelle noch zur Verfügung steht.

  • Was Du zitierst gilt für die Funktion query(), welche Du aber ja gar nicht aufrufst. get_results() liefert dagegen einfach die Ergebnisse zurück und weiß von MySQL-Fehlern nichts.

    Ooops, du hast Recht, vielen Dank!
    Das ist mir gar nicht aufgefallen. :)

    Könnte ich dann nicht einfach ein query() vorschalten, und wenn es FALSE ergibt, dann gab es einen Fehler?

    PHP
    function block_ip($ip) {
         global $wpdb;
         $query = "INSERT IGNORE INTO wp_blocked_ips (ip) VALUES ('$ip')";
         if ($wpdb->query($query) === FALSE) {
              return FALSE
         } else {
              return $wpdb->get_results($query);
         }
    }

    Das einzige Problem, was ich damit habe, ist der Unterschied zwischen "==" und "===", wie es auch im Codex beschrieben wird.

    Zitat

    Note: since both 0 and FALSE can be returned, make sure you use the correct comparison operator: equality == vs. identicality ===

    Muss ich also "===" verwenden, wie ich es vorstehend getan habe?

    Und würde dann der Aufruf

    PHP
    $blocked = block_ip('123.456.789.012');
    
    
    if ($blocked) {
        echo "Everything went fine.";
    } else {
        echo "An error has occured!";
    }

    zum gewünschten Erfolg führen?

    Ich sehe da das Problem, dass block_ip() entweder ein Object oder FALSE zurückgeben soll... geht das denn, sprich, wenn $blocked nicht FALSE ist, gibt es dann TRUE zurück und ist gleichzeitig ein Object, auf das ich zugreifen könnte?

    Ich hoffe, man versteht, was ich sagen will... :confused:

  • Das hier scheint zu funktionieren:

    Funktion:
    =======

    PHP
    function block_ip($ip) {
          global $wpdb;
          $query = "INSERT IGNORE INTO wp_blocked_ips (ip) VALUES ('$ip')";
          if ($wpdb->query($query) === FALSE) {
               return FALSE;
          } else {
               return $wpdb->get_results($query);
          }
     }

    Aufruf:
    =====

    PHP
    $blocked = block_ip('123.456.789.012');
     
     if (!($blocked === FALSE)) {
         echo "Everything went fine.";
     } else {
         echo "An error has occured!";
     }

    Das mit dem DB-Handler ->dbh und mysql_error() funktioniert leider nicht...

  • Freut mich, dass Du das hingekriegt hast. Nicht so ideal ist die Lösung natürlich, da die Query jetzt doppelt ausgeführt wird, aber ich nehme mal an, das ist nichts was bei jedem Seitenaufruf aufgerufen wird, oder?!

    Ansonsten dazu noch:

    Zitat

    Ich sehe da das Problem, dass block_ip() entweder ein Object oder FALSE zurückgeben soll... geht das denn, sprich, wenn $blocked nicht FALSE ist, gibt es dann TRUE zurück und ist gleichzeitig ein Object, auf das ich zugreifen könnte?

    Wenn Du ein Objekt zurückgibst, ist dieses nicht TRUE, aber eben auch nicht FALSE. Das hast Du ja auch schon alles richtig zusammengebastelt. ;-)

  • Freut mich, dass Du das hingekriegt hast. Nicht so ideal ist die Lösung natürlich, da die Query jetzt doppelt ausgeführt wird, aber ich nehme mal an, das ist nichts was bei jedem Seitenaufruf aufgerufen wird, oder?!

    Nein, keine Angst... das soll nur aufgerufen werden, wenn der User im Admin Panel einen Formularbutton klickt, der da heißt "Block IP". :-)

    Wollte dabei nur sichergehen, das dabei auch alles richtig ausgeführt wird und der User die entsprechende Rückmeldung bekommt.

    Trotzdem: vielen Dank für die Hilfe!

    ... und ja: bin ein schlaues Kerlchen, net? :-D

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!