モダンなフレームワークを使っていればこんなことで困ることもないんだろうけど、レガシーなオレオレフレームワークの面倒を見ないといけないこともあるよね。
そんな時はこんな感じでやるしかないんじゃないかな。
$values = array('123', '2016-03-10 00:00:00');
$sql = 'SELECT * FROM tablename WHERE id = ? AND create_date < ?';
$sql = vsprintf(str_replace('?', '%s', $sql), $values);
echo $sql;
あとはまぁ文字列を""で囲んだり、予約語は囲わないようにしたりすれば大丈夫。