sql >> Database teknologi >  >> RDS >> Mysql

Forståelse af PDO-forberedte erklæringer og bindende parametre

Du har ret i, at den første sag er usikker. Det er dog vigtigt at forstå, at forberedelse af en sætning kun har værdi, hvis du bruger variable data og/eller udfører den samme forespørgsel gentagne gange. Hvis du udfører almindelige sætninger uden variable , kan du blot gøre dette:

$sql = "SELECT * from myTable WHERE this_column IS NOT NULL";
$result = $conn->query($sql);

Og ender med en PDOStatement objekt at arbejde med, ligesom når du bruger PDO::exec() .

I dit andet tilfælde har du igen stort set ret. Det, der sker, er, at den variabel, der sendes til databasen, escapes og citeres (medmindre du angiver andet med det tredje argument til PDOStatement::bindParam() , den sendes som en streng, hvilket er fint i de fleste tilfælde.) Så forespørgslen vil ikke "fejle", hvis der sendes dårlige data. Det opfører sig præcis, som om du havde bestået et gyldigt nummer, der ikke fandtes som et ID i databasen. Der er selvfølgelig nogle kantsager hvor du stadig er sårbar selv med en korrekt udarbejdet erklæring.

For at gøre livet lettere kan du også bruge forberedte udsagn som denne, til at gøre implicit binding:

$sql = "SELECT * FROM myTable WHERE id = :id";
$stmt = $conn->prepare($sql);
$stmt->execute([":id"=>$id]);

Eller endda sådan her, med ikke-navngivne parametre:

$sql = "SELECT * FROM myTable WHERE id = ?";
$stmt = $conn->prepare($sql);
$stmt->execute([$id]);

Naturligvis er det meste af dette blevet forklaret i kommentarerne, mens jeg skrev svaret!




  1. MySQL Vælg ID'er, der forekommer på forskellige rækker med flere specifikke værdier for en kolonne

  2. Mysql::Fejl:Den angivne nøgle var for lang; max nøglelængde er 1000 bytes

  3. PHP SQL:Sådan gemmer du data til flere databaser fra en html-formular ELLER hvordan du automatisk kopierer data fra en database til en anden database

  4. MySQL tæller på hinanden følgende datoer for den aktuelle streak