sql >> Database >  >> RDS >> Mysql

Inzicht in door PDO opgestelde verklaringen en bindende parameters

Je hebt gelijk dat het eerste geval onveilig is. Het is echter belangrijk om te begrijpen dat het voorbereiden van een instructie alleen waarde heeft als u variabele gegevens gebruikt en/of dezelfde query herhaaldelijk uitvoert. Als u eenvoudige instructies zonder variabelen uitvoert, , kunt u dit eenvoudig doen:

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

En eindigen met een PDOStatement object om mee te werken, net zoals wanneer u PDO::exec() . gebruikt .

Voor je tweede geval heb je grotendeels gelijk. Wat er gebeurt, is dat de variabele die aan de database wordt doorgegeven, een escapecode heeft en tussen aanhalingstekens staat (tenzij je anders opgeeft met het derde argument voor PDOStatement::bindParam() , het wordt als een tekenreeks verzonden, wat in de meeste gevallen goed is.) De query zal dus niet "mislukken" als er slechte gegevens worden verzonden. Het gedraagt ​​zich precies alsof u een geldig nummer heeft doorgegeven dat niet als ID in de database voorkomt. Er zijn natuurlijk sommige randgevallen waar je nog steeds kwetsbaar bent, zelfs met een correct opgestelde verklaring.

Om het leven gemakkelijker te maken, kunt u ook voorbereide verklaringen zoals deze gebruiken om impliciete binding te doen:

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

Of zelfs zo, met niet nader genoemde parameters:

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

Natuurlijk is het meeste hiervan uitgelegd in de opmerkingen terwijl ik het antwoord aan het typen was!




  1. Standaarddatabase met de naam postgres op Postgresql-server

  2. WAARSCHUWING:Office-versie 2204 kan Access-toepassingen breken

  3. hoe de partitie te laten vallen zonder gegevens in MySQL te laten vallen?

  4. SQL - Geef me slechts 3 hits voor elk type