Junior
Τι είναι οι προετοιμασμένες ερωτήσεις;
sobes.tech AI
Απάντηση από AI
Αυτή είναι μια μέθοδος για την αύξηση της ασφάλειας και της απόδοσης κατά την εργασία με βάσεις δεδομένων, όπου το πρότυπο ερωτήματος SQL αποστέλλεται στον διακομιστή βάσης δεδομένων ξεχωριστά από τα δεδομένα.
Πλεονεκτήματα:
- Προστασία από SQL injection: Τα δεδομένα επεξεργάζονται από τον διακομιστή βάσης δεδομένων ως λiterals, όχι ως μέρος του κώδικα SQL.
- Απόδοση: Ο διακομιστής βάσης δεδομένων αποθηκεύει στη μνήμη cache το σχέδιο εκτέλεσης του ερωτήματος, εξοικονομώντας χρόνο κατά την επανεκτέλεση του ίδιου ερωτήματος με διαφορετικές παραμέτρους.
- Άνεση: Επιτρέπουν την δομή του κώδικα και διευκολύνουν την αποσφαλμάτωση.
Βήματα εκτέλεσης προετοιμασμένου ερωτήματος:
- Προετοιμασία (Prepare): Το πρότυπο ερωτήματος αποστέλλεται στον διακομιστή βάσης δεδομένων για ανάλυση, έλεγχο σύνταξης και κατασκευή σχεδίου εκτέλεσης. Το πρότυπο χρησιμοποιεί placeholders για να υποδείξει τα σημεία όπου θα εισαχθούν τα δεδομένα.
- Δέσμευση (Bind): Οι τιμές των μεταβλητών δεσμεύονται με τα placeholders. Ο διακομιστής δεν τα ερμηνεύει ως κώδικα SQL.
- Εκτέλεση (Execute): Το ερώτημα εκτελείται με τις δεσμευμένες τιμές.
Παράδειγμα χρήσης προετοιμασμένου ερωτήματος σε PHP με PDO:
// Σύνδεση με τη βάση δεδομένων (παράδειγμα)
$dsn = 'mysql:host=localhost;dbname=ηβάση';
$u = 'χρήστης';
$p = 'κωδικός';
try {
$pdo = new PDO($dsn, $u, $p);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die('Σφάλμα σύνδεσης: ' . $e->getMessage());
}
// Προετοιμασία ερωτήματος με placeholders
$stmt = $pdo->prepare("SELECT όνομα, email FROM χρήστες WHERE id = :id");
// Δέσμευση τιμής στο placeholder
$userId = 1;
$stmt->bindParam(':id', $userId, PDO::PARAM_INT);
// Εκτέλεση ερωτήματος
$stmt->execute();
// Λήψη αποτελεσμάτων
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if ($user) {
echo "Όνομα χρήστη: " . htmlspecialchars($user['όνομα']) . "<br>";
echo "Email χρήστη: " . htmlspecialchars($user['email']) . "<br>";
} else {
echo "Δεν βρέθηκε χρήστης με ID " . htmlspecialchars($userId) . ".";
}
Σε αυτό το παράδειγμα, το :id είναι ένα ονομαστικό placeholder. Μπορούν επίσης να χρησιμοποιηθούν τοποθετημένοι placeholders (?).
// Προετοιμασία ερωτήματος με τοποθετημένο placeholder
$stmt = $pdo->prepare("SELECT όνομα, email FROM χρήστες WHERE id = ?");
// Εκτέλεση ερωτήματος με πίνακα τιμών
$userId = 2;
$stmt->execute([$userId]);
// Λήψη αποτελεσμάτων
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if ($user) {
echo "Όνομα χρήστη: " . htmlspecialchars($user['όνομα']) . "<br>";
echo "Email χρήστη: " . htmlspecialchars($user['email']) . "<br>";
} else {
echo "Δεν βρέθηκε χρήστης με ID " . htmlspecialchars($userId) . ".";
}
?>