web-dev-qa-db-ja.com

Mysql_real_escape_stringに代わるもの

私はある時点で私はデータベースに特定のタイトルが存在するかどうか見る必要があるWordPressプラグインを持っています。 2年間、このコードはうまくいきました:

$myposttitle= $wpdb->get_results(
 "select post_title from $wpdb->posts
  where post_title like '%".  mysql_real_escape_string($myTitle) . "%'"
);

しかし、php 5.5では。また、WP 3.9.1では、関数mysql_real_escape_stringは廃止予定であるため、エラーとなります。

私はもう$myTitleを使うことができなくなった今、他のどの関数がmysql_real_escape_stringの内容を適切にエスケープするかについてのどんな考えでも?

ありがとう

3
Allen

WordPressでデータベースを扱うときは、ローレバーのmysql_*またはmysqli_*関数を使用しないでください。

常に$wpdbメソッドを使うようにしてください。あなたの場合は prepare() を使うべきです:

$query = $wpdb->prepare(
  "SELECT post_title from $wpdb->posts
  WHERE post_title LIKE %s",
  "%" . $myTitle . "%"
);

さらに、1つの列を取得したら、get_colの代わりに get_results を使用する方が簡単です。

$myposttitle = get_col( $query );
2
gmazzap

与えられたprepare()の答えは部分的に正しいのですが、SQLステートメントの文字列を手動でエスケープする方法が必要な場合は、esc_sql()を使用してください。

文字列をエスケープしてlike文の中に入れるという特定のケースでは、次のように正しく記述する必要があります。

$query = $wpdb->prepare(
  "SELECT post_title from $wpdb->posts
  WHERE post_title LIKE %s",
  "%" . $wpdb->esc_like( $myTitle ) . "%"
);

$ wpdb-> esc_like()は、検索対象のフレーズに含まれる可能性のあるパーセント記号、アンダースコア、またはバックスラッシュを正しくエスケープするために必要です。 $ wpdb-> esc_like()は準備された入力を返さず、LIKEで使用される特殊文字をエスケープするだけです。したがって、prepare()はまだ必要です。

5
Otto