Tienes razón en que el primer caso es inseguro. Sin embargo, es importante comprender que preparar una declaración solo tiene valor si está utilizando datos variables y/o ejecutando la misma consulta repetidamente. Si está ejecutando sentencias simples sin variables , simplemente podría hacer esto:
$sql = "SELECT * from myTable WHERE this_column IS NOT NULL";
$result = $conn->query($sql);
Y termine con una PDOStatement
objeto con el que trabajar, al igual que cuando usa PDO::exec()
.
Para su segundo caso, nuevamente, tiene razón en gran medida. Lo que sucede es que la variable pasada a la base de datos se escapa y se cita (a menos que especifique lo contrario con el tercer argumento para PDOStatement::bindParam()
, se envía como una cadena, lo que está bien en la mayoría de los casos). Por lo tanto, la consulta no "fallará" si se envían datos incorrectos. Se comporta exactamente como si hubiera pasado un número válido que no existía como ID en la base de datos. Hay, por supuesto, algunos casos extremos
donde todavía es vulnerable incluso con una declaración preparada correctamente.
Además, para hacer la vida más fácil, puede usar declaraciones preparadas como esta, para hacer un enlace implícito:
$sql = "SELECT * FROM myTable WHERE id = :id";
$stmt = $conn->prepare($sql);
$stmt->execute([":id"=>$id]);
O incluso así, con parámetros sin nombre:
$sql = "SELECT * FROM myTable WHERE id = ?";
$stmt = $conn->prepare($sql);
$stmt->execute([$id]);
¡Naturalmente, la mayor parte de esto se ha explicado en los comentarios mientras escribía la respuesta!