PHPでの

sprintf("SELECT * FROM table WHERE id = %d", $value);

sprintf("SELECT * FROM table WHERE id = %s", escape($value));

sprintf("SELECT * FROM table WHERE id = '%s'", escape($value));

の3つのコードについて、2行目のコードでSQLインジェクション脆弱性が生じ、1行目と3行目は問題がないのはどのような理由でしょうか

ここでescape()は値をSQLの文字列リテラル(のシングルクオーテーションの内側)としてエスケープするmysqli_real_escape_stringのような関数とします。