دروس PHP Ajax مع مثال

⚡ ملخص ذكي

تتيح تقنية Ajax في PHP لصفحة الويب تبادل كميات صغيرة من البيانات مع الخادم وتحديث جزء من الصفحة دون إعادة تحميلها بالكامل. يشرح هذا الدليل كيفية إنشاء بحث مباشر باستخدام إطار عمل، موضحًا أسلوب XMLHttpRequest التقليدي وبديله الحديث Fetch API.

  • 🔄 ما هو أجاكس؟ أجاكس، غير متزامن Javaيقوم البرنامج النصي و XML بتحديث جزء من الصفحة عن طريق تبادل البيانات مع الخادم دون الحاجة إلى تحديث كامل.
  • ⚡ لماذا استخدامه: توفر تقنية Ajax ميزات غنية تشبه ميزات سطح المكتب مثل الإكمال التلقائي والتحقق المباشر والقوائم المنسدلة التابعة.
  • 🖥️ العميل والخادم: Javaيتم تشغيل البرنامج النصي في المتصفح ويستدعي برنامج PHP النصي، الذي يعيد البيانات اللازمة فقط لتحديث الصفحة.
  • 🔍 بحث حي: يقوم معالج حدث onkeyup بإرسال كل ضغطة مفتاح إلى برنامج نصي PHP يقوم بإرجاع أسماء الأطر المطابقة على الفور.
  • 📜 XMLHttpRequest: يقوم الأسلوب الكلاسيكي بإنشاء كائن XMLHttpRequest وقراءة responseText عند اكتمال الطلب.
  • 🆕 واجهة برمجة تطبيقات الجلب: يستبدل الكود الحديث XMLHttpRequest بوظيفة الجلب القائمة على الوعود للحصول على طلبات أنظف وأكثر قابلية للقراءة.
  • 🤖 مساعدة الذكاء الاصطناعي: يمكن لأدوات الذكاء الاصطناعي تحويل كود XMLHttpRequest القديم إلى fetch أو axios والمساعدة في تصحيح أخطاء طلبات Ajax الفاشلة.

PHP Ajax

ما هو اياكس؟

AJAX يشير إلى غير متزامن Javaسيناريو وXML. إنها تقنية تقلل التفاعلات بين الخادم والعميل. ويتم ذلك عن طريق تحديث جزء فقط من صفحة الويب بدلاً من الصفحة بأكملها. تبدأ التفاعلات غير المتزامنة بواسطة Javaالنص البرمجي. الغرض من AJAX هو تبادل كميات صغيرة من البيانات مع الخادم دون إعادة تحميل الصفحة.

Javaسيناريو هي لغة برمجة نصية من جانب العميل. يتم تنفيذها على جانب العميل بواسطة متصفحات الويب التي تدعم Javaالنصي. Javaيعمل كود البرنامج النصي فقط في المتصفحات التي تحتوي على Javaتم تمكين البرنامج النصي.

XML XML هو اختصار لـ Extensible Markup Language (لغة الترميز القابلة للتوسيع). تُستخدم هذه اللغة لترميز الرسائل بصيغ قابلة للقراءة البشرية والآلية. وهي تشبه لغة HTML، ولكنها تتيح لك إنشاء علامات مخصصة. لمزيد من التفاصيل حول XML، راجع المقالة على XML.

لماذا استخدام أجاكس؟

  • يسمح بالتطويرping تطبيقات ويب تفاعلية غنية تمامًا مثل تطبيقات سطح المكتب.
  • يمكن إجراء التحقق من صحة البيانات أثناء قيام المستخدم بتعبئة النموذج دون إرساله. ويمكن تحقيق ذلك باستخدام خاصية الإكمال التلقائي. تُرسل الكلمات التي يكتبها المستخدم إلى الخادم للمعالجة، ويستجيب الخادم بكلمات مفتاحية مطابقة لما أدخله المستخدم.
  • يمكن استخدامه لملء مربع منسدل بناءً على قيمة مربع منسدل آخر.
  • يمكن استرجاع البيانات من الخادم وتحديث جزء معين فقط من الصفحة دون تحميل الصفحة بأكملها. وهذا مفيد جدًا لأجزاء صفحات الويب التي تقوم بتحميل عناصر مثل:
    • تويت
    • التعليقات
    • المستخدمون الذين يزورون الموقع، وبيانات حية مماثلة.

كيفية إنشاء تطبيق PHP Ajax

سنقوم بإنشاء تطبيق بسيط يسمح للمستخدمين بالبحث عن أطر عمل PHP MVC الشائعة.

سيحتوي تطبيقنا على مربع نص حيث يقوم المستخدمون بكتابة أسماء الأطر البرمجية.

سنستخدم بعد ذلك تقنية AJAX للبحث عن تطابق، ثم نعرض الاسم الكامل للإطار أسفل نموذج البحث مباشرةً.

الخطوة 1) إنشاء صفحة الفهرس

index.php

<html>

<head>

<title>PHP MVC Frameworks - Search Engine</title>

<script type="text/javascript" src="auto_complete.js"></script>

</head>

<body>

<h2>PHP MVC Frameworks - Search Engine</h2>

<p><b>Type the first letter of the PHP MVC Framework</b></p>

<form method="POST" action="index.php">

<p><input type="text" size="40" id="txtHint" onkeyup="showName(this.value)"></p>

</form>

<p>Matches: <span id="txtName"></span></p>

</body>

</html>

هنا،

  • "onkeyup="showName(this.value)"" ينفذ الأمر Javaتقوم الدالة البرمجية بعرض الاسم في كل مرة يتم فيها كتابة مفتاح في مربع النص. تُسمى هذه الميزة بالإكمال التلقائي.

الخطوة 2) إنشاء صفحة الأطر

Frameworks.php

<?php

$frameworks = array("CodeIgniter","Zend Framework","Cake PHP","Kohana") ;

$name = $_GET["name"];

if (strlen($name) > 0) {

$match = "";

for ($i = 0; $i < count($frameworks); $i++) {

if (strtolower($name) == strtolower(substr($frameworks[$i], 0, strlen($name)))) {

if ($match == "") {

$match = $frameworks[$i];

} else {

$match = $match . " , " . $frameworks[$i];

}

}

}

}

echo ($match == "") ? 'no match found' : $match;

?>

الخطوة 3) إنشاء البرنامج النصي JS

auto_Complete.js

function showName(str){

if (str.length == 0){ // exit function if nothing has been typed in the textbox

document.getElementById("txtName").innerHTML=""; // clear previous results

return;

}

if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari

xmlhttp=new XMLHttpRequest();

} else {// code for IE6, IE5

xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

}

xmlhttp.onreadystatechange=function() {

if (xmlhttp.readyState == 4 && xmlhttp.status == 200){

document.getElementById("txtName").innerHTML=xmlhttp.responseText;

}

}

xmlhttp.open("GET","frameworks.php?name="+str,true);

xmlhttp.send();

}

هنا،

  • يتحقق الشرط "if (str.length == 0)" من طول السلسلة النصية. إذا كان طولها صفرًا، فلن يتم تنفيذ باقي البرنامج النصي.
  • يستخدم متصفحا إنترنت إكسبلورر الإصدارين 5 و6 خاصية ActiveXObject لتنفيذ تقنية AJAX. أما الإصدارات والمتصفحات الأخرى مثل كروم و Firefox استخدم XMLHttpRequest. يضمن هذا الكود أن يعمل تطبيقنا في كل من متصفحي IE 5 و 6 والمتصفحات الحديثة.
  • "xmlhttp.onreadystatechange=function…" يتحقق مما إذا كان تفاعل AJAX قد اكتمل وكانت الحالة 200، ثم يقوم بتحديث نطاق txtName بالنتائج التي تم إرجاعها.

الخطوة 4) اختبار تطبيق PHP Ajax الخاص بنا

بافتراض أنك قمت بحفظ الملف index.php في phptuts/ajax، انتقل إلى URL http://localhost/phptuts/ajax/index.php

اختبار تطبيق PHP Ajax الخاص بنا

اكتب الحرف C في مربع النص. ستظهر لك النتائج التالية.

اختبار تطبيق PHP Ajax الخاص بنا

يوضح المثال أعلاه مفهوم AJAX وكيف يمكن أن يساعدنا في إنشاء تطبيقات تفاعلية غنية.

تقنية AJAX الحديثة مع واجهة برمجة تطبيقات Fetch

لا يزال كائن XMLHttpRequest المذكور أعلاه يعمل، ولكن فرع ActiveXObject الخاص به لم يعد ضروريًا في متصفح إنترنت إكسبلورر القديم. توفر المتصفحات الحديثة واجهة برمجة تطبيقات Fetch القائمة على الوعود، والتي تُجري نفس الطلب باستخدام كود أقل بكثير.

function showName(str) {
    if (str.length === 0) {
        document.getElementById("txtName").innerHTML = "";
        return;
    }
    fetch("frameworks.php?name=" + encodeURIComponent(str))
        .then(response => response.text())
        .then(text => {
            document.getElementById("txtName").innerHTML = text;
        });
}

تؤدي هذه النسخة نفس الوظيفة: فهي ترسل النص المكتوب إلى ملف frameworks.php وتضع الاستجابة في حقل txtName. كما أنها تستخدم encodeURIComponent لتشفير المدخلات بشكل آمن، ويمكن توسيع سلسلة الوعود الخاصة بها بسهولة لتشمل معالجة الأخطاء باستخدام كتلة catch.

الأسئلة الشائعة

يؤدي الطلب المتزامن إلى حظر المتصفح حتى يستجيب الخادم، مما يُجمّد الصفحة. أما الطلب غير المتزامن فيعمل في الخلفية، لذا تبقى الصفحة متجاوبة ويتم تحديثها عند وصول البيانات. يستخدم Ajax النموذج غير المتزامن.

باستخدام دالة fetch، مرر وسيطًا ثانيًا يُحدد دالة التعيين إلى طلب POST وجسم الطلب، ثم اقرأ قيمة $_POST في PHP. أما باستخدام XMLHttpRequest، فاستدعِ دالة open('POST', url)، وحدد رأس Content-Type، وأرسل البيانات المشفرة.

يمنع بروتوكول CORS (مشاركة الموارد عبر النطاقات) طلبات المتصفح إلى نطاق مختلف ما لم يرسل الخادم رأس Access-Control-Allow-Origin الصحيح. أضف هذا الرأس من جانب PHP أو استدعِ خادمًا من نفس النطاق. URL لإصلاحها.

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

نعم. شارك رمز الطلب ووحدة تحكم المتصفح أو خطأ الشبكة، وسيتمكن الذكاء الاصطناعي من اكتشاف الخطأ. URLإذا كان هناك حظر CORS أو معلمة مفقودة أو خطأ في الخادم، فاقترح الحل الذي يجب تجربته.

تلخيص هذه التدوينة بـ: