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

محمد عاطف17

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

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

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

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

    29

كل منشورات العضو محمد عاطف17

  1. عند التفكير في بناء API أو الاعتماد على الكود الموجود في المتحكم فقط فهذا يعتمد على بعض الأمور: متى نقوم ببناء API: تعدد الاستخدامات: إذا كنت تخطط لاستخدام نفس المنطق في أكثر من واجهة مثل الويب او تطبيقات الموبايل أو غيرها وهنا إستخدام ال API سيكون الخيار الأفضل لأنه سيخدم جميع تلك الواجاهات والمشاريع. فصل المسؤوليات: إذا كنت تريد فصل منطق العمل عن واجهة المستخدم، فـ API يساعدك في ذلك حيث فقط الواجهة ستكون مخصصة للعرض وسيكوم ال API للتحكم في البيانات. تلخيصا لما سبق ال API أفضل خيار إذا كان هناك العديد من المصادر والمشاريع والواجهات التي ستتعامل مع هذا المشرع لذلك يفضل بناء هذا المشروع ك API. متى نكتفي بالمتحكم: تطبيقات بسيطة: إذا كان التطبيق بسيطا ولا يتطلب واجهات متعددة يمكنك الاكتفاء بالمتحكم حيث هو من سيكون حلقة الوصل بين العرض وبين البيانات . لهذا إذا كان مشروعك ليس كبيرا ولن يتم الإتصال به من عدة واجهات سواء تطبيقات هاتف أو غيرها إذا يكفى فقط إستخدام المتحكمات. أما بخصوص الإختبارات فهي مهمة للتالي : إذا كان هناك منطق معقد في التطبيق فإن كتابة اختبارات ستكون ضرورية لضمان عمل كل شيء بشكل صحيح وكما تتوقعه وتريده. إذا كنت تجد نفسك تكرر نفس التعليمات البرمجية، فمن الجيد كتابة اختبارات لتجنب الأخطاء فإن أكثر الأخطاء تنتج من نسخ وإعادة إستخدام الأكواد. إذا كنت تخطط لتحديث وتطوير المشروع فإن الاختبارات تساعد في التأكد من عدم وجود أى أخطاء في الأكواد السابقة إذا حدث لها تعديل أو تحديث فبمجرد عمل تعديلات في الأكواد ستقوم بتشغيل الإختبارات السابقة وإذا عملت كما هو متوقع إذا التحديثات جيدة وتعمل أما إذا حدثت مشكلة فإذا ستعرف أن هناك مشكلة في الأكواد الجديدة ويجب حلها
  2. نعم بالطبع ولكن إحذر من هذه الطريقة حيث من الممكن أن المستخدم سيقوم بكتابة شيفرات ضارة مثل javascript وغيرها من الممكن أن تضر الزوار الخاصين بالمدونة لذلك يرجى الإنتباه لتلك الطريقة. هذا هو الكود : import { useState } from 'react'; import Link from 'next/link'; const BlogEditor = () => { const [content, setContent] = useState(''); const handleChange = (e) => { setContent(e.target.value); }; const replaceText = (text) => { const regex = /phoenix/gi; // البحث عن اسم المدونة const replaced_text = text.split(regex).join( `<a href="/" style="color: blue; font-weight: bold;">phoenix</a>` ); return replaced_text; }; return ( <div> <textarea value={content} onChange={handleChange} placeholder="اكتب مقالتك هنا..." rows="10" cols="50" /> <h3>معاينة المقالة:</h3> <div dangerouslySetInnerHTML={{ __html: replaceText(content) }} /> </div> ); }; export default BlogEditor; هنا أنشأنا الدالة replaceText والتي ستقوم بإستبدال النص الخاص ب phoenix ووضع رابط المدونة بدلا منه . لذلك يرجى وضع رابط المدونة في خاصية href في الدالة . بعد ذلك إستخدمنا handleChange وهي الدالة التي تستخدم لتحديث حالة content عند تغيير النص في الـ textarea. وهنا إستخدمنا dangerouslySetInnerHTML وهي خاصية لعرض النص كHTML المعدل في div وذلك لمعاينة المقالة . وفي النهاية عند الحفظ يرجى إستدعاء الدالة replaceText للتبديل النص إلى رابط قبل حفظها لديك.
  3. ستجد أسفل فيديو الدرس صندوق للتعليقات كما هنا يرجى طرح سؤالك أسفل الدرس وليس هنا حيث هنا قسم الأسئلة العامة ولا نقوم بإجابة الأسئلة الخاصة بمحتوى الدورة أو الدرس، وذلك لمعرفة الدرس الذي توجد به مشكلتك و لمساعدتك بشكل أفضل.
  4. خلال 48 ساعة من إنشاء الحساب ستجد أنك قد حصلت على 50 connects مجانية يمكنك إستخدامها في التفديم على الوظائف . وكل شهر ستحصل على 10 connects مجانية.
  5. إن up work لا توفر أى أكواد خصم كثيرا ولهذا فإنه إذا كان يوجد أكواد خصم فيتم إرسالها بالبريد ومعظم أكواد الخصم تكون لأشخاص معينين فقط أو يتم توفيرها في المناسبات . لذلك حاليا يمكنك الإعتماد فقط على ال free connects التي يتم توفيرها لك في بداية كل شهر .
  6. في بعض الدروس بالطبع يقوم المدرب بإعطاء تمارين للتدريب على الدرس ستجدها في نهاية كل درس يقوم المدرب بإعطاء تدريب أو إثنين لحلهما .وإذا أردت تمارين إضافية في أى درس فقط يمكنك التعليق أسفل الدرس المراد تدريبات له وسيقوم المدربون بإعطاء تمارين لك . ونعم بالفعل الأكاديمية تعتمد على التطبيقات العملية حيث ستجد العديد من التطبيقات العملية والتي تشمل الأساسيات جميعها حيث ستطبق جميع ما تعلمته في مشروع حقيقي. أما بخصوص طريقة مذاكرة التطبيقات العملية فأولا يرجى التطبيق مع المدرب في كل درس والتأكد من فهم كل شئ وإذا وجدت صعوبة في أمر ما يمكن السؤال دائما أسفل الدرس . وهكذا قم بالتطبيق مع المدرب إلى نهاية المسار وبعد ذلك يفضل إنشاء المشروع من البداية بنفسك تماما دون الرجوع إلى الدروس فقط قم بتطبيق ما فهمته وتعلمته لتخرج مشروع يعمل كما هو متوقع و يمكنك محاولة تحسين الأكواد أو إضافة خصائص جديدة ولكن يمكنك الإلتزام بالمشروع فقط إذا أردت دون إضافات . وهكذا بعد الإنتهاء من المشروع بمفردك يمكنك مقارنة الأكواد ومراجعتها والتأكد من أن كل شئ يعمل كما هو مطلوب وإذا وجد أخطاء هكذا ستعرف أنه توجد لديك مشكلة في درس معين وحينها يمكنك مراجعته لحين التأكد من فهمك الكامل للمشروع و إستطاعتك كتابته بنفسك وهذا هو ما سيساعدك على التطور وتحسين مستواك.
  7. نعم تعتبر هذ الفكرة جيدة وخصوصا إذا تريد إستخدام تصدير الملفات ك PDF في أكثر من مشروع بأكثر من لغه . لذلك إذا وجدت بايثون تساعدك في تلك المهمة فيمكنك إنشاء خادم بإستخدام flask كما تريد و جعله يستقبل الطلبات ويقوم بتصدير المعلومات في ملف PDF وتقوم بإرسال الطلبات ك API من خلال أى مشروع أخر . ولكن هنا سيتوجب عليك رفع مشروع flask على خادم مع المشروع الآخر و هنا سيتطلب عملا إضافيا لتشغيل الخوادم معا أو رفع كل مشروع على خادم منفصل . وأيضا سيتوجب تأمين مشروع flask جيدا ومنع الوصول له من أى شخص أخر سواك . ولكن من وجهة نظرى إن تصدير الملفات ك PDF ليست بالصعوبة تلك حيث php توجد بها العديد من المكتبات التي تدعم PDF و اللغة العربية و الأمر بسيط سيحتاج ملف سكريبت واحد فقط و أيضا في next . لذلك الأفضل هو إنشاء ملف لكل منهما وفي كل مشروع تريد تنفيذ خاصية تصدير الملفات تقوم بوضع ذلك الملف في المشروع وسيعمل معك .
  8. نعم يوجد الكثير من المكتبات التي تدعم اللغة العربية في ملفات ال pdf : pdf-lib: مكتبة قوية ومفيدة لإنشاء وتعديل ملفات PDF يمكنها التعامل مع النصوص باللغة العربية ولكنك قد تحتاج إلى ضبط الخطوط بشكل صحيح لدعم الكتابة من اليمين لليسار (RTL) وهذا رابط المكتبة على github : https://github.com/Hopding/pdf-lib jspdf: مكتبة شائعة لإنشاء ملفات PDF من اكواد HTML . توفر إستخدام العديد من اللغات بما في ذلك اللغة العربية، لكنك قد تحتاج إلى استخدام خطوط خاصة باللغة العربية ووهذا رابط المكتبة على github : https://github.com/parallax/jsPDF pdfmake: مكتبة جيدة لإنشاء ملفات PDF. تدعم الكتابة من اليمين لليسار وتوفر دعم للغة العربية وهذا هو رابط المكتبة على github : https://github.com/bpampuch/pdfmake
  9. هذه المشكلة غالبا بسبب مشكلة في الإصدارات التى لديك . وغالبا هى بسبب مكتبة numpy لذلك يرجى تنفيذ الأوامر التالية : pip install numpy --upgrade pip install tensorflow --upgrade pip install keras --upgrade يمكنك تنفيذ كل أمر على حدى وتجربة البرنامج وانظر أى مكتبة تحديثها أدى إلى حل المشكلة
  10. وعليكم السلام ورحمة الله وبركاته. من فضلك مستقبلا يرجى وضع سؤالك اسفل الدرس حيث ستجد صندوق للتعليقات كما هنا حيث لا نجيب على اسئلة الدورات هنا حيث هذا هو قسم الاسئلة العامة وذلك لمساعدتك بشكل افضل. لاخظ ان الخطأ يخبرك ان مكتبة gspread لا تحتوى الدالة authorize مع ان تلك المكتبة تحتوى بالفعل على هذه الدالة ولاحظ انه يخبرك ان هذا من المحتمل بسبب circular import . وإذا نظرت الى اسم الملف الخاص بك ستجده google.py وهذا الاسم تستخدمه gspread بداخلها لذلك حينما تستعدى gspread الملف google فهنا تستعدى الملف الخاص بك وتحدث مشكلة cirular import حيث يظل كل ملف يستدعى الاخر . لذلك يرجى تغير اسم google.py الى اى اسم اخر لحل تلك المشكلة
  11. وعليكم السلام ورحمة الله وبركاته. انت لم تقم بالغاء اخفاء الملفات بل فقط قمت بتفعيل خيار إظهار الملفات المخفية. ولذلك فإن الملفات المحفية تظهر بشكل باهت ليتم التفرقة بينها وبين الملفات الأخرى. ولإظهار الملفات ننبع نفس خطوات إخفائها . اولا قم بالوقوف على الملف او المجلد وقم بالضغط على الزر الايمن للفأرة. بعد ذلك قم بإختيار Properties : ستجد الآن ان خيار Hidden مفعل يرجى العاء تفعيله ومن ثم الضغط على apply : الآن ستجد ان الملفات قد ظهرت بشكلها الطبيعى بعد الغاء إخفائها.
  12. إن الدالة str تقوم بإرجاع قيمة المتغير وتحويلها إلى سلسلة نصية و لكن لا تغير قيمة المتغير نفسه . لذلك يجب إسناد تلك القيمة إلى ذلك المتغير أو متغير أخر . لاحظ كما في الصورة السابقة أسندنا النتيجة التى يتم إرجاعها من str(age) إلى المتغير age وبذلك قمنا بتحديث قيمة المتغير age الحالية والتى هى int إلى القيمة الخارجة من الدالة str وأصبح الآن سلسلة نصية. لذلك كل ما عليك هو كتابة السطر التالي : age = str(age)
  13. وعليكم السلام ورحمة الله وبركاته . إن جميع الدورات في الأكاديمية تم إعداداها بشكل ممنهج حيث يتم أولا البدء بالأساسيات وبعد ذلك تنتقل من قسم إلى أخر حيث يعتمد كل قسم على الأقسام التى قبله . لذلك يرجى متابعة المسارات بالترتيب خاصة مسار الأساسيات وذلك حتى لا تجد صعوبة في مسار يعتمد على المسارات التى قبله . أولا يجب عليك التركيز في الدرس وتأكد من عدم تخطي أى درس قبل التأكد من فهمه جيدا وإذا ما واجهتك مشكلة يمكنك السؤال دائما أسفل الدرس وستجد العديد من المدربين المتاحين لمساعدتك في أى وقت . بعد التأكد من فهم الدرس يرجى التطبيق مع المدرب ويمكنك التطبيق أثناء الدرس ولكن يفضل التطبيق بنفسك مرة أخرى بعد نهاية الدرس وذلك للتأكد من أنك تستطيع تطبيق ما تعلمته حيث في البرمجة التطبيق أهم بكثير من الدراسة النظرية . وفي المسارات الخاصة بالتطبيق العملى ففي هذا المسار يرجى فهم المشروع المطلوب أولا وبعد ذلك يمكنك متابعة الدرس والتطبيق مع المدرب وبعد إنتهاء المسار يفضل إنشاء المشروع من البداية بنفسك والتأكد من عمل المشروع كما من المفترض أن يعمل و بعد ذلك يمكنك مقارنة المشروع الذى أنشأته مع المدرب والمشروع الذى أنشأته بنفسك لتعرف نقاط الضعف والقصور التي لديك حتى تركز عليها . ويمكنك قراءة الأجوبة التالية لنصائح أفضل حول طرق المذاكرة :
  14. وعليكم السلام ورحمة الله وبركاته . لا لم يتم الحفظ بالطبع في قاعدة البيانات حيث الكود لا يقوم بأى تعديل أو حفظ في قاعدة البيانات . حيث يقوم الكود فقط باستبدال القيم الفارغة (null) في عمود "cholesterol" من DataFrame وبما أن الكود يقوم فقط بتعديل وحفظ البيانات في الذاكرة المؤقته ولا يوجد أى كود أخر لحفظ تلك العديلات في قاعدة البيانات فإذا التعديلات ستظل فقط في الذاكرة المؤقته وقاعدة البيانات ستظل كما هي.
  15. كما وضحنا لك فإن أى متغير أو بيانات يتم حفظها في البرنامج نفسه سواء متغير أو شئ فإنه يتم حفظها في الذاكرة المؤقته (RAM) وليس على القرص الصلب (Hard Disk) لديك على الجهاز ولهذا بمجرد إغلاق الحاسوب أو حتى إغلاق البرنامج يتم حذف البيانات من الذاكرة المؤقته وبالتالى فقدان أى بيانات كانت بداخل تلك المتغيرات . وكما أخبرتك لم تصمم البرامج لحفظ المتغيرات على الحاسوب . حيث بمجرد تشغيل البرنامج وإنشاء متغير تقوم اللغة التى تم كتابة الكود بها ومثلا هنا بايثون بحفظ مكان في الذاكرة المؤقته و تعين هذا المتغير بقيمة فارغة حتى تقوم بحفظ البيانات فيه فتقوم بحفظ البيانات في المكان الخاص بهذا المتغير في الذاكرة المؤقته . وحين يتم إغلاق البرنامج تقوم اللغة بالتخلى عن تلك الأماكن في الذاكرة المؤقته ويتم حذف تلك البيانات . ولهذا فلحفظ البيانات يجب إستخدام قواعد البيانات أو ملفات لحفظها مثل ملفات JSON أو CSV أو حتى TEXT . ولكن لا يتم الإعتماد على المتغيرات فلن يتم حفظ البيانات بها وبمجرد إغلاق البرنامج أو إغلاق الحاسوب سيتم فقدها نهائيا.
  16. وعليكم السلام ورحمة الله وبركاته. عند تشغيل البرنامج فإن المتغيرات والبيانات التى يتم حفظها بداخل تلك المتغيرات يقوم البرنامج بحفظها في الذاكرة المؤقته في الجهاز لديك وبمجرد إغلاق البرنامج يتم مسح كافة تلك البيانات من الذاكرة المؤقته . حيث لم يتم تصميم البرامج لحفظ البيانات بتلك الطريقة . ولذلك لحفظ البيانات لديك ينبغى إستخدام قواعد البيانات لحفظها أو يمكنك حفظها في ملف لديك على الجهاز إن كان الأمر بسيط كما لديك هنا حيث يمكنك إستخدام ملف وليدعى مثلا users.txt وبداخله تقوم بحفظ البيانات . حيث حينما تريد حفظ البيانات تقوم بفتح الملف من خلال الدالة open وتقوم بالكتابة على الملف بإستخدام الدالة write هكذا مثلا : from sys import exit from time import sleep import os class User: def __init__(self, first_name, last_name, email, password, status="inactive"): self.first_name = first_name self.last_name = last_name self.email = email self.password = password self.status = status def display(self): print(f"First name: {self.first_name}") print(f"Last name: {self.last_name}") print(f"Email: {self.email}") print(f"Password: {self.password}") print(f"Status: {self.status}\n") print("_" * 20) def to_string(self): return f"{self.first_name},{self.last_name},{self.email},{self.password},{self.status}\n" def load_users(filename): users = [] if os.path.exists(filename): with open(filename, 'r') as file: lines = file.readlines() for line in lines: if line.strip(): first_name, last_name, email, password, status = line.strip().split(',') users.append(User(first_name, last_name, email, password, status)) return users def save_users(users, filename): with open(filename, 'w') as file: for user in users: file.write(user.to_string()) def create_user(): first_name = input("First name: ") last_name = input("Last name: ") email = input("Email: ") password = input("Password: ") return User(first_name, last_name, email, password) filename = 'users.txt' users = load_users(filename) while True: print("Welcome to user management\n") print("Choose an action\n") print("1. Add new user") print("2. Display all users") print("3. Exit\n") choice = input("Enter your choice: ") if choice == '1': users.append(create_user()) save_users(users, filename) print("User added successfully!\n") sleep(2) elif choice == '2': if users: for user in users: user.display() sleep(2) else: print("No users found!") sleep(2) elif choice == '3': print("Exiting...") exit(0) else: print("Invalid choice! Please select 1, 2, or 3.") حيث قمنا بحفظ البيانات في ملف يدعى users.txt ونقوم بقراءة تلك البيانات منه إذا أردنا ذلك . وبهذا حتى لو تم إغلاق البرنامج فستجد أن الملف users.txt يحتوى على البيانات ولهذا لن يتم فقد البيانات.
  17. قم بفتح الرابط في متصفح أخر . من المفترض عند الضغط على تحميل يتم توجيهك إلى صفحة تسجيل الدخول إذا لم يكن لديك حساب قم بتسجيل حساب جديد وبعد ذلك سيتم تحميل الملف معك .
  18. يمكنك الذهاب إلى الموقع الرئيسى الخاص ب oracle وتحميل نسخة ويندوز 64bit منها https://www.oracle.com/database/technologies/oracle-database-software-downloads.html#db_ee يمكنك الذهاب إلى الرابط التالي وتحميل النسخة التى تريدها . كما في الصورة هذه النسخة الخاصة بويندوز 64bit لإصدار 19c . إذا كانت هذه النسخة هى ما تريد قم بالضغط على ZIP لتحميل النسخة لديك.
  19. وعليكم السلام ورحمة الله وبركاته . إن تعامل python مع البيانات وخاصة الأرقام مختلف تمام عن التعامل معها في لغة C. حيث أن python هى لغة Dynamic Type حيث يمكنك تغير نوع البيانات في وقت ال run time فإذا كنت قد عرفت المتغير ك int يمكنك تغيره إلى float أو حتى سلسلة نصية و python تسمح لك بهذا و في بايثون الأعداد الصحيحة يمكن أن تنمو بمرونة إلى أي حجم يتسع له الذاكرة المتاحة. أما لغة C هي لغة Static Type حيث لا يمكن تغير نوع المتغير بعد تعريفه فلا يمكن تغير النوع من int إلى float أو أى نوع أخر . والمشكلة التي تحدث والخاصة بظهور أرقام سالبة هي بسبب ال overflow حيث أن البيانات أكبر من حجم الذاكرة الحالية ولذلك يحدث فقدان للبيانات فتظهر أرقام غريبة . تخيل لو أن لدينا زجاجة تسع لتر واحد فقط من المياه ماذا سيحدث إذا وضعنا لترين بها ؟ بالفعل ستتسع فقط للتر واحد واللتر الأخر سوف ينسكب ويضيع وهكذا هى مشكلة ال overflow. والصورة السابقة للجدول الخاص بأنواع البيانات في لغة c و المجال الذي يتسع له كل نوع بيانات . فلاحظ النوع int يتسع من -32,768 إلى 32,767 لو كان 2 byte أي إذا تم وضع 32,768 لاحظ أنه زيادة رقم عن المجال المسموح ستحدث مشكلة ال overflow وستجد أن المتغير يحوى أرقام سالبة أو حتى صفر . لذلك في الكود الذي بلغة c يفضل إستخدام نوع بيانات كبير مثل unsigned long حيث المجال الخاص به كبير كما موضح في الجدول .
  20. إن موقع مستقل من المواقع الرائدة في العالم العربى لتوظيف و وعمل المستقلين عليه باللغة العربية حيث يمكنك البدأ منه في بداية مسيرتك لأن المنافسة فيه ليست قوية كما في المواقع العالمية التي ستجد مستقلين من جميع دول العالم لذلك المنافسة شديدة هناك. وتوجد العديد من المواقع العالمية للعمر الحر وأشهرهم هما : upwork freelancer Fiverr ولكن أخر موقعين هما مواقع إسرائيلية لذلك يفضل عدم العمل عليهم والتعامل مع upwrok حيث أنه من أفضل و أكثر المواقع شهرة للعمل الحر.
  21. إن تركك لشئ ما مدة طويلة بالطبع سينسيك الكثير حوله ولن تستطيع تذكر أشياء كثيرة بخصوص هذا . أما في البرمجة فالأمر يعتمد على ما كنت وصلت إليه سابقا . فإذا كنت قبل الإنقطاع قد ذاكرت جيدا وكانت نسبة إستيعابك للأمور كبيرة فستجد أن المراجعه سهلة بإذن الله وسريعه والطريقة الأفضل في هذه الحالة هي مراجعة التلخيصات إذا كنت قمت بهذا سابقا أما إذا لم تكتب أى تلخيصات فيمكنك مشاهدة دروس حو البرمجة سريعا أو المراجعة من المصادر التي ذاكرت منها سابقا . و يجب عليك أهم شئ أولا مراجعة الأساسيات و محاولة الإستذكار وبعد ذلك يمكنك إنشاء مشاريع صغيره بنفسك لتساعدك في المراجعة بشكل جيد و إذا كنت قد كتبت مشاريع سابقة يمكنك إعادىها دون النظر إليها إلا حين الإنتهاء من المشروع ومقارنة المشروعين وأنظر إلى طريقة كتابتك للكود سابقا وحاليا لتعرف مدى القصور لديك والأجزاء التى تحتاج مذاكرة مرة أخرى منك. أما الشعور بالضياع والتشتت فهذا أمر طبيعى جدا ولكن لا يجب عليك الإستسلام له فبعد المراجعة و التطبيق ستجد أن الأمور أصبحت أسهل و أفضل إن شاء الله فتعلم أى شئ من البداية يكون صعبا فى بادئ الأمر لهذا لا تقلق. أما بخصوص المصادر فيمكنك مشاهدة الدروس التى تريدها على اليوتيوب أو يمكنك الإشتراك في دورة دورة تطوير واجهات المستخدم هنا في الأكاديمية حيث ستساعدك لتصبح مطور واجهات مستخدم أو يمكنك قراءة الدروس والمقالات هنا في الأكاديمية أو موقع موسوعة حسوب حيث ستجد الكثير من الشروحات للدروس في العديد من لغات البرمجة : https://wiki.hsoub.com/الصفحة_الرئيسية https://academy.hsoub.com/programming/
  22. لا يوجد فرق فقط إن ال -q تقوم بمنع طباعة رسائل حقوق الملكية والإصدار ليس إلا . حيث ستجد إذا كتبت بايثون فقط ظهور نص خاص بحقوق الملكية والإصدار : أما إذا كتبت -q لن يقوم بطباعة النص السابق . ولمعرفة ما هي وظيفة و الخيارات المتاحة في بايثون يمكنك كتابة python - h . وإذا كان هذا السؤال خاص بدرس من دروس الدورة فيرجى مستقبلا وضع سؤالك أسفل الدرس حيث يوجد صندوق للتعليقات كما هنا .
  23. المشكلة توجد في سطر 14 و سطر 22 حيث أنكي تستخدمين mysqli وليس PDO لذلك يجب وضعه القيمة بداخل الإستعلام SQL بدلا من كتابة علامة الإستفهام حيث هنا يظن أن علامة الإستفهام هي قيمة نصية وليس قيمة تريدين إستبدالها. لذلك يجب إستبدال سطر 14 بالتالي : $sql = "UPDATE studentinfomation SET username='$username', password='$password' WHERE password = '$password'"; وسطر 22 بالتالي : $sql = "SELECT * FROM studentinfomation WHERE password='$password'";
  24. يوجد عدة أخطاء في كتابة الكود . أولا في سطر 14 لا يوجد شئ يسمى $forsearch فى php يبدوا أنكي تريدين إستخدام foreach لذلك يجب إستبدال $forsearch ب foreach هكذا : foreach($_FILES['images']['tmp_name'] as $key => $tmp_name){ ثانيا في سطر 22 نسيتى كتابة علامة = لإضافة رسالة الخطأ : $errors[] = "حجم الملف كبير"; وأخيرا في سطر 31 نسيتي وضع علامة ال $ لتحديد المتغير errors : $errors[]= " ادخال فشل التحميل"; وهذا هو الكود كاملا بعد التعديل : <?php $servername = "localhost"; $username = "root"; $password = ""; $dbname = "student"; $conn = new mysqli($servername , $username , $password , $dbname); if($conn->connect_error){ die("فشل الاتصال : " .$conn->connect_error); } if (isset($_FILES['images'])) { $errors = []; $uploaded_File = []; foreach($_FILES['images']['tmp_name'] as $key => $tmp_name){ $file_name = $_FILES['images']['name'][$key]; $file_tmp = $_FILES['images']['tmp_name'][$key]; $file_type = $_FILES['images']['type'][$key]; $file_size = $_FILES['images']['size'][$key]; $upload_dir = 'uploads/'; $uploaded_File = $upload_dir . basename($file_name); if ($file_size >2000000) { $errors[] = "حجم الملف كبير"; continue; } if (move_uploaded_file($file_tmp,$uploaded_File)) { $stmt = $conn->prepare("INSERT INTO imags (image1, image2) VALUES (?,?)"); $stmt->bind_param("ss",$uploaded_File); if ($stmt->execute()) { $uploaded_File[]= $uploaded_File; }else { $errors[]= " ادخال فشل التحميل"; } $stmt->close(); }else { $errors[]=" فشل التحميل"; } } if (!empty($uploaded_File)) { header("Location:confessionscreen.php"); } if (!empty($errors)) { echo" خطا".implode(",",$errors);} } $conn->close(); ?>
  25. إن بايثون تستخدم الإزاحات (Indentations) لتنظيم الكود وتحديد الهيكل والتسلسل الزمني للتعليمات ولذلك فإن أي إزاحة أو مسافة خاطئة تٌحدث خطأ في ترتيب وتسلسل الكود فتظهر مشكلة IndentationError: unexpected indent . ويبدوا من الصورة المرفقة وجود مسافات قبل print("Samer" * 2) لذلك يجب حذف اي مسافة فارغة قبل كتابة أى سطر حتى لا تحدث تلك المشكلة.
×
×
  • أضف...