Häufige Fehlerquelle bei mysql_real_escape_string()

Published 2006-07-19, 23:16

mysql_real_escape_string() sollte ja auf jeden String angewendet werden, der in die Datenbank eingetragen wird. Mehrmals passierte es mir nun schon, dass ich auf neuen Servern nach der Ausführung eines Scriptes den Backslash auch in der Datenbank wiederfand. Grund:

Falls Sie magic_quotes_gpc aktiviert haben und mit Daten aus Benutzereingaben arbeiten, müssen Sie vorher Ihre Daten mit stripslashes() behandeln.

So einfach. Muss es mir nur merken. Und den Apache nach der Änderung neu starten.

WordPress-Sicherheit: nonce?

Published 2006-07-17, 03:02

Wer ein wenig mit dem WordPress-Admininterface (>= 2.0.3) herumspielt findet früher oder später im Quellcode ein seltsames hidden Field:

<input type="hidden" name="_wpnonce" value="b6f49bd123" />

Für was das gut ist, wird hier erklärt: http://asymptomatic.net/2006/06/01/2370/what-is-all-this-nonce-sense/

Vorsicht bei der php-Funktion http_build_query()

Published 2006-07-14, 17:59

Die Funktion http_build_query() kann ab PHP5 dazu benutzt werden aus Arrays einen URL-enkodierten String zu machen. Das ist toll. Vorher musste man sich das selber schreiben:

function http_build_query($formdata, $numeric_prefix = "") {
$arr = array();
foreach ($formdata as $key => $val)
$arr[] = urlencode($numeric_prefix.$key)."=".urlencode($val);
return implode($arr, "&");
}

Aufpassen sollte man jedoch, dass der Parameter „arg_separator.output“ in der php.ini wirklich auf „&“ und nicht auf „&amp;“ eingestellt ist – die angefragten Server nehmen einem das sehr übel. Zusätzlich entdeckt man es im Output des Query-Strings im Browser nicht.

Warum ich das erzähle? Ich habe heute fast eine ganze Stunde damit verbracht. Klasse.

Pingfix: Der doofe WordPress-Option-Cache…

Published 2006-07-09, 23:47

Einige meiner Testnutzer berichteten von Problemen bei den Pings für ehemals in die Zukunft datierte Beiträge. Irgendwie wurden diese Pings mehrfach ausgeführt, teilweise alle 15 Minuten über den Zeitraum mehrerer Tage. Nicht gut.

Ich habe also den halben Nachmittag damit verbracht das Problem aufzuspüren, schlussendlich lag es am WP-internen Caching. Hier werden auch Einstellungen von WordPress zwischengespeichert. Pingfix zweckentfremdet diese Datentabelle um die noch zu pingenden Einträge zwischenzuspeichern (Dadurch kann auf eine zusätztliche Tabelle oder Spalte in der Beitragstabelle verzichtet werden).

Über die Standardfunktion get_option() bekam PingFix nun also immer die zwischengespeicherten und teilweise nicht aktuellen Werte. Ich habe nun die get_option() kopiert und als PF_get_option() leicht modifiziert in PingFix übernommen.

function PF_get_option($setting) {
global $wpdb;
$row = $wpdb->get_row("SELECT option_value FROM $wpdb->options WHERE option_name = '$setting' LIMIT 1");
if( is_object( $row) ) { // Has to be get_row instead of get_var because of funkiness with 0, false, null values
$value = $row->option_value;
wp_cache_set($setting, $value, 'options');
} else {
return false;
}
return apply_filters( 'option_' . $setting, maybe_unserialize($value) );
}

Warum der Cache mit den Einstellungsoptionen nicht aktualisiert wurde, konnte ich übrigens nicht klären. Eine richtige Dokumentation oder ähnliches zu diesen Funktionen habe ich auch nicht gefunden. Was soll’s, nun passt alles. Hoffe ich ;)

latin1_german1_ci oder latin1_german2_ci?

Published 2006-07-06, 17:42

Seit Version 2.6.x unterstützt phpMyAdmin die sogenannten Kollationen. Kollationen sind Zeichensätze und Sortierreihenfolgen nach denen zum Beispiel ORDER BY – Klauseln die Daten einer Datenbank sortieren. Es gibt 2 deutsche Zeichensätze, german1_ci und german2_ci. Der Unterschied ist im MySQL-Referenzhandbuch ganz gut dargestellt:

Die Sortierfolgen latin1_german1_ci und latin1_german2_ci basieren auf den DIN-1- und DIN-2-Normen. DIN ist das Deutsche Institut für Normung, also die deutsche Standardisierungsorganisation. DIN-1 heißt „Wörterbuchsortierung“, DIN-2 „Telefonbuchsortierung“.

  • Regeln für latin1_german1_ci (Wörterbuchsortierung):
    Ä = A
    Ö = O
    Ü = U
    ß = s
  • Regeln für latin1_german2_ci (Telefonbuchsortierung):
    Ä = AE
    Ö = OE
    Ü = UE

Ping-Probleme mit WordPress

Published 2006-06-13, 00:27

WordPress hat bis zur aktuellen Version 2.0.3 diverse Probleme und Fehler in den 3 Pingfunktionen Ping-Services, Trackback und Pingback:

  1. Zukünftige Posts pingen sofort nach Klicken des Buttons „Veröffentlichen“ (Publish), nicht erst zum Veröffentlichungsdatum
  2. Nutzt man die XML-RPC-Schnittstelle (zum Beispiel mit Blogdesk) sind die Pings eher Glücksache
  3. Editierte Posts pingen erneut die Ping-Services an
  4. Bei Problemen mit den Pings gibt es keine Benachrichtigungen, Erklärungen oder Logfiles
  5. Der Nutzer muss warten bis die Ping-Services abgearbeitet sind

Wie schon in einem vorigen Post angekündigt arbeite ich an einer Lösung für diese Probleme. Die Punkte 1 bis 3 konnte ich mit „meinem“ Plugin schon beheben, an 4 und 5 arbeite ich noch. Wenn du Lust hast das Plugin zu testen, eine kleine Mail an mich und ich schicke das Plugin mal rüber.

Musstest du dich noch mit anderen Fehlern und Problemen bezüglich der Pingfunktionen herumärgern? Kennst du andere Leute die Probleme hatten? Ab damit in den Kommentarbereich, wenn ich schon dran sitze kann ich die sicher auch lösen.

Wie WordPress pingt…

Published 2006-06-10, 02:06

Ich arbeite gerade an einem Plugin das die Ping-Funktionen von WordPress ein wenig verändern und verbessern soll. Auf jeden Fall habe ich gerade erst wirklich verstanden wie WordPress 2.x es (teilweise) schafft, dass der Nutzer nach dem Posten eines Beitrag nicht auf das Abarbeiten von Trackbacks und Pingbacks warten muss:

echo '<iframe id="pingcheck" src="' . get_settings('siteurl')
.'/wp-admin/execute-pings.php?time='. time() . '" style="border:
none;width:1px;height:1px;"></iframe>';

Die Datei execute-pings.php wird, falls nötig, einfach per Iframe in den Footer des Adminbereichs eingebunden und kümmert sich dann um die Pings. Wenn also ein Trackback nicht direkt ankommt, erstmal noch ein wenig im Adminbereich herumklicken damit der Ping auch wirklich ausgeführt wurde.

Ich frage mich wieso nicht mehr register_shutdown_function genutzt wird wie noch in WordPress 1.5. Jemand Ahnung?

Jetzt gilt es „nur“ noch herauszufinden ob da nicht noch andere Funktionen sich um die Pings kümmern. Dazu aber in Kürze mehr…

WordPress-Plugin: Smart Update Pinger

Published 2006-05-26, 19:08

Smart Update Pinger sorgt dafür, dass WordPress nur bei neuen Postings die Pingliste durchgeht und alle Services anpingt.

Zusätzlich gibt es eine schicke Liste mit den Antworten der Pingservices. Diese hilft bei Problemen, oder wenn man einfach nur überprüfen möchte, was WordPress da nun in der Gegend herum gepingt hat.

(via: http://blog.beginnermillionaire.com/?p=63)

WordPress 2.0

Published 2005-12-29, 18:28

Ziemlich langsam alles. Generell gefällt es aber.

Das Plugin PHP Exec 1.5 wollte nicht mehr und musste durch Exec-PHP 2.0 ersetzt werden. Das tut wie es soll.

INSERT … SELECT

Published 2005-12-05, 01:42

Ich habe mir MySQL ja bisher zum größten Teil selbst „beigebracht“ und mache demzufolge auch eine Menge Unsinn damit. Erst vor einigen Tagen wurde mir wirklich bewusst dass man mit einem INSERT-Statement auch mehr als nur eine Zeile hinzufügen kann…

Heute habe ich mir mal INSERT … SELECT angeschaut. Irgendwie scheinen sich dort aber 2 Punkte zu widersprechen:

The target table of the INSERT statement may appear in the FROM clause of the SELECT part of the query. (This was not possible in some older versions of MySQL.)

und

Currently, you cannot insert into a table and select from the same table in a subquery.

Sehe ich das richtig, dass hier einfach etwas nicht ganz up-to-date (tolles Wort…) ist, oder ist mit zweiterem ein Unterquery des SELECT-Statements gemeint? Das wiederum wäre auch kein Problem da ich das auch nicht wirklich kann.

Ach übrigens, kennt jemand ein wirklich gutes Buch zu MySQL?

18 queries. 0,287 seconds.