English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

دليل PHP الأساسي

دليل PHP المتقدم

PHP & MySQL

دليل PHP

تعليمة مسبقة MySQL PHP

في هذا الدليل، ستتعلم كيفية استخدام جمل التحضير باستخدام PHP في MySQL.

ما هو جملة التحضير

الجملة المسبقة التحضير (أو الجملة المعيارية) هي نموذج استعلام SQL يحتوي على علامات التبديل بدلاً من القيم الفعلية للمعلمات. عند تنفيذ الجملة، يتم استبدال هذه العلامات بالقيم الفعلية.

MySQLi يدعم استخدام العلامات الموضعية المجهولة (؟)، مثل ما يلي:

INSERT INTO persons (first_name, last_name, email) VALUES (?, ?, ?);

PDO دعمه العلامات الموضعية المجهولة (؟) والعلامات الموضعية المسمى. تبدأ العلامات الموضعية المسمى بمحرف التعريف (:)، ثم يتبعها المفرد، مثل ما يلي:

INSERT INTO persons (first_name, last_name, email)
VALUES (:first_name, :last_name, :email);

يتم تنفيذ جمل المعالجة المسبقة في مرحلتين: التحضير والتنفيذ.

  • تحضير - في مرحلة التحضير، يتم إنشاء قالب جملة SQL ويتم إرساله إلى خادم قاعدة البيانات. يفحص الخادم قالب الاستعلام، يقوم بتحليل الجملة والتحسين، وينظمها للاستخدام في المستقبل.

  • تنفيذ - يتم إرسال قيم المعلمات إلى الخادم أثناء التنفيذ. يخلق الخادم جملة من قالب الاستعلام و هذه القيم لتنفيذها.

تعد جمل المعالجة المسبقة مفيدة جدًا، خاصة عندما تستخدم قيمًا مختلفة (مثل سلسلة من الجمل) لتكرار تنفيذ جملة INSERT معينة عدة مرات. يصف هذا الجزء بعض الفوائد الرئيسية لاستخدامها.

فوائد استخدام جمل المعالجة المسبقة

يمكن تنفيذ جملة معالجة مسبقة مرة أخرى بكفاءة، لأنها يتم تحليلها مرة واحدة فقط، ولكن يمكن تنفيذها عدة مرات. ويمكن أن تقلل أيضًا من استخدام النطاق الترددي إلى أقصى حد، لأنها تحتاج إلى نقل فقط قيم المعلمات إلى خادم قاعدة البيانات بدلاً من نقل جملة SQL كاملة.

تقدم جمل المعالجة المسبقة حماية قوية ضدتسريب SQL، لأن قيم المعلمات ليست مدمجة مباشرة في نص استعلام SQL. يتم إرسال قيم المعلمات مع استعلامات مختلفة إلى خادم قاعدة البيانات، مما لا يؤثر عليها. بعد تحليل قالب الاستعلام، يستخدم الخادم هذه القيم مباشرة أثناء التنفيذ. هذا هو السبب في أن جمل المعالجة المسبقة أقل عرضة للخطأ، وهي واحدة من العناصر الأكثر أهمية في أمان قاعدة البيانات.

هذا المثال سيوضح لك كيف تعمل جملة المعالجة المسبقة في الواقع:

مثال: الطريقة الموجهة للمفهوم

<?php
/* محاولة اتصال بخادم MySQL. افترض أنك تشغل MySQL.
خادم بتنظيمات افتراضية (مستخدم بدون كلمة مرور "root") */
$link = mysqli_connect("localhost", "root", "", "demo");
 
//تحقق من الاتصال
if($link === false){
    die("خطأ: لا يمكن الاتصال. " . mysqli_connect_error());
}
 
// استخدام جملة المعالجة المسبقة
$sql = "INSERT INTO persons (first_name, last_name, email) VALUES (?, ?, ?)";
 
if($stmt = mysqli_prepare($link, $sql)){
    //تقييد المتغيرات كمعلمات إلى الاستعلام المعالج مسبقًا
    mysqli_stmt_bind_param($stmt, "sss", $first_name, $last_name, $email);
    
    /* تعيين قيم المعلمات وإجراء, هذه الجملة تدرج سطرًا آخر. */
    $first_name = "Hermione";
    $last_name = "Granger";
    $email = "[email protected]";
    mysqli_stmt_execute($stmt);
    
    /* تعيين قيم المعلمات وإجراء إدراج سطر آخر. */
    $first_name = "Ron";
    $last_name = "Weasley";
    $email = "[email protected]";
    mysqli_stmt_execute($stmt);
    
    echo "تم إدخال السجل بنجاح.";
}
    echo "خطأ: لا يمكن إعداد الاستعلام: $sql. " . mysqli_error($link);
}
 
//إغلاق الجملة
mysqli_stmt_close($stmt);
 
//إغلاق الاتصال
mysqli_close($link);
?>

مثال: الطريقة الموجهة للأ�체ة

<?php
/* محاولة اتصال بخادم MySQL. افترض أنك تشغل MySQL.
خادم بتنظيمات افتراضية (مستخدم بدون كلمة مرور "root") */
$mysqli = new mysqli("localhost", "root", "", "demo");
 
//تحقق من الاتصال
if($mysqli === false){
    die("خطأ: لا يمكن الاتصال. " . $mysqli->connect_error);
}
 
//استخدام جملة معالجة مسبقة.
$sql = "INSERT INTO persons (first_name, last_name, email) VALUES (?, ?, ?)";
 
if($stmt = $mysqli->prepare($sql)){
    //تعيين المتغيرات كمعلمات وربطها بجملة معالجة مسبقة.
    $stmt->bind_param("sss", $first_name, $last_name, $email);
    
    /* تعيين قيم المعلمات وإجراء. */
    تنفيذ الجملة مرة أخرى لإضافة سطر آخر
    $first_name = "Hermione";
    $last_name = "Granger";
    $email = "[email protected]";
    $stmt->execute();
    
    تعليمات إعداد القيم والتنفيذ
        تعليمات إدخال السطر للاضافة
    $first_name = "Ron";
    $last_name = "Weasley";
    $email = "[email protected]";
    $stmt->execute();
    
    echo "تم إدراج السجل بنجاح.";
}
    echo "خطأ: لا يمكن إعداد الاستعلام: $sql. " . $mysqli->error;
}
 
//إغلاق الجملة
$stmt->close();
 
//إغلاق الاتصال
$mysqli->close();
?>

مثال: طريقة PDO

<?php
/* محاولة اتصال بخادم MySQL. افترض أنك تشغل MySQL.
خادم بتنظيمات افتراضية (مستخدم بدون كلمة مرور "root") */
try{
    $pdo = new PDO("mysql:host=localhost;dbname=demo", "root", "");
    //将PDO错误模式设置为异常
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e){
    die("خطأ: لا يمكن الاتصال. " . $e->getMessage());
}
 
// محاولة تنفيذ استعلام الإدراج
try{
    // استخدام جملة المعالجة المسبقة
    $sql = "INSERT INTO persons (first_name, last_name, email) VALUES (:first_name, :last_name, :email)";
    $stmt = $pdo->prepare($sql);
    
    //将参数绑定到语句
    $stmt->bindParam(':first_name', $first_name, PDO::PARAM_STR);
    $stmt->bindParam(':last_name', $last_name, PDO::PARAM_STR);
    $stmt->bindParam(':email', $email, PDO::PARAM_STR);
    
    تعليمات إعداد القيم والتنفيذ,
      تنفيذ الجملة مرة أخرى لإضافة سطر آخر
    $first_name = "Hermione";
    $last_name = "Granger";
    $email = "[email protected]";
    $stmt->execute();
    
    تعليمات إعداد القيم والتنفيذ
        تعليمات إدخال السطر للاضافة
    $first_name = "Ron";
    $last_name = "Weasley";
    $email = "[email protected]";
    $stmt->execute();
    
    echo "تم إدخال السجل بنجاح.";
} catch(PDOException $e){
    die("خطأ: لا يمكن إعداد/تنفيذ الاستعلام: $sql. $e->getMessage());
}
 
//إغلاق الجملة
unset($stmt);
 
//إغلاق الاتصال
unset($pdo);
?>

كما ترون في المثال أعلاه، قمنا بإعداد جملة INSERT مرة واحدة فقط، ولكن قمنا بتشغيل الجملة عدة مرات من خلال تمرير مجموعات مختلفة من المعلمات.

استخدام الكود (نمط البرنامج)

في جملة INSERT SQL المثال المقدم، يتم استخدام علامة الاستفهام كـاسم الشخص،اسم العائلةوالبريد الإلكترونيعلامة استبدال قيمة الحقل

يقوم الدالة mysqli_stmt_bind_param() بتحديد المتغيرات المرتبطة بالعلامات الموضحة في نموذج جملة SQL. يتم استبدال العلامات الموضحة (؟) بالقيم الفعلية التي يحتوي عليها المتغيرات عند التنفيذ. يتم تقديم تعريف النوع كثاني متغير يتم تقديمه، وهو سلسلة "sss" تقوم بتحديد نوع كل متغير مرتبط كـ string (النص).

تعريف النوع للسلسلة يحدد نوع البيانات المطلوب لكل متغير مرتبط، ويكون لديه الأنواع التالية أربعة:

  • i - integer (عدد كامل)

  • d - double (دوبريوس)

  • s - السلسلة (النص)

  • b - BLOB (binary large object: كائن كبير ثنائي)

يجب أن تتطابق عدد المدخلات في تعريف النوع للسلسلة من عدد العلامات الموضحة في نموذج جملة SQL.

استخدام المدخلات المكتسبة من النموذج عبر الإنترنت

إذا كنت تتذكر الفصل السابق، قمنا بإنشاء نموذج HTML لـإضافة البيانات إلى قاعدة البياناتفي هذا المكان، سنوسع المثال من خلال تنفيذ الجملة المعدلة. يمكنك استخدام نفس نموذج HTML للتحقق من نموذج الإدخال التالي، ولكن تأكد فقط من أن action في خصائص النموذج يستخدم اسم الملف الصحيح.

هذا هو كود PHP المعدل للاضافة البيانات. إذا نظرت بعناية إلى المثال، ستلاحظ أننا لم نستخدم mysqli_real_escape_string() كما في مثال الفصل السابق. بسبب أن المدخلات المستخدمة في الجملة المعدلة لا يتم استبدالها مباشرة بالجملة الاستعلامية، لذا لا تحتاج إلى تحويلها بشكل صحيح.

مثال: الطريقة الموجهة للمفهوم

<?php
/* محاولة اتصال بخادم MySQL. افترض أنك تشغل MySQL.
خادم بتنظيمات افتراضية (مستخدم بدون كلمة مرور "root") */
$link = mysqli_connect("localhost", "root", "", "demo");
 
//تحقق من الاتصال
if($link === false){
    die("خطأ: لا يمكن الاتصال. " . mysqli_connect_error());
}
 
// استخدام جملة المعالجة المسبقة
$sql = "INSERT INTO persons (first_name, last_name, email) VALUES (?, ?, ?)";
 
if($stmt = mysqli_prepare($link, $sql)){
    //تقييد المتغيرات إلى الجملة المعالجة مسبقًا كمعلمات
    mysqli_stmt_bind_param($stmt, "sss", $first_name, $last_name, $email);
    
    //ضبط المعلمات
    $first_name = $_REQUEST['first_name'];
    $last_name = $_REQUEST['last_name'];
    $email = $_REQUEST['email'];
    
    //حاول تنفيذ الاستعلام المعالج مسبقًا
    if(mysqli_stmt_execute($stmt)){
        echo "تم إدخال السجل بنجاح.";
    }
        echo "خطأ: لا يمكن تنفيذ الاستعلام: $sql." . mysqli_error($link);
    }
}
    echo "خطأ: لا يمكن تنفيذ الاستعلام: $sql." . mysqli_error($link);
}
 
//إغلاق الجملة
mysqli_stmt_close($stmt);
 
//إغلاق الاتصال
mysqli_close($link);
?>

مثال: الطريقة الموجهة للأ�체ة

<?php
/* محاولة اتصال بخادم MySQL. افترض أنك تشغل MySQL.
خادم بتنظيمات افتراضية (مستخدم بدون كلمة مرور "root") */
$mysqli = new mysqli("localhost", "root", "", "demo");
 
//تحقق من الاتصال
if($mysqli === false){
    die("خطأ: لا يمكن الاتصال. " . $mysqli->connect_error);
}
 
// استخدام جملة المعالجة المسبقة
$sql = "INSERT INTO persons (first_name, last_name, email) VALUES (?, ?, ?)";
 
if($stmt = $mysqli->prepare($sql)){
    //تقييد المتغيرات كمعلمات إلى الاستعلام المعالج مسبقًا
    $stmt->bind_param("sss", $first_name, $last_name, $email);
    
    //ضبط المعلمات
    $first_name = $_REQUEST['first_name'];
    $last_name = $_REQUEST['last_name'];
    $email = $_REQUEST['email'];
    
    //حاول تنفيذ الاستعلام المعالج مسبقًا
    if($stmt->execute()){
        echo "تم إدخال السجل بنجاح.";
    }
        echo "خطأ: لا يمكن تنفيذ الاستعلام: $sql." . $mysqli->error;
    }
}
    echo "خطأ: لا يمكن تنفيذ الاستعلام: $sql." . $mysqli->error;
}
 
//إغلاق الجملة
$stmt->close();
 
//إغلاق الاتصال
$mysqli->close();
?>

مثال: طريقة PDO

<?php
/* محاولة اتصال بخادم MySQL. افترض أنك تشغل MySQL.
خادم بتنظيمات افتراضية (مستخدم بدون كلمة مرور "root") */
try{
    $pdo = new PDO("mysql:host=localhost;dbname=demo", "root", "");
    // ضبط نمط الأخطاء PDO على استثنائية
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e){
    die("خطأ: لا يمكن الاتصال. " . $e->getMessage());
}
 
// محاولة تنفيذ استعلام الإدراج
try{
    // استخدام جملة المعالجة المسبقة
    $sql = "INSERT INTO persons (first_name, last_name, email) VALUES (:first_name, :last_name, :email)";
    $stmt = $pdo->prepare($sql);
    
    // ربط المعلمات إلى الجملة
    $stmt->bindParam(':first_name', $_REQUEST['first_name'], PDO::PARAM_STR);
    $stmt->bindParam(':last_name', $_REQUEST['last_name'], PDO::PARAM_STR);
    $stmt->bindParam(':email', $_REQUEST['email'], PDO::PARAM_STR);
    
    // تنفيذ جملة المعالجة المسبقة
    $stmt->execute();
    echo "تم إدخال السجل بنجاح.";
} catch(PDOException $e){
    die("خطأ: لا يمكن إعداد/تنفيذ الاستعلام $sql. " . $e->getMessage());
}
 
//إغلاق الجملة
unset($stmt);
 
//إغلاق الاتصال
unset($pdo);
?>

ملاحظة:على الرغم من أن ليس من الضروري التحقق من إدخال المستخدم في جملة المعالجة المسبقة، يجب عليك دائمًا التحقق من نوع وحجم البيانات المُستلمة من المصادر الخارجية، وتنفيذ القيود المناسبة لحماية موارد النظام.