MySQL tayyorlangan buyruqlar (prepared statements)
MySQL - Tayyor operatorlar
Tayyorlangan operatorlar veb-saytni SQL in’ektsiyalaridan himoya qilish uchun ishlatiladi.
Tayyorlangan operatorlar so‘rovlar strukturasini (SQL) haqiqiy ma’lumotlardan (foydalanuvchi kiritishi) ajratib turadi.
Tayyorlangan operatorlar asosan shunday ishlaydi:
- Tayyorlang: SQL so‘rovi shabloni to‘ldirgichlar bilan serverga yuboriladi. Ma’lumotlar qiymatlari yuborilmaydi. Misol: INSERT INTO MyGuests VALUES(?, ?, ?). Keyin server SQL so‘rovi shablonini bajarmasdan tahlil qiladi, kompilyatsiya qiladi va optimallashtiradi.
- Bajarish: Keyinchalik dastur qiymatlarni parametrlarga bog‘laydi va ma’lumotlar bazasi so‘rovni bajaradi. Ilova so‘rovni turli qiymatlar bilan xohlagancha bajarishi mumkin
Tayyorlangan operatorlar to‘rtta asosiy afzalliklarga ega:
- Qisqartirilgan tahlil vaqti - so‘rov bo‘yicha tayyorgarlik faqat bir marta amalga oshiriladi (operator bir necha marta bajarilgan bo‘lsa ham)
- O‘tkazish qobiliyatini minimallashtirish - Bog‘langan parametrlar serverga o‘tkazish qobiliyatini minimallashtiradi, chunki har safar butun so‘rovni emas, balki faqat parametrlarni yuborishingiz kerak.
- Xavfsizlik - Tayyorlangan operatorlar SQL in’ektsiyalariga qarshi juda foydali, chunki keyinchalik boshqa protokol yordamida uzatiladigan parametr qiymatlaridan to‘g‘ri qochish kerak emas. Agar dastlabki operator shablonlari tashqi ma’lumotlardan olinmagan bo‘lsa, SQL in’ektsiyasi amalga oshirilmaydi
- Toza kod - SQL buyruqlaridan ma’lumotlarni ajratish orqali
MySQL da tayyorlangan operatorlar
Quyidagi misol PHP MySQL Prepared Statements dan olingan va MySQL da tayyorlangan operatorlardan foydalanadi:
Misol - Tayyor operatorlar bilan MySQL
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// SQL query template
$sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)";
// Prepare the SQL query template
if($stmt = $conn->prepare($sql)) {
// Bind parameters
$stmt->bind_param("sss", $firstname, $lastname, $email);
//
Set parameters and execute
$firstname = "John";
$lastname = "Doe";
$email = "john@example.com";
$stmt->execute();
$firstname = "Mary";
$lastname = "Moe";
$email = "mary@example.com";
$stmt->execute();
$firstname = "Julie";
$lastname = "Dooley";
$email = "julie@example.com";
$stmt->execute();
echo "New records created successfully";
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
$stmt->close();
$conn->close();
?>
Kod tushuntirish
SQL-da savol belgilari (?) ism, familiya va elektron pochta qiymatlari uchun joy egalari:
"INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)"
Endi bind_param() funksiyasiga qarang. Bu funksiya o‘zgaruvchilarni SQL so‘rovidagi joy egalariga bog‘laydi. Joy egalari (?) bajarilish vaqtida o‘zgaruvchilarda saqlangan haqiqiy qiymatlar bilan almashtiriladi. "sss" argumenti har bir parametrning ma’lumot turini ko‘rsatadi. s belgisi MySQL’ga parametrning string ekanligini bildiradi. Bunday belgini HAR BIR parametr uchun ko‘rsatishimiz kerak. MySQL’ga qanday turdagi ma’lumot kutish kerakligini aytib, biz SQL injection xavfini kamaytiramiz:
$stmt->bind_param("sss", $firstname, $lastname, $email);
Tur argumenti to‘rt turdan biri bo‘lishi mumkin:
- i - integer (whole number)
- d - double (floating point number)
- s - string (text)
- b - binary (image, PDF, etc.)
Eslatma: Agar biz tashqi manbalardan ma’lumotlarni kiritmoqchi bo‘lsak (foydalanuvchi kiritishi kabi), ma’lumotlarning tozalanganligi va tasdiqlanganligi juda muhim.
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
