Θέσεις κράτησης θέσης (Positional Placeholders) στην PDO της PHP
Ας δούμε πώς να δουλέψουμε με θέσεις κράτησης θέσης. Ας υποθέσουμε ότι έχουμε δύο μεταβλητές που θα θέλαμε να εισαγάγουμε στο ερώτημα:
<?php
$min = 1;
$max = 5;
?>
Ας υποθέσουμε ότι θέλουμε να εισαγάγουμε τις μεταβλητές μας ως εξής:
<?php
$sql = "SELECT * FROM users WHERE id>$min and id<$max";
?>
Ωστόσο, αυτό δεν είναι ασφαλές. Επομένως, αντί να εισάγουμε τις μεταβλητές απευθείας, θα τις αντικαταστήσουμε με θέσεις κράτησης θέσης (positional placeholders), που αντιπροσωπεύονται από ερωτηματικά:
<?php
$sql = 'SELECT * FROM users WHERE id>? and id<?';
?>
Τώρα ας εκτελέσουμε την εντολή που θα προετοιμάσει το ερώτημα:
<?php
$res = $pdo->prepare($sql);
?>
Τώρα ας εκτελέσουμε το ερώτημα, περνώντας ως παραμέτρους έναν πίνακα που περιέχει τις μεταβλητές μας. Σε αυτήν την περίπτωση οι μεταβλητές θα εισαχθούν στο ερώτημα με τη σειρά που έχουν καθοριστεί στον πίνακα:
<?php
$res->execute([$min, $max]);
?>
Μετά από αυτό, μπορούμε να πάρουμε το αποτέλεσμα του ερωτήματος:
<?php
while ($row = $res->fetch()) {
var_dump($row);
}
?>
Ας τα βάλουμε όλα μαζί και παίρνουμε τον ακόλουθο κώδικα:
<?php
$min = 1;
$max = 5;
$sql = 'SELECT * FROM users WHERE id>? and id<?';
$res = $pdo->prepare($sql);
$res->execute([$min, $max]);
while ($row = $res->fetch()) {
var_dump($row);
}
?>
Δίνονται οι μεταβλητές:
<?php
$age = 30;
$salary = 1000;
?>
Βρείτε όλους τους χρήστες, των οποίων η ηλικία ή ο μισθός είναι ίσοι με τις τιμές που δίνονται στις μεταβλητές.
Προσπαθήστε να κάνετε μια SQL-εισβολή (SQL injection) στον κώδικά σας. Βεβαιωθείτε ότι δεν θα περάσει.