آموزش استفاده از دستورات آماده در MySQL


آموزش استفاده از دستورات آماده (Prepared) در SQL :

دستورات آماده در SQL یا Preapared statement راه حلی بسیار مطمئن برای جلوگیری از حملات اسکریپتی SQL injection و طراحی سریع کدهای برنامه هستند. در این درس به آموزش کار با دستورات آماده یا Prepared statement در MySQL خواهیم پرداخت.

معرفی دستورات آماده (Prepared statements) و پارامترهای متصل (Bound Parameters) :

یک دستور آماده SQL یا Prepared statement قابلیتی است که به وسیله آن می توان یک دستور یکسان SQL یا دستوری مشابه آن را به صورت مکرر و با تاثیرگذاری بالا اجرا کرد.
دستورات آماده Prepared statement SQL به صورت کلی با روش زیر عمل می کنند :
1- آماده سازی اولیه (Prapare) دستور : یک الگو برای دستور SQL مورد نظر ایجاد شده و به پایگاه داده ارسال می شود. مقادیر مشخصی به صورت تعیین نشده در دستور باقی می مانند که به آن ها پارامتر گفته و با نماد ؟ در کد SQL جایگزین می شوند. برای مثال، الگویی همانند کد زیر برای یک دستور درج اطلاعات ایجاد می شود :

                      INSERT INTO MyGuests VALUES(?, ?, ?)                  

2- پایگاه داده الگوی دستوری SQL را خوانده و اجرا می کند. همچنین با استفاده از قابلیت بهینه سازی query یا query optimization سریع ترین راه را برای اجرای آن مشخص می کند. در انتها نتایج حاصل از query را بدون اجرای نهایی در حافظه نگهداری می کند.

3- مرحله سوم اجرا (Excute) : در مرحله آخر، برنامه مقادیر (values) را به پارامترها ارسال کرده و پایگاه داده دستور SQL را به صورت کامل اجرا می کند. برنامه می تواند یک دستور واحد SQL را با مقادیر مختلف، هر چند بار که نیاز داشته باشد اجرا کرده و خروجی های مختلف تولید کند. در مقایسه با اجرای مستقیم دستورات SQL، استفاده از الگوهای آماده SQL دو مزیت عمده دارد :

  • دستورات آماده Prepared statement SQL زمان اجرای کدهای برنامه را به دلیل آماده سازی query قبل از اجرا، کاهش می دهند (حتی با وجود این که دستورات مهم است چندین بار اجرا شوند).
  • استفاده از پارامترها، حجم اطلاعات ارسالی به سرور را بسیار کاهش می دهند، زیرا در هر بار اجرای query فقط کافی است مقادیر جدید پارامترها را ارسال کنید نه کل دستور query را.
  • دستورات اماده SQL روش بسیار موثری جهت مقابله با حملات اسکریپتی SQL injection هستند. زیرا مقادیر پارامترها بعدا و توسط یک پروتکل متفاوت به سرور ارسال شده و از حملات SQL جلوگیری می کنند.

آموزش کار با دستورات آماده SQL در MySQLi :

کد مثال عملی زیر از دستورات آماده و پارامترهای متصل در MySQLi استفاده می کند :

  <?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);  }  // prepare and bind  $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");  $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";  $stmt->close();  $conn->close();  ?>                  

در ادامه به توضیح برخی از کدهای مثال فوق می پردازیم :

  "INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)"                  

در دستور SQL فوق، از کاراکتر ؟ برای تعیین محل قرارگیری یک متغیر، استفاده کرده ایم. به عبارت دیگر به ازای هر ؟ در دستور فوق، یک متغیر رشته ای، عددی، اعشاری و … قرار گیرد.
سپس به کد تابع bind_param() دقت کنید :

  $stmt->bind_param("sss", $firstname, $lastname, $email);                  

تابع bind_param() پارامترها و مقادیرشان را به SQL query ارسال می کند. پارامتر “sss” نیز لیست انواع داده ای پارامترها را به ترتیب مشخص می مند. کاراکتر “s” در پارامتر فوق به mysal اعلام می کند که پارامتر مورد نظر از نوع رشته ای یا string است. کاراکتر این پارامتر می تواند مخفف یکی از مقادیر زیر باشد :

  • i : عددی یا integer.
  • d : اعشاری یا double.
  • s : رشته ای یا string.
  • b : عددی بزرگ یا Binary large object.

در کد فوق، بایستی نوع داده ای پارامتر را با یکی از کاراکترهای اختصاری تعیین کنید.
همچنین با تعیین تنوع داده ای پارامتر، ریسک حملات اسکریپتی SQL injection را کاهش می دهید.

نکته :

اگر می خواهید مقادیر را از تابع خارجی مثل داده های ورودی کاربر ارسال کنید، بایستی آن ها را حتما اعتبارسنجی و پاکسازی کنید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *