اذهب إلى المحتوى

Chihab Hedidi

الأعضاء
  • المساهمات

    3051
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    13

كل منشورات العضو Chihab Hedidi

  1. يمكنك استخدام رمز CSRF و هو رمز مميز يتم إنشاؤه لكل طلب فورم ويتم التحقق منه عند إعادة تقديم الفورم، يمكن أن يساعد في منع تكرار تقديم البيانات، أو كحل آخر يمكنك استخدام حالة الجلسة (Session State) حيث يتم تخزين حالة الفورم بعد تقديمها في الجلسة لتتبع ما إذا كان الفورم قد تم تقديمه من قبل أم لا، و تكون الطريقة كالآتي حيث عند تحميل الصفحة لأول مرة، يتم إنشاء رمز CSRF وحفظه في الجلسة، و عند تقديم الفورم، يتم إرسال رمز CSRF مع البيانات، ثم يتم التحقق من صحة رمز CSRF ومعرفة ما إذا كان الفورم قد تم تقديمه مسبقا من خلال حالة الجلسة، إذا كان الفورم قد تم تقديمه مسبقًا، يتم عرض رسالة منع إعادة التقديم، بينما إذا كان الفورم لم يتم تقديمه مسبقا، يتم معالجة البيانات وتحديد حالة الجلسة لمنع إعادة التقديم.
  2. نعم يمكنك إنشاء صفحة تسجيل الدخول باستخدام HTML وCSS، و يمكنك استخدام PHP لإرسال رمز التأكيد عبر البريد الإلكتروني عن طريق استخدام مكتبة PHPMailer لإرسال البريد الإلكتروني. هنا مثال على كيفية القيام بذلك: <?php // login.php if ($_SERVER['REQUEST_METHOD'] == 'POST') { $email = $_POST['email']; $password = $_POST['password']; // إنشاء رمز تأكيد عشوائي $confirmation_code = rand(100000, 999999); // إرسال رمز التأكيد عبر البريد الإلكتروني require 'PHPMailer/PHPMailerAutoload.php'; $mail = new PHPMailer; $mail->isSMTP(); $mail->Host = 'smtp.example.com'; $mail->SMTPAuth = true; $mail->Username = 'your_email@example.com'; $mail->Password = 'your_email_password'; $mail->SMTPSecure = 'tls'; $mail->Port = 587; $mail->setFrom('your_email@example.com', 'Your Name'); $mail->addAddress($email); $mail->isHTML(true); $mail->Subject = 'Confirmation Code'; $mail->Body = 'Your confirmation code is: ' . $confirmation_code; if ($mail->send()) { echo 'Confirmation code has been sent to your email.'; } else { echo 'Message could not be sent. Mailer Error: ' . $mail->ErrorInfo; } } ?> يمكنك إنشاء صفحة أخرى للتحقق من رمز التأكيد الذي أرسله المستخدم وفي ملف verify.php يمكنك التحقق من صحة الرمز الذي أدخله المستخدم، يمكنك استخدام خدمات بريد إلكتروني مجانية مثل smtp.gmail.com، ولكن تذكر أنه قد يكون هناك قيود على عدد الرسائل المرسلة يوميا.
  3. عملية الإرسال ستبقى بنفس الطريقة ما أقصده هنا هو أن اسم المتغير لا يهمنا بقدر ما يهم محتواه، فإذا كان هذا التكرار سيكون في ملف أخر فلاتحتاج لتغيير المغيرات، أما إذا كان في نفس الملف فيجب عليك تغييرهم.
  4. اسم المتغير لا يهم في هذه الحالة فهو يدل فقط على الإختيارات التي لدينا و بالتالي حتى تغييره لن يضر.
  5. إضغط على vscode بالزر الأيمن للفأرة و من ثم run as admin أو إذا كان جهازك بالعربي ستجدها تشغيل كمسؤول.
  6. تأكد من تشغيل خادم الويب وأنّه يستمع على المنفذ 8080، و أيضا هناك رفض للإتصال و السبب هو حماية الجهاز لتجنب هذا الأمر قم بتشغيل الكود الخاص بك كمسؤول، وهذا عن طريق تشغيل Pycharm بالضغط على بالزر الأيمن للفأرة و من ثم إختيار run as admin و جرب مرة أخرى.
  7. نعم يمكنك تغيير أسماء الأعمدة SHU و file إلى الأسماء الجديدة التي تود استخدامها، ولكن تأكد أيضا من تغيير أسماء الملفات المتحملة ومجلد الهدف إذا لزم الأمر، هذا يعني أنه إذا كانت الأعمدة الجديدة التي ترغب في استخدامها هي newSHU و newFile، ستحتاج فقط إلى تحديث الكود بالشكل التالي: if ($_SERVER["REQUEST_METHOD"] == "POST") { $option = htmlspecialchars($_POST["newSHU"], ENT_QUOTES, 'UTF-8'); $targetDir = "img/"; $uploadOk = 1; if ($option == "الصورة الاولى" && isset($_FILES["newFile"])) { $targetFile = $targetDir . basename($_FILES["newFile"]["name"]); $imageFileType = strtolower(pathinfo($targetFile1, PATHINFO_EXTENSION)); if ($_FILES["newFile"]["size"] > 20000) { echo "عذراً، حجم الملف كبير جداً."; $uploadOk = 0; } $check = getimagesize($_FILES["newFile"]["tmp_name"]); if ($check === false) { echo "الملف ليس صورة."; $uploadOk = 0; } if ($uploadOk == 1) { if (move_uploaded_file($_FILES["newFile"]["tmp_name"], $targetFile1)) { echo "تم رفع الملف "; } } } elseif ($option == "الصورة الثانية" && isset($_FILES["newFile"])) { $targetFile = $targetDir2 . basename($_FILES["newFile"]["name"]); $imageFileType = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION)); if ($_FILES["newFile2"]["size"] > 10000) { echo "عذراً، حجم الملف كبير جداً."; $uploadOk = 0; } $check = getimagesize($_FILES["newFile"]["tmp_name"]); if ($check === false) { echo "الملف ليس صورة."; $uploadOk = 0; } if ($uploadOk == 1) { if (move_uploaded_file($_FILES["newFile"]["tmp_name"], $targetFile)) { echo "تم رفع الملف "; } } } elseif ($option == "الصورة الثالثة" && isset($_FILES["newFile"])) { $targetFile = $targetDir . basename($_FILES["newFile"]["name"]); $imageFileType3 = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION)); if ($_FILES["newFile"]["size"] > 1000) { echo "عذراً، حجم الملف كبير جداً."; $uploadOk = 0; } $check = getimagesize($_FILES["newFile"]["tmp_name"]); if ($check === false) { echo "الملف ليس صورة."; $uploadOk = 0; } if ($uploadOk == 1) { if (move_uploaded_file($_FILES["newFile"]["tmp_name"], $targetFile)) { echo "تم رفع الملف "; } } } elseif ($option == "الصورة الرابعة" && isset($_FILES["newFile"])) { $targetFile = $targetDir . basename($_FILES["newFile"]["name"]); $imageFileType = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION)); if ($_FILES["newFile"]["size"] > 1000) { echo "عذراً، حجم الملف كبير جداً."; $uploadOk = 0; } $check = getimagesize($_FILES["newFile"]["tmp_name"]); if ($check === false) { echo "الملف ليس صورة."; $uploadOk = 0; } if ($uploadOk == 1) { if (move_uploaded_file($_FILES["newFile"]["tmp_name"], $targetFile)) { echo "تم رفع الملف "; } } } elseif ($option == "الصورة الخامسة" && isset($_FILES["newFile"])) { $targetFile = $targetDir . basename($_FILES["newFile"]["name"]); $imageFileType = strtolower(pathinfo($targetFile5, PATHINFO_EXTENSION)); if ($_FILES["newFile"]["size"] > 1000) { echo "عذراً، حجم الملف كبير جداً."; $uploadOk = 0; } $check = getimagesize($_FILES["newFile"]["tmp_name"]); if ($check === false) { echo "الملف ليس صورة."; $uploadOk = 0; } if ($uploadOk == 1) { if (move_uploaded_file($_FILES["newFile"]["tmp_name"], $targetFile)) { echo "تم رفع الملف "; } } } } فقط تأكد من تحديث جميع أسماء الأعمدة المتغيرة والمجلدات حسب حاجتك.
  8. الدورة تغطي مجالات عديدة مما يزيد من فرصك في الحصول على عمل، حيث يمكنك استخدام بايثون في تطوير التطبيقات والمواقع الإلكترونية باستخدام أطر عمل مثل Django و Flask، و أيضا هناك طلب كبير على محللي البيانات الذين يستخدمون بايثون لمعالجة وتحليل البيانات باستخدام مكتبات مثل pandas و numpy، و حتى مجال الذكاء الإصطناعي و تعلم الآلة. لا تنسى أولا تنشئ حساب في مستقل و تضيف كل معلوماتك هناك و أيضا ضع المشاريع التي طورتها في معرض الأعمال، بعدها يمكنك التقديم على المشاريع هناك. يمكنك أن تطلع على هذه المقال لتفهم أكثر :
  9. لا تقلق من الطبيعي أن تشعر ببعض النسيان بعد فترة من الانقطاع، ابدأ بمراجعة المفاهيم الأساسية التي تعلمتها في البداية، يمكنك أيضا قراءة الملاحظات التي كتبتها خلال الدورة، و أيضا حاول إعادة مشاهدة الدروس التي تناولت المواضيع الأساسية و سرع الفيديو ليكون فقط كتذكير لك. و البرمجة تحتاج إلى ممارسة مستمرة، حاول حل بعض التمارين البسيطة أو المشاريع الصغيرة التي كنت قد عملت عليها سابقا، ودائما حدد وقتا يوميا لممارسة البرمجة، حتى لو كان لفترة قصيرة (مثل 30 دقيقة يوميا)، فالاستمرارية أكثر أهمية من الكمية.
  10. نعم يمكنك ذلك عن طريق تصدير جميع المنتجات والمعلومات الأخرى ذات الصلة من Shopify إلى ملف CSV، يمكنك القيام بذلك من خلال لوحة التحكم في Shopify أو يمكنك إستخدام بعض الإضافات في المتصفح مثل إضافة ShopSwap و التي تساعدك على هذا الأمر، بعدها استخدمي ملحق WooCommerce الخاص بالاستيراد لتحميل ملف CSV الذي قمت بتصديره من Shopify، و بعد استيراد المنتجات، ستحتاجين إلى تعديل الروابط الثابتة في WooCommerce لتتطابق مع الروابط القديمة في Shopify. يمكنك القيام بذلك من خلال إعدادات الروابط الثابتة.
  11. الكود الذي كتبته يحتوي على خطأ بسيط حيث أنك إستخدمت price بدل print يمكنك تصحيح الكود فقط بالشكل التالي: price = [50, 60, 100, 500, 1000, 1000000, 20000000, 91000000000] max_price = max(price) print(max_price)
  12. لا مشكلة في ذلك أهم شيء قم بتنظيم السكربتات في ملفات منفصلة وضعها في مجلد محدد داخل مشروعك و قم بإداراتها بالشكل المناسب.
  13. نعم، يمكن أن تسبب وجود عدة سكربتات مشاكل في بعض الأحيان، خاصة إذا لم تتم إدارتها بشكل صحيح، فمثلا إذا كانت هناك سكربتات متعددة تعمل على معالجة نموذج واحد، فقد يحدث تضارب بينها مما يؤدي إلى سلوك غير متوقع أو أخطاء، كما أنه كثيرا ما يؤثر استخدام العديد من السكربتات على أداء النظام وقد يتسبب في بطء في استجابة النموذج، لذا يجب أن تأخذ هذه الأمور بعين الإعتبار.
  14. عدد الأعمدة التي يمكن أن تتحملها قاعدة البيانات يعتمد على عدة عوامل مثل نوع قاعدة البيانات، والاستضافة، وتكوينات الخادم، في العادة قواعد البيانات الحديثة والاستضافات المدفوعة تتيح لك إمكانية إنشاء جداول تحتوي على عشرات الأعمدة بدون مشاكل، و يمكنك تحسين أداء قاعدة البيانات بتنظيم الجداول واستخدام فهارس بشكل صحيح. بالنسبة للاتصال بين النموذج وملف Excel، يمكنك ذلك بطرق مختلفة، إذا كنت تستخدم خادم ويب معين مثل Apache أو Nginx، يمكنك استخدام سكريبتات برمجية لمعالجة البيانات المرسلة من النموذج وكتابتها إلى ملف Excel، يمكنك الإعتماد في هذا على PHPExcel.
  15. كتابة الخوارزمية تعني وصف الخطوات الأساسية التي يجب اتباعها لحل مشكلة معينة أو تنفيذ مشروع معين بشكل منطقي ومنظم، قبل أن تبدأ في كتابة الخوارزمية، تأكد من أنك تفهم المشكلة تماما وما هي الأهداف التي تريد تحقيقها، و حدد ما هي المدخلات والمخرجات اللازمة لحل المشكلة، بعدها قم بتقسيم العملية إلى خطوات بسيطة ومنطقية، يجب أن تكون هذه الخطوات واضحة وسهلة الفهم، و أيضا كخطوة أساسية إذا كانت هناك شروط معينة يجب التحقق منها أو عمليات تكرارية، قم بإدراجها في الخوارزمية، و اكتب الخطوات بشكل مرتب وواضح، بحيث يمكن لأي شخص آخر فهمها بسهولة، يمكنك استخدام لغة طبيعية أو أي لغة برمجة (Pseudocode). يمكنك أن تقرأ هذه المقالات و التي ستساعدك كثيرا:
  16. مرحبا أحمد، يجب أن تعرف أنه للتقدم للإختبار يجب عليك إنهاء أربع مسارات على الأقل، أما بالنسبة للتقدم بما أنك وصلت لمرحلة أتك قادر على برمجة المواقع من الصفر فأعتقد أنك جاهز للإختبار، لكن يجب أن تعرف أنه سيتم سؤالك عن كل المحتوى في الدورة، يمكنك الإطلاع أكثر على معلومات حول الإختبار من خلال هذه الإجابة :
  17. يجب عليك التركيز على الجودة بدلا من الكمية، واحرص على أن تأتي الروابط الواردة من مواقع ذات سمعة جيدة وتصنيف عال، وذات محتوى ذو صلة بمحتوى موقعك، وأيضا قم بإنشاء محتوى ذو جودة عالية يستحق الروابط، وحاول في نفس الوقت التواصل مع مواقع أخرى في نفس مجالك واطلب منهم الارتباط بموقعك، و عندر الرغبة في ذكر موقعك في موقع آخر حاول أن يكون ذلك عند الحاجة بطريقة طبيعية وغير ترويجية مفرطة. ولا تنسى أن تستخدم أدوات مثل Ahrefs وSEMrush لتحليل الروابط الواردة إلى منافسيك ومعرفة من أين يحصلون على روابطهم. يمكنك قراءة هذه المقالات ستفيدك كثيرا:
  18. الخطأ الذي يظهر سببه أن PropertyPage هو مكون React ويفترض أن يكون دالة وظيفية عادية وليست دالة async، في React، المكونات الوظيفية لا يمكن أن تكون دوال async لأنها يجب أن ترجع JSX مباشرة، وليس وعدا (Promise). في الكود الذي كتبته، عند إضافة async إلى PropertyPage، تقوم بجعل هذه الدالة ترجع وعدا، مما يؤدي إلى أن React لا يعرف كيف يتعامل مع هذا الوعد ويعرض المكون، و لحل المشكلة، يمكنك فصل منطق الجلب (fetching) في useEffect كما فعلت، لكن تأكد من عدم استخدام async في دالة المكون الرئيسية. إليك كيف يمكنك إعادة كتابة الكود بشكل صحيح: "use client" import React, { useEffect, useState } from "react"; import Link from "next/link"; import { useParams } from "next/navigation"; import { FaArrowLeft } from 'react-icons/fa'; import { fetchProperty } from "@/utils/requests"; const PropertyPage = () => { const [property, setProperty] = useState(null); const [loading, setLoading] = useState(true); const { id } = useParams(); useEffect(() => { const fetchPropertyData = async () => { if (!id) return; try { const property = await fetchProperty(id); setProperty(property); } catch (error) { console.error('Error fetching property', error); } finally { setLoading(false); } }; fetchPropertyData(); }, [id]); if (loading) { return <div>Loading...</div>; } return ( <> <section> <div className="container m-auto py-6 px-6"> <Link href="/properties" className="text-green-500 hover:text-green-600 flex items-center" > <FaArrowLeft className="mr-2" /> Back to Properties </Link> </div> </section> <section className="bg-green-50"> <div className="container m-auto py-10 px-6"> <div className="grid grid-cols-1 md:grid-cols-70/30 w-full gap-6"> <aside className="space-y-4"> property single page </aside> </div> </div> </section> </> ); }; export default PropertyPage; في هذا الكود، يتم تنفيذ دالة fetchPropertyData داخل useEffect كما هو مطلوب، دون جعل المكون الرئيسي async. بهذه الطريقة، يمكنك ضمان أن المكون يرجع JSX وليس وعدا، وبالتالي تتجنب الخطأ الذي ظهر.
  19. يمكنك استخدام PHP مع JavaScript لجعل الحقول تظهر أو تختفي بناء على الخيار المحدد في حقل select، سنستخدم JavaScript للتعامل مع تغيير الخيارات في حقل select وPHP لعرض الحقول المناسبة بناء على هذا التغيير. أولا نقوم بإعداد HTML وJavaScript: <!DOCTYPE html> <html> <head> <title>Form Example</title> <script type="text/javascript"> function showJobs() { var gender = document.getElementById("gender").value; var maleJobs = document.getElementById("maleJobs"); var femaleJobs = document.getElementById("femaleJobs"); if (gender == "male") { maleJobs.style.display = "block"; femaleJobs.style.display = "none"; } else if (gender == "female") { maleJobs.style.display = "none"; femaleJobs.style.display = "block"; } else { maleJobs.style.display = "none"; femaleJobs.style.display = "none"; } } </script> </head> <body> <form method="post" action="submit.php"> <label for="gender">الجنس:</label> <select id="gender" name="gender" onchange="showJobs()"> <option value="">اختر...</option> <option value="male">ذكر</option> <option value="female">أنثى</option> </select> <div id="maleJobs" style="display:none;"> <label for="maleJob">وظائف الذكور:</label> <select id="maleJob" name="maleJob"> <option value="job1">وظيفة 1</option> <option value="job2">وظيفة 2</option> <option value="job3">وظيفة 3</option> </select> </div> <div id="femaleJobs" style="display:none;"> <label for="femaleJob">وظائف الإناث:</label> <select id="femaleJob" name="femaleJob"> <option value="job4">وظيفة 4</option> <option value="job5">وظيفة 5</option> <option value="job6">وظيفة 6</option> </select> </div> <input type="submit" value="إرسال"> </form> </body> </html> في ملف submit.php، يمكنك معالجة البيانات المرسلة من النموذج: <?php if ($_SERVER["REQUEST_METHOD"] == "POST") { $gender = $_POST["gender"]; if ($gender == "male") { $job = $_POST["maleJob"]; } elseif ($gender == "female") { $job = $_POST["femaleJob"]; } echo "الجنس: " . $gender . "<br>"; echo "الوظيفة: " . $job; } ?> عند تغيير الخيار في حقل select، تقوم JavaScript باستدعاء وظيفة showJobs التي تعرض أو تخفي حقول الوظائف بناء على الخيار المختار، و عند إرسال النموذج، تقوم PHP بمعالجة البيانات وتحديد الوظيفة المختارة بناء على الجنس، و بهذا الشكل يمكنك جعل الحقول تظهر وتختفي بناء على الخيارات المحددة في حقل select.
  20. مرحبا، أسفل الفيديو الخاص بالدورة تجد مكان للسؤال، أرجوا طرح السؤال هناك.
  21. لا يشترط فهم جميع المواضيع الموجودة في موسوعة الحاسوب، بل حاول البدء بالأساسية حيث يجب عليك أن تركز على فهم المفاهيم الأساسية لـ HTML (هيكل الصفحة، العناصر، العلامات) وCSS (التنسيق، الألوان، الخطوط)، كما أنه أفضل طريقة لتعلم HTML وCSS هي من خلال العمل على مشاريع عملية، لذا القيام بالمشاريع مع المدرب سيزيد من نسبة فهمك لهذه الأمور، و في نفس الوقت يمكنك استخدام موسوعة حاسوب كمرجع عند الحاجة.، أي لا تحاول حفظ كل شيء. كما أن الدورة فيها جزء كبير يتحدث على الأساسيات و بالتالي ستستفيد منه كثيرا، لذا يمكنك البدء فيها الآن. بالتوفيق إن شاء الله.
  22. الكود يبدو صحيحا، تأكد من أن النموذج (Model) الخاص بك مكتوب بالأحرف الكبيرة كالتالي: Student وليس student، و في الـ Controller، تأكد من أنك تقوم باستيراد النموذج بشكل صحيح: use App\Models\Student; class StudentController extends Controller { public function index() { $students = Student::all(); return view('student.index', compact('students')); } } و في الأخير جرب مسح التخزين المؤقت للعرض: php artisan view:clear
  23. المشكلة بسبب متغير غير معرف في العرض (view). من الصور التي أرفقتها، الخطأ يأتي من ملف العرض student.blade.php حيث لا يتم تمرير متغير $student بشكل صحيح من الـ Controller إلى العرض. في الصورة الأولى، في ملف الـ Controller StudentController، لاحظت أنك قمت بتعريف المتغير $student كالتالي: $student = student::all(); لكن عندما تقوم بتمرير المتغير إلى العرض، يجب أن تستخدم الطريقة الصحيحة وهي: $students = Student::all(); return view('student.index', compact('students')); لاحظ أنني قمت بتغيير اسم المتغير من $student إلى $students ليعكس أن هناك مجموعة من الطلاب، ويجب تمريره بنفس الاسم إلى العرض. ثم في ملف العرض student.blade.php، يجب عليك استخدام المتغير $students بنفس الاسم كالتالي: @foreach ($students as $student) <tr> <td>{{ $student->name }}</td> </tr> @endforeach تأكد من أن الأسماء المستخدمة في العرض تتطابق مع الأسماء التي قمت بتمريرها من الـ Controller، حاول تعديل الكود وتحقق مما إذا كانت المشكلة قد حلت.
  24. مرحبا حمد، تحت كل فيديو من الدورة توجد يوجد مكان للأسئلة أرجوا أن تطرح مشكلتك هناك، بخصوص التي في الصورة، فهذه النسخة الخاصة بال macOS لذا لا يشترط أن يكون الأمر نفسه في الوينداوز، يمكنك فقط التثبيت و الإستمرار في الفيديو.
  25. خاصية الإستشارة عن طريق الإتصال بالفيديو غير متوفرة حاليا و لكن في حالة أردت اي معلومة أو إستشارة يمكنك أن تطرحها كسؤال هنا و سيتكفل المدربين بمساعدتك.
×
×
  • أضف...