PHP – استفاده از Prepared Statements در MySQL
Prepared Statements یا عبارات آماده یکی از تکنیکهای کلیدی در PHP و MySQL برای جلوگیری از حملات SQL Injection و بهبود عملکرد اجرای کوئریهای پایگاه داده هستند. در این روش، یک قالب کوئری آماده شده و پارامترهای آن بعداً با مقادیر واقعی پر میشوند.
مزایای Prepared Statements:
- کاهش زمان تجزیه: آمادهسازی یک کوئری تنها یک بار انجام میشود، حتی اگر کوئری چندین بار اجرا شود.
- کاهش پهنای باند: تنها پارامترها به سرور ارسال میشوند، نه کل کوئری.
- پیشگیری از SQL Injection: از آنجایی که مقادیر پارامترها از کوئری جدا هستند و در یک پروتکل مختلف ارسال میشوند، احتمال آسیبپذیری در برابر SQL Injection به حداقل میرسد.
استفاده از Prepared Statements در MySQLi
مثال (MySQLi با Prepared Statements)
در این مثال، از MySQLi برای درج چندین رکورد به جدول “MyGuests” با استفاده از Prepared Statements استفاده میکنیم:
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
// ایجاد اتصال
$conn = new mysqli($servername, $username, $password, $dbname);
// بررسی اتصال
if ($conn->connect_error) {
die("اتصال ناموفق: " . $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 "رکوردهای جدید با موفقیت ایجاد شدند";
$stmt->close();
$conn->close();
?>
توضیحات کد:
prepare()
: کوئری SQL را آماده میکند.bind_param()
: پارامترها را به کوئری متصل میکند و نوع دادهها را مشخص میکند.i
برای اعداد صحیح (integer)d
برای اعداد اعشاری (double)s
برای رشتهها (string)b
برای BLOBs
استفاده از Prepared Statements در PDO
مثال (PDO با Prepared Statements)
در این مثال، از PDO برای درج چندین رکورد به جدول “MyGuests” با استفاده از Prepared Statements استفاده میکنیم:
<?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);
// آمادهسازی SQL و بایند کردن پارامترها
$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 "رکوردهای جدید با موفقیت ایجاد شدند";
} catch(PDOException $e) {
echo "خطا: " . $e->getMessage();
}
$conn = null;
?>
توضیحات کد:
prepare()
: کوئری SQL را آماده میکند.bindParam()
: پارامترها را به کوئری متصل میکند و نامهای پارامترها را مشخص میکند.execute()
: کوئری را با مقادیر پارامترها اجرا میکند.
جمعبندی
استفاده از Prepared Statements در PHP به کمک MySQLi یا PDO به شما این امکان را میدهد که از حملات SQL Injection جلوگیری کنید و بهینهسازیهای زیادی در عملکرد پایگاه داده انجام دهید. با این روش، کوئریها به صورت امن و سریعتری اجرا میشوند و مدیریت دادهها به مراتب سادهتر میشود.
برای ارسال نظر لطفا ابتدا وارد حساب کاربری خود شوید. صفحه ورود و ثبت نام