تدعم العديد من قواعد البيانات الأكثر نضجًا مفهوم البيانات المعدة.
ما هي البيانات المعدة؟ فكر في الأمر كقالب مجمع لـ SQL الذي تريد تشغيله، والذي يمكن تخصيصه باستخدام معلمات متغيرة. يمكن أن تحقق البيانات المعدة فائدتين رئيسيتين:
يحتاج الاستعلام إلى التحليل (أو المعالجة المسبقة) مرة واحدة فقط، ولكن يمكن تنفيذه عدة مرات باستخدام نفس المعلمات أو معلمات مختلفة. عندما يكون الاستعلام جاهزًا، تقوم قاعدة البيانات بتحليل وتجميع وتحسين خطة تنفيذ الاستعلام. تستغرق هذه العملية وقتًا أطول بالنسبة للاستعلامات المعقدة ويمكن أن تبطئ تطبيقك بشكل كبير إذا كان من الضروري تكرار نفس الاستعلام عدة مرات باستخدام معلمات مختلفة. باستخدام البيانات المعدة، يمكنك تجنب دورات التحليل/التجميع/التحسين المتكررة. ببساطة، تستخدم البيانات المعدة موارد أقل وبالتالي تعمل بشكل أسرع.
لا يلزم وضع المعلمات المقدمة للبيانات المعدة بين علامتي اقتباس؛ حيث يقوم برنامج التشغيل بمعالجة ذلك تلقائيًا. إذا كان تطبيقك يستخدم البيانات المعدة فقط، فيمكنك التأكد من عدم حدوث حقن SQL. (ومع ذلك، إذا تم إنشاء أجزاء أخرى من الاستعلام من مدخلات غير قابلة للإلغاء، فلا يزال هناك خطر إدخال SQL).
تعد البيانات المعدة مفيدة جدًا لدرجة أن ميزتها الوحيدة هي أن شركة PDO ستقوم بمحاكاة المعالجة عندما لا يدعمها برنامج التشغيل. وهذا يضمن إمكانية استخدام التطبيقات لنفس نمط الوصول إلى البيانات بغض النظر عما إذا كانت قاعدة البيانات تتمتع بهذه الإمكانات أم لا.
ينفذ المثال التالي استعلام إدراج عن طريق استبدال العناصر النائبة المسماة المقابلة بالاسم والقيمة.
<?php$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");$stmt->bindParam(':name', $name);$stmt- >bindParam(':value', $value);// أدخل صف $name = 'one';$value = 1;$stmt->execute();// أدخل صفًا آخر بقيم مختلفة $name = 'two';$value = 2;$stmt->execute();?>
ينفذ المثال التالي استعلام إدراج عن طريق استبدال العنصر النائب بالاسم والقيمة.
<?php$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");$stmt->bindParam(1, $name);$stmt->bindParam(2, $value);// أدخل صف $name = 'one';$value = 1;$stmt->execute();// أدخل صفًا آخر بقيم مختلفة $name = 'two';$value = 2;$stmt->execute();?>
يحصل المثال التالي على البيانات بناءً على قيمة المفتاح في النموذج المقدم. يتم نقل مدخلات المستخدم تلقائيًا، لذلك لا يوجد خطر من هجمات حقن SQL.
<?php$stmt = $dbh->prepare("SELECT * FROM REGISTRY Where name = ؟");if ($stmt->execute(array($_GET['name']))) { while ($row = $stmt->fetch()) { print_r($row);
إذا كان برنامج تشغيل قاعدة البيانات يدعمه، فيمكن للتطبيق أيضًا ربط معلمات الإخراج والإدخال. غالبًا ما تستخدم معلمات الإخراج للحصول على القيم من الإجراءات المخزنة. تعتبر معلمات الإخراج أكثر تعقيدًا قليلاً في الاستخدام من معلمات الإدخال لأنه عند ربط معلمة إخراج، يجب أن تعرف طول المعلمة المحددة. إذا كانت القيمة المرتبطة بمعلمة أكبر من الطول الموصى به، فسيتم إنشاء خطأ.
<?php$stmt = $dbh->prepare("CALL sp_returns_string(?)");$stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000); // استدعاء الإجراء المخزن $stmt-> تنفيذ ()؛طباعة "تم إرجاع الإجراء $return_valuen";?>
يمكنك أيضًا تحديد المعلمات التي تحتوي على قيم الإدخال والإخراج، مع بناء جملة مشابه لمعلمات الإخراج. في المثال التالي، يتم تمرير السلسلة "hello" إلى الإجراء المخزن، وعندما يعود الإجراء المخزن، يتم استبدال hello بالقيمة التي يتم إرجاعها بواسطة الإجراء المخزن.
<?php$stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)");$value = 'hello';$stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000 ); // استدعاء الإجراء المخزن $stmt->execute();print "procedure return $القيمةn";?>
<?php$stmt = $dbh->prepare("SELECT * FROM REGISTRY حيث الاسم LIKE '%?%'");$stmt->execute(array($_GET['name']));// رمز العنصر النائب يجب استخدامه خلال القيمة $stmt = $dbh->prepare("SELECT * FROM REGISTRY حيث الاسم LIKE) ؟");$stmt->execute(array("%$_GET[name]%"));?>