私はwordpressで検索クエリを操作していますが、元のクエリでは単語が波かっこと数字の間にあることに気付きました。
wp_posts.post_title LIKE '{30d0e4b86a2a793010a75740f60810aff6b57f6d18edc10be7ca6dc158e40c06}11{30d0e4b86a2a793010a75740f60810aff6b57f6d18edc10be7ca6dc158e40c06}'
それは何ですか ?
ありがとう
これらは%
サインのプレースホルダーです。自分自身と比較される値に%
を送信している場合、'%test%'
を見るとwp_posts.post_title LIKE '{30d0e4b86a2a793010a75740f60810aff6b57f6d18edc10be7ca6dc158e40c06}\{30d0e4b86a2a793010a75740f60810aff6b57f6d18edc10be7ca6dc158e40c06}11{30d0e4b86a2a793010a75740f60810aff6b57f6d18edc10be7ca6dc158e40c06}\{30d0e4b86a2a793010a75740f60810aff6b57f6d18edc10be7ca6dc158e40c06}'
が$query->request
に変換されていることがわかります。
データベース側のQueryは%
を持ちます。なぜそれがどこで行われているのか正確には調べていませんが、最近になって気付きました。私はそれが数バージョン前のその方法ではなかったと思うので、それは最近のアップデートかもしれません。
編集:もう少し詳しく調べた。これは4.8.3で追加され、wpdbから来ています。
/**
* Adds a placeholder escape string, to escape anything that resembles a printf() placeholder.
*
* @since 4.8.3
*
* @param string $query The query to escape.
* @return string The query with the placeholder escape string inserted where necessary.
*/
public function add_placeholder_escape( $query ) {
/*
* To prevent returning anything that even vaguely resembles a placeholder,
* we clobber every % we can find.
*/
return str_replace( '%', $this->placeholder_escape(), $query );
}
/**
* Removes the placeholder escape strings from a query.
*
* @since 4.8.3
*
* @param string $query The query from which the placeholder will be removed.
* @return string The query with the placeholder removed.
*/
public function remove_placeholder_escape( $query ) {
return str_replace( $this->placeholder_escape(), '%', $query );
}
関連するTracチケットは #41925 で、sprintfによってプレースホルダとして誤解される可能性のあるものがSQLに含まれていないことを確認するために導入されました。セキュリティ上の問題のために削除されました。