2016-04-19 6 views
3

私は$ wpdbを使用していますが、以下は$ wpdb-> updateを呼び出すコードの一部です。Wordpress WPDBとMysqlの変な動作

このコードは通常の[email protected]の場合でもうまく動作しますが、ユーザーが自分のユーザー名に+記号を使用するとしたらどうでしょうか? email [email protected]、wpdbは+記号を読み取らない

以下の変数は$ _GETの値ですが、わかりやすくするために値を入れています。 $ wpdb-> last_queryと$ wpdb-の

$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ダンプ>以下を返しLAST_ERROR。

文字列(235) "UPDATE status SET invite_statusは= '開かれた'、invite_email = open_time = 1461103507 '何か[email protected]' AND rating_invite_token = '2f1e4b16a9a882bbef9b00906fc5c8f563fd70a5'" 私は一部の上に気づく

太字ので強調表示されていますが、マイナス記号(+)が消えてスペースが残っているため、上記の文が更新されません。

私には何も分からないことが分かりますか?

更新:Gmailの一部のユーザーがどの任意の消毒がある場合[email protected]はまだ戻って[email protected]

に行くように+、彼らの電子メールを分類するために署名を使用しないので、私は求めています私はしなければならないが、私は逃して、私もガイドしてください。私はすべての$ _GETデータが消毒されていたはずだと思います。

答えて

3

プラスを削除するのはwpdbまたはMySQLではありません。

フードの下で、そのような更新を呼び出すと、WordPressはmysqli_real_escape_string()とそれ以外のデータを渡しています。それ私たちがエスケープされているため

あなたはデータをクエリ文字列$_GETから来て言及しているためには、最も可能性の高い+は、クエリの前に削除されていると+はスペースに変換されています。

あなたはでこれを確認することができます。

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

と結果が何であるかを参照してください。

バックプラスを得るために、すべてのsanitzationとアンエスケープした後、以下の手順を実行しても安全でなければなりません:

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

ああ、あなたは上のスポットです!私はこれが共通の問題であり、str_replace( ''、 '+'、$ open_email)と仮定してもよいでしょう。電子メール文字列でGETした後に行う一般的な手順ですか? –

+1

はい、いいえ、実際に '+'をプラスにしたい場合、URLはソースから適切に16進数でエンコードされている必要があります。 'http://example.com?email = something%2bADDITION%40gmail.com&open_key = xxx' URLの' + 'はスペースの特殊なエンコーディングです。実際に' + 'を表現したい場合は、 '%2b' – drew010

関連する問題