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

Adnane Kadri

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

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

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

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

    51

كل منشورات العضو Adnane Kadri

  1. مثل هذا السؤال يكون هو الأكثر ترددا عادة، فيما يلي بعض الخطوات العملية التي يمكنك القيام بها: اطلعي ووسعي نظرتك أكثر على مجالات البرمجة وتطوير البرمجيات. حددي مجالا تجدين نفسك تهتمين به. اطلعلي على مجموعة اللغات والادوات التي يهتم بها المشتغلون عن المجال. قارني واختاري تجميعة ادوات ولغات. ابدئي في التعلم من خلال الدورات المعترف بها والمعروفة. حسني مهاراتك . اعتمدي على الاستمرارية. لا تنسي التطبيق العملي والممارسة التطبيقية بجانب الكسب المعرفي النظري. ابحثي عن الشهادات المعترف بها. يمكنك الاستزادة بالقراءة من هنا:
  2. فكرة الدوال في الأصل أساسا هي في تمكين القدرة على اعادة استعمال وتنفيذ كتلة برمجية، فهي مجموعة من الأوامر تدل على وظيفة أو مهمة معينة مهيكلة في دالة. بعض هاته الدوال قد تقوم بحدث معين مثل ارسال رسالة بريد الكتروني أو عرض رسالة نجاح في الشاشة، في حين أن بعضها الآخر يعيد خرجا ويترتب عنها عائد، يمكن استعمال هذا العائد في مكان آخر في الشيفرة. لنقل مثلا أن هنالك دالة تقوم باستخراج اسم مستخدم ما انطلاقا من عنوان بريده الالكتروني، بحيث نستعمل هذا الاسم في عرضه على شاشة المستخدم. الآن هذه العملية تحتاج تقسيم مهام وتنظيما بحيث: تكون هنالك دالة لجلب البريد الالكتروني تكون هنالك دالة لجلب الاسم تكون هنالك دالة لطباعة الاسم حتى يحصل هذا الارتباط بين هاته الدوال، وحتى يمكن معالجة المدخلات المختلفة يتطلب من هاته الدوال أن تقوم بمنطق معين ثم تعيد لنا قيما. فدالة جلب البريد الالكتروني يفترض أن تعيد قيمة سلسلة نصية تعبر عن عنوان البريد الالكتروني. في حين أن دالة جلب الاسم يفترض أن تعيد قيمة سلسلة نصية تعبر عن اسم المستخدم. وأخيرا تقوم دالة الطباعة بطباعة الاسم على الشاشة. لتحديد ما نريد أن نعيده من داخل الدالة، نقوم فقط باضافة عبارة return إليه.
  3. بخصوص مشكلة ترتيب الحقول، قم بإعادة ترتيب الحقول في النموذج بالترتيب الصحيح وفقًا لترتيب العناصر في الكود. يمكنك تبديل مكان حقل "الباسوورد" ووضعه بعد حقل "اسم المستخدم" حتى يتوافق مع الترتيب الصحيح الذي تريده. أما بخصوص عناصر الاختيار النصية قم بإضافة نص لعناصر الاختيار النصية (Radio Buttons) بوضع النص بين علامتي الفتح والإغلاق لعناصر الـ <label> المرتبطة بكل عنصر اختيار نصي. على سبيل المثال، يمكنك تحديد النص لعنصر الاختيار النصي "star" كالتالي: <input type="radio" id="star" name="Plan" value="star"> <label for="star">Star Plan</label> أما عن المشكلة الأخيرة بخصوص زر الاشتراك، يرجى التأكد من وجود قواعد CSS أو أنماط لتنسيق الأزرار وظهورها بشكل صحيح. يمكنك إضافة قواعد CSS للأزرار أو استخدام مكتبة تنسيق جاهزة مثل Bootstrap لتحقيق تنسيق جميل ومتناسق للأزرار.
  4. يفترض بالأمر الطبيعي لتشغيل خادم التطوير أن يكون: npm run start و لي: npm start أيضا تأكد من أن المشروع الذي تحاول تشغيل هذا الأمر فيه هو مشروع رياكت، إذ أنك لا تريد تنفيذ هذا الأمر لمجرد تنفيذه وفقط. أيضا يظهر من الصورة السابقة أنك تضع ملف package.json داخل مجلد فرعي. تخلص من ذلك وضعه على نفس مستوى الملفات والمجلدات الأخرى.
  5. لا يوجد أي مشكلة، هذا هو الخرج الطبيعي للأمر npm run dev في نسخ لارافيل المتأخرة. اذ أن لارافيل أصبح يستعمل vite كمجمع وحدات وخادم تطوير للواجهة الأمامية بديلا عن laravel-mix سابقا. فالأمر: npm run dev يقوم بتشغيل خادم vite للتطوير. ان كنت تحاول تحزيم ملفات الأصول وتخريجها يمكنك تنفيذ الأمر: npm run build بدلا منه. اقرأ أكثر عن تفاصيل هذا التبديل:
  6. طبعا فإنك لن تحتاج أي لغة أخرى لتعلم لغة معينة بطبيعة الحال، ولكن قد يعينك التخصص في مجال ما على تعلم لغة بايثون من ناحية معينة، مثلا: ستحتاج HTML , CSS , JS لإستعمال بايثون في تطوير الويب الشامل. SQL, R لإستعمال بايثون في علم البيانات وتحليلها. أساسيات الريضايات والإحصاء بجانب بايثون للتعلم الآلي والذكاء الصناعي. تصاميم المستويات والألعاب وأساسيات الرياضيات والجبر والاحصاء بجانب بايثون لتطوير الألعاب. مفاهيم الأتمتة وبرامجها لإستعمال بايثون في الأتمتة وتطوير البرامج. معروف أن لغة مثل بايثون تشتغل في العديد من المجالات وتحوز على العديد من المكتبات الضخمة التي تحظى بشعبية كبيرة. ولذلك فإن تعيينك للمجال الذي تريد أن تشتغل فيه يمكنه أن يحدد مجموعة الأشياء التي تعينك على التخصص أكثر في بايثون، أما ان كنت تقصد معرفة عامة باللغة فلا يجب عليك أي من ذلك، يمكنك اختيار اي كورس والبدء فيه مباشرة.
  7. يمكن استخدام طرق متعددة لتعيين شفافية اللون في CSS. إليك بعض الطرق الشائعة: استخدام قيمة rgba: يمكنك استخدام الوظيفة rgba لتعيين لون مع قيمة ألفا (شفافية). يتم تحديد الألفا بين 0 و 1، حيث يكون 0 غير شفاف و 1 غير شفاف. مثال: background-color: rgba(0, 0, 0, 0.5); /* أسود مع شفافية 50٪ */ استخدام قيمة hsla: تشبه وظيفة rgba ولكنها تستخدم قيمة اللون في نموذج HSL (صبغة، تشبع، سطوع) بدلاً من نموذج RGB. يمكن تحديد الشفافية بنفس الطريقة باستخدام قيمة ألفا. مثال: background-color: hsla(240, 100%, 50%, 0.5); /* أزرق مع شفافية 50٪ */ استخدام قيمة transparent: يمكنك استخدام القيمة transparent لتعيين اللون كمستوى شفافية كاملة. مثال: background-color: transparent; /* شفاف بالكامل */ استخدام خاصية opacity: يمكنك استخدام خاصية opacity لتعيين مستوى شفافية للعنصر بأكمله بما في ذلك المحتوى. تؤثر هذه الخاصية على العنصر وجميع عناصره الفرعية. قيمة الشفافية هي رقم بين 0 و 1، حيث يكون 0 غير شفاف و 1 غير شفاف. مثال: opacity: 0.5; /* شفافية 50٪ */ نوع البيانات <color>
  8. مرحبا مهند، أنقل سطر تضمين ملف auth.php إلى أعلى الصفحة وتحديد قبل المسار التالي: Route::get('/{user:username}' , [UserController::class, 'index'])->middleware('auth')->name('user_profile'); فيكون كاملا: require __DIR__.'/auth.php'; Route::middleware('auth')->group(function () { Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit'); Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update'); Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy'); }); Route::get('/explore' , [PostController::class, 'explore'])->name('explore'); Route::post('/p/{post:slug}/comment', [CommentController::class, 'store'])->name('store_comment')->middleware('auth'); Route::controller(PostController::class)->middleware('auth')->group(function(){ Route::get('/' , 'index')->name('home_page'); Route::get('/p/create', 'create')->name('create_post'); Route::post('/p/create', 'store')->name('store_post'); Route::get('/p/{post:slug}' , 'show')->name('show_post'); Route::get('/p/{post:slug}/edit' , 'edit')->name('edit_post'); Route::patch('/p/{post:slug}/update' , 'update')->name('update_post'); Route::delete('/p/{post:slug}/delete' , 'destroy')->name('delete_post'); }); Route::get('/{user:username}' , [UserController::class, 'index'])->middleware('auth')->name('user_profile'); ثم نفذ الأمر: php artisan route:clear لمحو التخزين المؤقت للمسارات، وأعد تشغيل artisan serve وسيعمل معك بشكل طبيعي. ان كنت مشترك في دورة PHP في الأكاديمية، ففيما يلي تفاصيل المشكلة:
  9. يمكنك بجانب المقترح أيضا اضافة حقل بولياني باسم is_approved يعبر عن ما ان كان المنشور موافقا على نشره أو لا. بحيث سيمكنك لاحقا التعديل على هاته القيمة فقط لنشره، أو جلب المنشورات التي قيمة is_approved فيها هي true فتكون هي المنشورات الموافق على نشرها. CREATE TABLE posts ( id INT NOT NULL AUTO_INCREMENT, post_title VARCHAR(255) NOT NULL, is_approved BOOLEAN NOT NULL DEFAULT FALSE, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) );
  10. الاختصارات كثيرة، يمكنك فتح القائمة الخاصة بها من خلال الضغط على CTRL + K , CTRL + S واستعراضها كاملة. كما ويمكنك بطبيعة الحال تخصيصها وفق استعمالاتك الخاصة أو وفق ما يليق بك أو وفق ما أنت معتاد عليه.
  11. سوف لن يحصل أي شيء مادمت لم تقم بالتقديم على الفعل، فبعد اتمام الدورة والتحصل على الشهادة سوف يمكنك التسجيل في مواقع العمل الحر والبدء في التقديم على المشاريع التي تناسب المهارات التي اكتستبها. وببعض من الجهد والصبر سوف تبتدأ أولى مشاريعك وتنطلق في مسيرتك العملية. أما بخصوص المشاكل. فستحتاج دوما للمساعدة وسوف تصادف مشاكل مستجدة بشكل دائم، ولن تتوقف المشاكل عن الظهور. ولهذا يوجد مثل هاته المجتمعات البرمجية، أين يساعد المطورون والمبرمجون بعضهم البعض ويشاركون خبراتهم. ففي أكاديمية حسوب يمكنك استعمال قسم الأسئلة العامة لطرح انشغالاتك أو المشاكل التي تصادفها وسوف يحاول المدربون تقديم اجابات شافية. فأنت ستستمر في التعلم بشكل مواز مع العمل فقط. وهو الأمر الذي يعمل به معظم المشتغلين في المجال من مختلف التخصصات.
  12. الطريق واضحة، تعلم القدر الكافي وابدأ بالتقديم على المشاريع التي تحس أنك قادر على انجازها، وطور مهاراتك في خلال ذلك. إليك أيضا بعض الخطوات التي يمكنك اتباعها: حدد أهدافك: قم بتحديد أهدافك المهنية بوضوح. حدد ما ترغب في تحقيقه وما الذي تريد أن تصبح عليه. حلل مهاراتك: قم بتقييم مهاراتك وقدراتك الحالية. حدد المجالات التي تجيدها والمجالات التي تحتاج إلى تطوير. تعلم باستمرار: استثمر في تطوير مهاراتك وزيادة معرفتك في مجال عملك المفضل. قم بالتدريب على الأدوات والتقنيات الجديدة وتواصل مع المجتمع المهني ذو الصلة. قم ببناء شبكة علاقات: قم ببناء شبكة علاقات احترافية قوية. التواصل مع الناس في مجال عملك المفضل وتوسيع دائرة معارفك سيساعدك في الحصول على فرص جديدة ومشاريع. لا تنسى التسويق الذاتي: قم بتسويق نفسك وخدماتك بشكل فعال. أنشئ ملف شخصي احترافي وقم بإنشاء حسابات عبر الإنترنت لعرض أعمالك ونشاطك المهني. طور فكر الابتكار واستعد دوما للتغيير: كون مرنًا ومستعدًا للتغيير. ابحث عن فرص جديدة وقم بتطوير أفكار إبداعية للابتكار في مجال عملك. خذ الاستشارة والتوجيه: ابحث عن مرشدين أو مستشارين ذوي خبرة في العمل الحر للحصول على المشورة والتوجيه. يمكنهم مشاركة خبراتهم ونصائحهم لمساعدتك في تحقيق أهدافك، قد يكون ذلك بصورة مباشرة بشكل سؤال وجواب أو نقاش، أو قد يكون بمجرد الاستفادة من خبراتهم من خلال قراءة تدويناتهم أو متابعة حساباتهم المهنية أو فيديوهاتهم او ما الى ذلك.
  13. مرحبا عمرو، ينبغي أولا فهم ما تقوم به القيمة block لعناصر a داخل عناصر القائمة، خاصية block في CSS تُستخدم لتحديد كيفية سلوك عنصر HTML في عرضه وتوزيعه داخل العنصر الأب وليس داخل عنصر body، فإعطاء عنصر ما هاته الخاصية سيجعله عنصرا كتليا (بمعنى أنه سيمتد على كامل العرض الحاوي الخاص به). وهو نفس ما اختبرناه في المثال المرفق، فعناصر a أخذت كامل عرض حاويها المباشر وهو العنصر list-inline-item. جرب أزلها وستلتمس سبب قيامنا بإعطاءنا إياها. أما عن inline-block التي يتم تطبيقها على عنصر list-inline-item من بوتستراب فهي خاصية تمكن العنصر من سلوك نفس سلوك العناصر السطرية من حيث تواجدها على نفس السطر ومن جهة ثانية من سلوك نفس سلوك العناصر الكتلية من حيث تحديد العرض والارتفاع وما الى ذلك. تلخيص: جعلنا من عناصر a تأخذ كامل عرض حاويها المباشر list-inline-item وأعطينا هاته الأخيرة امكانية أن يتم تحديد عرض وارتفاع لها.
  14. مشكلتك غير واضحة جيدا، فهي تحتاج توصيفا واضحا. ولكن الشيفرة الخاصة بك تمتلك بعض المشاكل هي: أصلح تضمين useState فأنت تكتبها كـ usetate بدون S كبيرة. import React, {useState} from 'react' أزل واحدا من تضميني React واترك واحدا فقط، import React from 'react' import React, {useState} from 'react' الحظ أنه بحذف الثاني ستحتاج استيراد وحدة useState، ولذلك يفضل حذف الأول مباشرة. أصلح استعمال useNavigate لتصبح: let navigate = useNavigate(); فأنت تكتبها بـ n صغيرة. نفس الشيء بخصوص useFormik: let formik =useformik({ ^ و نفس الشيء هنا: let [statusErrors,setStatusErrors] =usestate('') ^ وهنا أيضا: let {errors, set errors} = usestate ([]) ^ هاته هي أخطاء السياق التي تقوم بها بشكل مبدئي، فشيفرتك بحاجة الى تنقيح أولا. في حالة استمرار اي مشكلة يرجى ارفاق نص المشكلة كاملا.
  15. بدون أي اضافة او خدمة خارجية؟ الـ downtime لا بد منه، ولو جزءا من الثانية. وصحيح، قد يمكن تقليله بالتزام بعض الممارسات ولكن لا أحسب أنه يمكن تحقيق zero downtime إلا ببعض خدمات الطرف الثالث التي تتوفر على تقنيات ادارة الحمل load balanceers والتنصيب المتعدد Multisite deployment وغيرها من ممارسات zero downtime. يذكر في توثيق لارافيل مثلا خدمات من مثل: envoyer laravel vapor أجدها خيارات ممتازة ان كنت تريد تحقيقه. في العادة، قد يحدث لمجرد ثواني قليلة، في حالة تعدي ذلك او أخذ وقت طويل يحتمل أن تكون المشكلة متعلق بشيء آخر تماما.
  16. جرب استعمال المتغير liked الذي لديك في التصيير الشرطي لزر الإعجاب أو يكفي ال handler الخاص بضغطة الزر: <button className={`btn-primary`} onClick={liked ? handleAddLove : handleRemoveLove}> <Image src="/heart-icon.svg" alt="heart icon" width={30} height={30} /> </button> قد يمكنك ايضا استعمال نفس الشيء في تمييز تنسيقات زر الإعجاب عن زر الغاء الإعجاب. انتبه الى اضافة handler آخر هو handleRemoveLove يقوم بنفس ما يدل عليه، أي ازالة الإعجاب.
  17. الاختصار في تقديم رؤوس أقلام دون التوسع مقصود، فبعض مفاهيم البرمجة يمكن التوسع في شرحها والتعرض لها بشكل شاسع جدا، الأمر الذي يبعد الطلبة عن مضمون المسار في نفسه ويشتتهم، وهو دراسة الأساسيات. ولذلك تجد الدورات تتحدث عن الأهم فقط. اذ أن مستواهم يناسب ذلك، والغلو في الشروحات والتعرض لمفاهيم أكثر تعقيدا قد يبعدهم حتى عن فهم المضمون الرئيسي للدرس. هذا بجانب أنهم لا يحتاجونها في بادئ الأمر. يتم الاعتماد على التدرج في طرح المادة العلمية بحسب تعقيدها، فالدورة لازالت طويلة ولا يجب عليك الاستعجال. فقد تأخذ من الأساسيات في مسارات هي غير مسارات الأساسيات. أيضا، يمكنك طلب المساعدة أو التوضيح بخصوص أي جزئية لم تفهمها في قسم تعليقات الطلبة وسوف يتابع معك المدربون.
  18. الخطأ الذي تحتويه الرسالة يشير إلى عدم تطابق التوقيع (signature) لدالة الـ useReducer مع الـ reducer الخاص بك. يبدو أن هناك عدم تطابق في نوع المعاملات الممررة عبر الـ useReducer. يحتمل أن يكون ذلك بسبب أن الوظيفة reducerFunction تعيد undefined بشكل افتراضي، أضف استعلام return الى عبارة default: default: return state;
  19. استفسارك صائب وفي محله، ولكن كلتا الطريقتين تمتلك ميزات تختلف بها عن الأخرى، بحيث أن تعلم تقنيات الويب آر تي سي: يمكنك من إنشاء أنموذج مصغر MVP يتم التوسع فيه مستقبلا يخدم معايير مثل قابلية التوسع وقابلية التخصيص والصيانة وما الى ذلك. يغنيك من امتلاك ميزات جانبية لا تخدم حالات استخدام معينة لديك، بحيث يكون تطوير النظام موجها بحالات الاستخدام التي لديك. خيار مجاني وسهل. في حين أن استعمال خيارات جاهزة لبث الفيديوهات من مثل الذي ذكرت يعطيك: اختصارا للوقت والجهد الماما بميزات عدة قد يأخذ العمل عليها منك وقتا التخلص من مشاكل الصيانة والمتابعة الدورية أجد أيضا أن مبالغ الاشتراكات المطلوبة مرتفعة قليلا مقابل مثل هاته الخدمات، قد يكون من الصائب البحث عن بدائل أقل كلفة. نذكر مثلا: Google Cloud Pub/Sub Azure Media Services Wowza Streaming Engine IBM Watson Media عن نفسي، كنت لأفضل اعتماد اشتراك مؤقت ضمن أي خدمة مدفوعة من الخدمات المذكورة أعلاه لاختبار تجربة العملاء، وفي نفس الوقت العمل بشكل موازي على أنموذج خاص بكم يتم تطويره كمنتج مستقل تماما، وأخيرا اعتماده بشكل تدريجي والتطوير فيه مستقبلا. خصوصا وأن حالة الاستخدام المراد خدمتها ها هنا بسيطة تقريبا، فأنت تبحث عن بث فيه مشاركة للشاشة والمايكات فقط. بل وحتى أن اعتماد Google meet للقيام بمثل هاته الاجتماعات يعد خيارا جيدا، فهو في الأخير يخدم حالة الاستخدام المراد العمل عليها. خذ الأمر بسلاسة ومرونة، ركز فقط على انشاء برمجيات تستوفي شروط الشيفرة النظيفة كل شيء فيها قابل للاستبدال، الصيانة، التوسع والتطوير. وكل شيء سيكون بسيطا.
  20. يمكنك الاستعانة بقراءة الخاصية insert_id للتحصل على آخر معرف ID تم ادراجه بقاعدة البيانات، استعملي ذلك بعد استعلام الادراج الخاص بك بشكل مباشر، فيكون: //شيفرة الإدراج $targetId = $conn->insert_id; echo 'المعرف الخاص بآخر صف مدرج هو: '.$targetId; طبعا يمكنك التوسع في الفكرة أكثر، مثل طباعة المتغير أو استعماله بشكل آخر.
  21. هل تقصد بحسب التوثيق الرسمي؟ لا يتوفر ذلك. هي مجرد طريقة لاستعمال التابع directive وللتعامل مع واجهة التطبيق البرمجية لكائن Vue فقط، ابحث عن how to register global directive in vue js وستجد أمثلة مشابهة.
  22. مشكلتك تحديدا كانت في أنك قد أنشات نموذج Vue في حين أنك قد قمت بتهيئة الموجه directive في Vue instance آخر تماما. // directives.js // first vue instance const app = createApp(App) و: import glob from './directives' glob() // main.js // second vue instance const app = createApp(App) وبما أن الثاني هو ما يتم عمل mount له مع المكون الجذر app# فلن يتم بطبيعة الحال التعرف على الأول، وبالتالي لن يتم تسجيل الموجه أبدا.
  23. حسن، فيما يلي الطريقة الصحيحة لذلك: عدل ملف directives.js ليصبح: const globalexternal = { mounted: function (el) { el.placeholder = 'Global Custom Directive from external file' } } export default globalexternal; في ملف main.js قم باستيراد الموجه وسجله باستعمال التابع directive: import globalexternal from './directives' const app = createApp(App) app.directive('globalexternal' ,globalexternal) app.mount('#app') استعمل الموجه في أي ملف فرعي: <input v-globalexternal style="width: 370px" />
  24. لا أظن أن هنالك تغيير من حيث استعمال الموجهات directives ما بين vue 3 و vue 2 . يحتمل أن يكون ذلك بسبب استعمال الخطاف mounted، جرب استعمال beforeMount أو created: app.directive('globalexternal', { created: function (el) { أيضا قد تكون المشكلة بسبب طريقتك في الوصول الى الخاصية placeholder، فالعنصر المستقبل كمعامل أول el هو عنصر DOM الذي يتم ربطه بالموجه bound element. جرب استعمال السياق التالي: mounted: function (el) { el.setAttribute('placeholder' ,'Global Custom Directive from external file') }
  25. سؤالك عام جدا، ويخضع للكثير من المتغيرات الأخرى. ولكن فيما يلي توجيه عام للقيام بذلك: قم باستلام بيانات المستخدم من النموذج form. قم بإنشاء اتصال مع قاعدة البيانات. قم بإجراء التحقق من نوع المستخدم، وذلك بحسب قيمة حقل الادخال الخاص بالنوع. قم بتحضير الاستعلام وتنفيذ عملية الادراج. تحقق من نتيجة الاضافة وتصرف بناءا عليها، كعرض رسالة نجاح أو اعادة توجيه الى صفحة جديدة. أغلق اتصال قاعدة البيانات. فيما يلي مثال عملي: <?php // استلام بيانات المستخدم من النموذج $userType = $_POST['user_type']; $username = $_POST['username']; $password = $_POST['password']; // الاتصال بقاعدة البيانات $conn = mysqli_connect("localhost", "username", "password", "database_name"); if (!$conn) { die("فشل الاتصال بقاعدة البيانات: " . mysqli_connect_error()); } // إجراء التحقق من نوع المستخدم والإضافة إلى الجداول المناسبة if ($userType == 'doctor') { // إضافة الطبيب إلى جدول الأطباء $query = "INSERT INTO doctors (username, password) VALUES ('$username', '$password')"; $result = mysqli_query($conn, $query); // إضافة الطبيب إلى جدول المستخدمين $query = "INSERT INTO users (username, password, user_type) VALUES ('$username', '$password', 'doctor')"; $result = mysqli_query($conn, $query); } elseif ($userType == 'patient') { // إضافة المريض إلى جدول المرضى $query = "INSERT INTO patients (username, password) VALUES ('$username', '$password')"; $result = mysqli_query($conn, $query); // إضافة المريض إلى جدول المستخدمين $query = "INSERT INTO users (username, password, user_type) VALUES ('$username', '$password', 'patient')"; $result = mysqli_query($conn, $query); } // التحقق من نتيجة الإضافة if ($result) { echo "تمت عملية الإضافة بنجاح!"; } else { echo "حدث خطأ أثناء الإضافة."; } // إغلاق اتصال قاعدة البيانات mysqli_close($conn); ?>
×
×
  • أضف...