- Qoşulub
- 1 Oktyabr 2022
- Mesajlar
- 121
Prepared statement — SQL sorğularını daha təhlükəsiz və optimallaşdırılmış formada işlətmək üsuludur.
Əsas ideya odur ki:
Məsələn, bu pis üsuldur:
Əgər istifadəçi name sahəsinə '; DROP TABLE users; -- yazsa, bütün cədvəli silə bilər.
Amma prepared statement belə işləmir:
Burada $name sadəcə data kimi göndərilir, SQL-in bir hissəsi olmur.
<?php
$pdo = new PDO("mysql:host=localhost;dbname=test_
echo "PDO ilə istifadəçi əlavə olundu!";
Əsas ideya odur ki:
- Əvvəlcə SQL sorğusunun skeleton-u hazırlanır (? və ya
aram placeholder-ları ilə). - Sonra istifadəçi dəyərləri bu placeholder-lara ayrıca bind olunur.
- Verilənlər bazası bu prosesi ayırdığından SQL injection riski minimuma enir.
Niyə təhlükəsizdir?
Məsələn, bu pis üsuldur:
Kod:
// ❌ SQL injection-a açıq
$name = $_POST['name'];
$sql = "SELECT * FROM users WHERE name = '$name'";
$result = $conn->query($sql);
Əgər istifadəçi name sahəsinə '; DROP TABLE users; -- yazsa, bütün cədvəli silə bilər.
Amma prepared statement belə işləmir:
Kod:
// ✅ Təhlükəsiz
$stmt = $conn->prepare("SELECT * FROM users WHERE name = ?");
$stmt->bind_param("s", $name); // "s" = string
$stmt->execute();
$result = $stmt->get_result();
Burada $name sadəcə data kimi göndərilir, SQL-in bir hissəsi olmur.
Mysqli nümunəsi
Kod:
<?php
// DB bağlantısı
$conn = new mysqli("localhost", "root", "", "test_db");
// 1. Prepared statement yarat
$stmt = $conn->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
// 2. Parametrləri bağla
// "s" = string, "i" = integer, "d" = double, "b" = blob
$stmt->bind_param("ss", $name, $email);
// 3. Dəyərləri verib execute et
$name = "İlqar";
$email = "ilqar@example.com";
$stmt->execute();
echo "Yeni istifadəçi əlavə olundu!";
// 4. Bağla
$stmt->close();
$conn->close();
PDO nümunəsi (daha çevik)
<?php$pdo = new PDO("mysql:host=localhost;dbname=test_
Kod:
db;charset=utf8mb4", "root", "");
// 1. Prepared query
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
// 2. Parametrləri bind et və execute
$stmt->execute([
':name' => 'Sunay',
':email' => 'sunay@example.com'
]);
echo "PDO ilə istifadəçi əlavə olundu!";
Faydaları
- SQL Injection-dan qoruyur

- Kod təmiz görünür

- Eyni sorğu dəfələrlə icra olunanda daha sürətli olur
(DB sorğunu bir dəfə kompilyasiya edir) - Parametrlərlə işləmək asanlaşır
