دستورات آماده (MySQL Prepared)
«دستور آماده (Prepared Statement)» یعنی قالب SQL را از قبل بسازیم. سپس فقط مقادیر را جداگانه بفرستیم. این روش سریع تر است و جلوی «تزریق SQL (SQL Injection)» را می گیرد.
ایده کلی و مزایا
اول قالب SQL ساخته می شود. سپس دیتابیس آن را تحلیل و بهینه می کند. بعد، برنامه مقادیر را وصل می کند و اجرا می شود. چون فقط مقادیر می روند، ریسک تزریق کمتر می شود.
- آماده سازی یک بار انجام می شود؛ اجرا چندبار ممکن است.
- ارسال داده کمتر است؛ فقط پارامترها می روند.
- ایمن تر در برابر تزریق SQL است.
پارامترهای بسته شده (Bound Parameters)
در MySQLi از bind_param استفاده می کنیم. نوع ها: i=عدد صحیح، d=اعشاری، s=رشته، b=BLOB. برای هر ? باید یک نوع بدهیم.
MySQLi با Prepared Statements
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);
$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";
$stmt->close();
$conn->close();
?>
PDO با Prepared و bindParam
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDBPDO";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (:firstname, :lastname, :email)");
$stmt->bindParam(':firstname', $firstname);
$stmt->bindParam(':lastname', $lastname);
$stmt->bindParam(':email', $email);
$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";
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
$conn = null;
?>
گام های عملی امن سازی
- قالب SQL را با ? آماده کن.
- نوع پارامترها را دقیق مشخص کن.
- مقادیر را ببند و اجرا کن.
نکته: ورودی بیرونی را حتماً «اعتبارسنجی (Validation)» و «بهداشتی سازی (Sanitize)» کن.
منابع و ادامه مسیر
- درج داده را مرور کن.
- درج چندتایی را تمرین کن.
- کوئری Select را بعداً یاد بگیر.
جمع بندی سریع
- Prepared سریع و کم ریسک است.
- پارامترها را همیشه Bind کن.
- نوع هر پارامتر را درست بده.
- ورودی ها را بررسی و پاکسازی کن.