Ambas cosas. Las declaraciones preparadas lo protegerán contra las inyecciones de SQL si, y solo si, las usa de manera correcta. Solo 'usar' declaraciones preparadas no ayudará si todavía está interpolando variables para nombres de tablas/columnas, por ejemplo.
$stmt = "SELECT * FROM $table WHERE $column = ?"; //not good...