例えば、Ruby では、

変数a を使って、上の2つのように文字列を連結させたり、
式展開してから埋め込んだりしても、

変数aの内容をユーザーからもらった、危険な文字列の場合、SQL injection される

例えば、WHERE (id = 1 OR 1 = 1)なら、
true となるので、すべてのレコードが取得される!

それを最後のように、place holder, ? を使えば、
危険な文字列をエラーにできる

こういうやり方が、Ruby on Rails などのフレームワークを使った、ウェブ開発の基本

id = '1 OR 1 = 1'

User.where( "id = " + id )
User.where( "id = #{id}" )

User.where( "id = ?", id )