Help us understand the problem. What is going on with this article?

sprintf()でSQL文を生成する際、%は%でエスケープできる



何を言っているのかわからねーと思うが、ありのままを話すぜ

2020/09/12 追記
コメントにてSQLインジェクションの原因となる脆弱性をご指摘いただきました。
本記事はsprinf()でSQLクエリを作成する事を推奨するものではないとご理解をお願いします。
@tadsan様 ありがとうございます。

はじめに

現在私はPHP+MySQLでフルスクラッチ開発をしている会社で働いているのですが、
まだ、入社して1ヶ月ほどなので既存のコードを読むことがほとんどです。

弊社ではphpファイルの中でSQL文を生成する際に
sprintf()を使用して、フォーマットを整えるようにしています。
(これがスタンダードなのかは不明)

その中で、いまいちよくわからない記述を調べていくうちに
興味深いルールに出会いましたので、忘れないようQiita残しておきます。

sprintf()でSQLの曖昧検索クエリを作る時

$freeword = 'qiita';

$sql = sprintf('SELECT * FROM title LIKE "%%%s%%"', $freeword);

このコードはsprintf()の第二引数 $freeword が、第一引数内の "%%%s%%" の部分に
置き換わってフォーマットされるのですがその際に気をつけたいルールがあります。

まず真ん中部分の「%s」は変数の値で今回の例ではqiitaに変換されます。
なので、この時点では「%%qiita%%」になる。

この段階で、筆者は
「無駄に%の数多くね?」
と、勘違いしていましたが

そもそもsprintf()で%という記号はそのまま文字として認識されないので
エスケープして文字とする必要があります。

そこで%をエスケープするための記号が%なのです。

つまりは

残った「%」のうち、後ろの%は、それぞれ手前の 「%」でエスケープされるので、結果としてただの「%」と言う「文字列」になります。

① %→「%」qiita %→「%」

② 結果「%qiita%」が残る

③ これがSQLのLIKE文に残ることで、結果として、
$sql = 'SELECT * FROM title LIKE %qiita%';
と言うSQL文の完成。

わかりやすい参考記事

下記ブログ記事の解説が初心者にも大変わかりやすかったので
記事作成の大部分に引用させていただきました。

・はらちゃんのブログ

ありがとうございます。

Shigeyoshi_Koyama
都内でPHPベースのECを運営している企業にて勤務しています。 執筆内容はプライベートの学習についてです。 Twiiter: @Koyama_codeA
https://github.com/4ge44koyama
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした