2016-04-19 8 views
3

Ich benutze $ wpdb und das folgende ist Teil der Codes, die $ wpdb-> update aufruft.Wordpress WPDB und mysql seltsames Verhalten

Dieser Code funktioniert gut, wenn es normal ist [email protected], aber wenn Benutzer das + Zeichen in ihrem Benutzernamen, z. [email protected]@domain.com, wpdb liest nicht das + Zeichen

Unten sind Variablen von $ _GET, aber ich gebe Werte für die Lesbarkeit.

$open_email = '[email protected]'; 
$open_key = '2f1e4b16a9a882bbef9b00906fc5c8f563fd70a5'; 
$open_time = time(); 

if (strlen($open_key) == 40) { 
    $status_update = $wpdb->update('status', 
      array(
       'invite_status' => 'opened', 
       'open_time' => $open_time 
       ), 
      array(
       'invite_email' => $open_email, 
       'invite_token' => $open_key 
       ), 
      array(
       '%s', 
       '%d' 
       ), 
      array(
       '%s', 
       '%s' 
       ) 
       ); 
} 

var Dump von $ wpdb-> last_query und $ wpdb-> LAST_ERROR die folgenden zurück.

string (235) "UPDATE status SET invite_status = 'geöffnet', open_time = 1461103507 WHERE invite_email = 'etwas [email protected] UND rating_invite_token = '2f1e4b16a9a882bbef9b00906fc5c8f563fd70a5'"

ich oben Teil bemerken in Fehler, in fett markiert, dass mein Pluszeichen (+) ist weg und es ließ ein Leerzeichen, wodurch die obige Anweisung nicht zu aktualisieren.

Darf ich wissen, ob ich etwas verpasse?

Update: ich frage, weil einige Benutzer von Gmails die + nicht verwendet signieren ihre E-Mails zu kategorisieren, wie [email protected] noch zurück zu [email protected]

geht

Wenn eine Hygienisierung gibt es die Ich soll es tun, aber ich verpasse es, bitte führe mich auch. Ich nehme an, dass alle $ _GET-Daten sollten bereinigt worden sein.

Antwort

3

Es ist nicht wpdb oder MySQL, die das Plus entfernt.

Unter der Haube, wenn Sie Update wie folgt aufrufen, WordPress leitet die Daten durch mysqli_real_escape_string() und nichts anderes.

Da Sie die Daten kommen aus dem Query-String $_GET, wahrscheinlich erwähnt die + vor der Abfrage entfernt wird, weil es uns unescaped zu sein und die + in einen Raum übersetzt wird.

Sie können dies mit:

$open_email = $_GET['email']; 
var_dump($open_email); 

und sehen, was das Ergebnis ist.

das Plus zurück zu bekommen, sollte es sicher sein, die folgenden, nachdem alle sanitzation und URL-Kodierung zu tun:

$open_email = str_replace(' ', '+', $open_email); 
+0

Oh ja, Sie sind vor Ort! Darf ich annehmen, dass dies ein häufiges Problem ist und str_replace ('', '+', $ open_email); ist ein allgemeiner Schritt nach einem GET mit E-Mail-String zu tun? –

+1

Ja und nein, wenn Sie wirklich möchten, dass das '+' ein Plus ist, sollte die URL von der Quelle, z.B. "http: //example.com? email = etwas% 2bADDITION% 40gmail.com & open_key = xxx' Ein' + 'in einer URL ist eine spezielle Kodierung für ein Leerzeichen, wenn Sie eigentlich ein' + 'darstellen wollen, hexen Sie es als kodieren '% 2b' – drew010