البيانات المعدة مفيدة جدا ضد حقن SQL.
تحضير بيانات ومعلمات منضم
وجاء في بيان معدة ميزة تستخدم لتنفيذ نفس (or similar) البيانات SQL مرارا وتكرارا مع كفاءة عالية.
بيانات معدة تعمل في الأساس من هذا القبيل:
- التحضير: يتم إنشاء قالب بيان SQL وإرسالها إلى قاعدة البيانات. يتم ترك بعض القيم غير محدد، ودعا المعلمات (labeled "?") . على سبيل المثال: INSERT INTO MyGuests VALUES(?, ?, ?)
- بتوزيع قاعدة البيانات، يجمع، ويؤدي إلى الحد الأمثل الاستعلام على قالب بيان SQL، ويخزن نتيجة دون تنفيذه
- تنفيذ: وفي وقت لاحق، وتطبيق يربط القيم إلى المعلمات، وتنفيذ قاعدة البيانات البيان. قد تنفيذ تطبيق البيان عدة مرات كما انها تريد مع قيم مختلفة
بالمقارنة مع تنفيذ عبارات SQL مباشرة، البيانات المعدة واثنين من المزايا الرئيسية:
- البيانات المعدة يقلل من وقت التوزيع كما يتم التحضير على الاستعلام مرة واحدة فقط (although the statement is executed multiple times)
- المعلمات ملزمة تقليل عرض النطاق الترددي لخادم ما تحتاج إليه فقط إرسال المعلمات في كل مرة، وليس الاستعلام كله
- البيانات المعدة مفيدة جدا ضد حقن SQL، لأن قيم المعلمة، التي تنتقل في وقت لاحق باستخدام بروتوكول آخر، ليس من الضروري أن هرب بشكل صحيح. إذا لم يتم اشتقاق قالب بيان الأصلي من المدخلات الخارجية، لا يمكن أن يحدث حقن SQL.
القوائم المعدة في MySQLi
يستخدم المثال التالي البيانات المعدة والمعلمات المربوطة في MySQLi:
مثال (MySQLi with Prepared Statements)
<?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 = "[email protected]";
$stmt->execute();
$firstname
= "Mary";
$lastname = "Moe";
$email = "[email protected]";
$stmt->execute();
$firstname = "Julie";
$lastname = "Dooley";
$email = "[email protected]";
$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);
هذه الوظيفة تلزم المعلمات إلى استعلام SQL ويروي قاعدة بيانات ما هي المعلمات. في "sss" تسرد حجة أنواع البيانات التي المعلمات. الحرف الصورة يقول الخلية أن المعلمة هي سلسلة.
قد تكون وسيطة واحدة من أربعة أنواع:
- ط - صحيح
- د - مزدوج
- الصورة - سلسلة
- ب - BLOB
يجب أن لدينا واحدة من هذه لكل معلمة.
بقوله الخلية نوع البيانات يمكن توقعه، ونحن لحد من مخاطر حقن SQL.
ملاحظة: إذا أردنا أن إدراج أي بيانات من مصادر خارجية (like user input) ، من المهم جدا أن البيانات تطهير والتحقق من صحتها.
تحضير بيانات في شركة تنمية نفط عمان
يستخدم المثال التالي البيانات المعدة والمعلمات المربوطة في شركة تنمية نفط عمان:
مثال (PDO with Prepared Statements)
<?php
$servername = "localhost";
$username = "username";
$password =
"password";
$dbname =
"myDBPDO";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname",
$username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
// prepare sql and bind
parameters
$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);
// insert a row
$firstname =
"John";
$lastname = "Doe";
$email = "[email protected]";
$stmt->execute();
// insert another row
$firstname = "Mary";
$lastname = "Moe";
$email = "[email protected]";
$stmt->execute();
// insert another row
$firstname = "Julie";
$lastname = "Dooley";
$email = "[email protected]";
$stmt->execute();
echo "New records created successfully";
}
catch(PDOException $e)
{
echo "Error: " . $e->getMessage();
}
$conn = null;
?>