Zurück   WordPress Deutschland Forum > Support > Konfiguration

Antwort
 
Themen-Optionen Ansicht
Alt 03.06.2008, 09:09   #1 (permalink)
PostRank: 1
 
Benutzerbild von Saphod
 
Registriert seit: 12.05.2007
Ort: Hannover
Beiträge: 22
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-Code:
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-Code:
$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-Code:
if (count($items) > 0) { ... } 
oder

PHP-Code:
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!
__________________
Marco Luthe Online! - http://www.saphod.net
Saphod ist offline   Mit Zitat antworten
Alt 03.06.2008, 09:34   #2 (permalink)
PostRank: 9
 
Benutzerbild von Ammaletu
 
Registriert seit: 14.07.2007
Beiträge: 1.432
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-Code:
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.
__________________
"Life brings hope and pain, but revenge never brings redemption." || Mein Blog
Ammaletu ist offline   Mit Zitat antworten
Alt 03.06.2008, 10:00   #3 (permalink)
PostRank: 1
 
Benutzerbild von Saphod
 
Registriert seit: 12.05.2007
Ort: Hannover
Beiträge: 22
Zitat:
Zitat von Ammaletu Beitrag anzeigen
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-Code:
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-Code:
$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...
__________________
Marco Luthe Online! - http://www.saphod.net
Saphod ist offline   Mit Zitat antworten
Alt 03.06.2008, 12:20   #4 (permalink)
PostRank: 1
 
Benutzerbild von Saphod
 
Registriert seit: 12.05.2007
Ort: Hannover
Beiträge: 22
Das hier scheint zu funktionieren:

Funktion:
=======

PHP-Code:
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-Code:
$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...
__________________
Marco Luthe Online! - http://www.saphod.net
Saphod ist offline   Mit Zitat antworten
Alt 03.06.2008, 16:23   #5 (permalink)
PostRank: 9
 
Benutzerbild von Ammaletu
 
Registriert seit: 14.07.2007
Beiträge: 1.432
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.
__________________
"Life brings hope and pain, but revenge never brings redemption." || Mein Blog
Ammaletu ist offline   Mit Zitat antworten
Alt 03.06.2008, 16:37   #6 (permalink)
PostRank: 1
 
Benutzerbild von Saphod
 
Registriert seit: 12.05.2007
Ort: Hannover
Beiträge: 22
Zitat:
Zitat von Ammaletu Beitrag anzeigen
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?
__________________
Marco Luthe Online! - http://www.saphod.net
Saphod ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist aus.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:25 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0 | Impressum | Ein Inpsyde.com Projekt