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

ياسر مسكين

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

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

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

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

    3

كل منشورات العضو ياسر مسكين

  1. ال Unit Tests هي اختبارات برمجية للتحقق من أن كل وحدة صغيرة من الكود (مثل الدوال أو التوابع) بحيث تعمل كما هو متوقع فيقوم المطور بكتابة اختبار يعطي مدخلات ويقارن النتائج المتوقعة مع النتائج الفعلية للوحدة. وهذا لتحسين جودة الشيفرة وتسهيل الصيانة والتطوير والكشف المبكر عن الأخطاء يمكنك التعرف أكثر عليها من خلال:
  2. أعتقد أنّ ما تمرّ عليه أمر طبيعي أن تشعر ببعض الشكوك أو التساؤلات حول الطريقة الأفضل للتعلم فهذه الشكوك قد تبدو وكأنها أوهام، لكنها في الواقع جزء طبيعي من رحلة التعلم، فكلّنا مررنا بهذه المرحلة حينما يستصعب علينا تعلّم بعض المفاهيم فنتوهّم أنّه لو كانت الأمور تسير بشكل مغاير لاستفدنا أكثر لكن في الحقيقة الأسلوب المعتمد في الأكاديمية في دوراتها ودروسها هو نهج معتمد ومدروس ولا يمكن نسفه. كما أنّه ليس من المعقول في أيّ دورة أن تبدأ بالجانب التطبيقي مباشرة، فيجب أن يتمّ التطرّق للمفاهيم البرمجية والمنطقية قبل الدخول في المشاريع وهذا ما يتمّ اعتماده، ثمّ يتمّ تطبيق تلك المفاهيم على مشاريع منتقاة تعالج الإشكاليات التي قد تكون واجهتك في الجانب النظري. بالنسبة لرأيك هنا: توجد ثلّة من المدربين متوفّرون على مدار الساعة لأيّ استفسار يواجهك أثناء مرحلة التعلم من بينها هذه الأسئلة ويمكن إرشادك وتوجيهك، لكن كنصيحة فقط فمع مرور الوقت والتعلم ستدرك بأنكّ لست بحاجة لدرس كامل ليقول لك ذلك، لأنّك ستعرف ذلك بنفسك مع مرور الوقت والتعلم المستمر، ومن عنوان المشروع ستعرف بأنك ستحتاج إلى قاعدة بيانات أو لا تحتاج لذلك، وربما ستستخدم التخزين المحلي فقط وهكذا.
  3. هذا الخطأ ناتج عن محاولة الاتصال بخادم يستخدم بروتوكول SSL أي HTTPS عبر بروتوكول غير مشفر كهذا (HTTP) لهذا يجب عليك استخدام البروتوكول الآمن عند الوصول إلى phpMyAdmin. حاول إدخال العنوان التالي في متصفحك والمحاولة مرة أخرى: https://localhost:443/phpmyadmin
  4. لا مشكلة، يمكنك استخدامها وهذا لا يغير من حقيقة أنه يجب أن يكون هنالك برامترين في الدالة read_sql الأول فيه الاستعلام والثاني خاص بالاتصال بقاعدة البيانات الذي عملته بال mysql لذا يمكنك تغيير الاستيرادت لتتوافق مع ما تستخدمه. import pandas as pd import mysql.connector
  5. الخطأ يشير إلى أن دالة pd.read_sql() تتطلب وسيطين على الأقل وهما كالتالي: الاستعلام SQL: مثل "SELECT * FROM table_name" الاتصال بقاعدة البيانات: والذي يتم تمريره كوسيط ثان وهو (المتغير con). والسبب في ظهوره أنه إذا كنت قد استدعيت pd.read_sql() بدون تقديم الاتصال أي مثلا إذا كان لديك فقط pd.read_sql("SELECT * FROM table_name") بدون المتغير conn)، سيظهر هذا الخطأ. لهذا وكما أشرت لك سابقا، عدّل السطر المسؤول عن هذه الدالة إلى التالي: heart = pd.read_sql("SELECT * FROM table_name", conn)
  6. يجب أولا أن تقوم باستيراد مكتبة pandas في بداية الكود هكذا: import pandas as pd لكن استخدام pd.read_sql يتطلب منك تحديد الاتصال بقاعدة البيانات لذا يجب عليك استخدام sqlite3 لإنشاء اتصال: import pandas as pd import sqlite3 conn = sqlite3.connect("Data-Heart-Disease/heart.db") heart = pd.read_sql("SELECT * FROM table_name", conn) print(heart.head()) بطبيعة الحال مع استبدال table_name باسم الجدول الصحيح داخل قاعدة البيانات. ويجب أن يكون المسار التالي صحيحا، لاحظ أنك استخدمت علامة \ بشكل عكسي لذا قم بعكسها وعدلها كالتالي: Data-Heart-Disease/heart.db يجب أولا أن تقوم باستيراد مكتبة pandas في بداية الكود هكذا: import pandas as pd لكن استخدام pd.read_sql يتطلب منك تحديد الاتصال بقاعدة البيانات لذا يجب عليك استخدام sqlite3 لإنشاء اتصال: import pandas as pd import sqlite3 conn = sqlite3.connect("Data-Heart-Disease/heart.db") heart = pd.read_sql("SELECT * FROM table_name", conn) print(heart.head()) بطبيعة الحال مع استبدال table_name باسم الجدول الصحيح داخل قاعدة البيانات. ويجب أن يكون المسار التالي صحيحا، لاحظ أنك استخدمت علامة \ بشكل عكسي لذا قم بعكسها وعدلها كالتالي: Data-Heart-Disease/heart.db
  7. الأمر بسيط فقط استخدم ملف .gitignore فهذا الملف سيسمح لك بتحديد الملفات أو المجلدات التي تريد تجاهلها بحيث لا يتم تتبعها أو رفعها إلى المستودع أولا قم بإنشاء الملف عبر كتابة الأمر التالي وتنفيذه: touch .gitignore وداخل ملف .gitignore أضف اسم الملف الذي تريد تجاهله من خلال فتح الملف في محرر النصوص فعلى سبيل المثال، إذا كان اسم الملف هو file1.txt أضف هذا السطر إلى .gitignore: file1.txt ثم احفظ الملف وأغلقه وللتأكد من ذلك نفذ هذا الأمر: git status سيظهر الملف الذي تجاهلته ضمن الملفات غير المتتبعة.
  8. لا يمكن الجزم بفترة يومية محددة للتعلّم ومتابعة الدروس، فهذا الأمر راجع إليك، ولطريقة جدولتك لمهامك اليومية، فالوقت الذي تراه مناسبا للتعلم ومتابعة الدروس وتجد نفسك متحمّسا لذلك قم مباشرة وتابع الدرس دون تردّد أو تسويف أو تأجيل، فالمهم هو أن تبدأ وليس متى تنتهي، فحينما تكون متحمّسا ستتابع دروسك ولن تحسّ بالوقت نفسه، أما إن قمت بالتفكير في موعد إكمالك للدروس بأسرع وقت ممكن فقد لا تحصّل الفائدة المرجوّة منها لذلك أنصحك بالتركيز على التعلم فلا يوجد وقت أو صلاحية محدّدة للدورة فصلاحيتها مدى الحياة لهذا لا تتسرّع وقم بدراسة دروسك بتريّث مع التطبيق على مشاريع حقيقية وعلى المشاريع التي يتمّ تدريسك عليها هنا في الدورة مع المدرب مع الحرص على الاستمرارية في التعلم. توجد عدة مقالات ستساعدك على التركيز أكثر وتجاوز هذه المسألة من هنا:
  9. ياسر مسكين

    Php

    العفو، على مستوى الأكاديمية لا يوجد لكن يمكنك الاطلاع على موسوعة حسوب أين ستجد العديد من المقالات المجانية والمفتوحة للجميع سواء لدراسة لغة PHP أو غيرها من اللغات رابطها من هنا: موسوعة حسوب PHP.
  10. توجد طرق عديدة لعمل ذلك، لكن الأبسط والأسهل هي عن طريق استخدام دالة input() بالشكل الذي يسمح لك بإدخال البيانات جنبا إلى جنب في سطر واحد ثم يمكنك القيام بذلك عن طريق قراءة السطر ذاته كاملا ثم تقسيمه إلى أجزاء ففرضا عندما يدخل المستخدم البيانات بهذا الشكل 5 + 10، سيتم تقسيم المدخلات إلى ثلاثة أجزاء: 5 و + و 10، ومن ثم يتم تحويل الأرقام إلى أعداد صحيحة على هذا النحو: # اطلب من المستخدم إدخال البيانات على سطر واحد user_input = input("أدخل العملية (مثال: 5 + 10): ") # قسم المدخلات بناءً على الفراغات num1, operation, num2 = user_input.split() # تحويل الأرقام من نصوص إلى أعداد صحيحة num1 = int(num1) num2 = int(num2) # يمكنك الآن استخدام num1 و operation و num2 كما تريد print(f"العملية: {num1} {operation} {num2}")
  11. ياسر مسكين

    Php

    مرحبا عمر، يتمّ الإجابة على الأسئلة في هذا القسم بشكل عادي، فالأسئلة التي تتعلّق بأسئلة الدورات يتمّ توجيه أصحابها وتنبيههم لضرورة طرحها في صندوق التعليقات الخاص بكلّ درس، ويتمّ الإجابة عن أسئلتهم بكل رحابة صدر. في حين الأسئلة العامة فيتمّ الإجابة عنها هنا وفقا لتوفّر المدرّبين فلو لاحظت أنّ سؤالك لم يتمّ الإجابة عنه فهذا قد يكون بسبب ضغط لدى المدرّبين وسيقومون بالإجابة عنه في أقرب وقت ممكن، لذلك لا تقلق ولا تخف فالأمر ليس شخصيا ولا يستدعي ذلك. لكن بعض الأسئلة قد لا تتوفّر على شروط معينة لذا ينبغي دائما مراجعة الأسئلة قبل نشرها، فربّما هو سؤال مكرّر أو تمّت الإجابة عنه سابقا من قبل أحد المدربين وهذه المقالة شاملة لهذا الأمر: https://support.academy.hsoub.com/questions-and-answers
  12. هذا يعتمد على ما إن قد قمت بالفعل بإنشائها سابقا وإلا فلن تجدها، على كلّ يمكنك التوجه إليها من خلال فتح إعدادات النظام ثم: اضغط على زر ابدأ. انقر بالزر الأيمن على الكمبيوتر واختر خصائص. بعدها الوصول إلى حماية النظام ففي نافذة الخصائص، ابحث عن خيار حماية النظام في القائمة الجانبية وانقر عليه وفي علامة التبويب نظام الحماية، سترى قائمة بمحركات الأقراص يمكنك التحقق من حالة الحماية على القرص الذي يحتوي على نظام التشغيل (عادة يكون C:). إذا كانت الحماية مفعلة، فستكون هناك نقاط استعادة متاحة. لعرض نقاط الاستعادة اضغط على زر استعادة النظام بعد ذلك اضغط على التالي وستظهر لك قائمة نقاط الاستعادة إذا كانت متاحة.
  13. في الحقيقة، من الصعب استرجاع الملفات المحذوفة على نظام الوينداوز بنسخته 7 بدون استخدام برامج، خاصة إذا مضى وقت طويل على حذفها فنظام التشغيل كما نعلم لا يحتفظ بالملفات المحذوفة لفترة طويلة، وغالبا ما يتم الكتابة فوقها ممّا يتسبب في فقدانها، لذا تحقق أولا في سلة المهملات فإذا كانت الملفات موجودة هناك، يمكنك استعادتها بسهولة. وفي حال ما إذا كنت قد عملت نقاط استعادة من قبل في نظامك أو ما يعرف بال Backup، يمكنك محاولة استعادة النظام إلى نقطة سابقة كذلك، وفي حال لم يكن الأمر مساعدا يمكنك تجربة البرامج المعروفة في استرجاع البيانات والتي في الغالب منها المدفوعة وحتى استخدامها عادة لا يتمّ الاسترجاع 100 بالمائة إلا في حالات معينة: Recuva: برنامج مجاني وسهل الاستخدام. EaseUS Data Recovery Wizard: يقدم نسخة مجانية مع حدود على كمية البيانات المسترجعة. Disk Drill: يحتوي على واجهة مستخدم بسيطة ويعمل جيدا مع أنواع مختلفة من التخزين.
  14. بالنسبة لسؤالك الأول، يمكنك استخدام خاصية @font-face لتعريف الخطوط المخصصة بعد التأكد من تحميلك لملفات الخطوط بصيغ مناسبة مثل .ttf أو .woff. يمكنك استخدام @font-face لتعريف كل خط، ثم استخدامه في أنماط CSS التي تريد بهذا الشكل التالي: @font-face { font-family: 'MyCustomFont1'; src: url('fonts/MyCustomFont1.woff2') format('woff2'), url('fonts/MyCustomFont1.woff') format('woff'); font-weight: normal; font-style: normal; } @font-face { font-family: 'MyCustomFont2'; src: url('fonts/MyCustomFont2.woff2') format('woff2'), url('fonts/MyCustomFont2.woff') format('woff'); font-weight: normal; font-style: italic; } /* استخدام الخطوط في العناصر */ body { font-family: 'MyCustomFont1', sans-serif; } h1 { font-family: 'MyCustomFont2', serif; } أما بالنسبة للشق الثاني من سؤالك، فنستخدم علامات الاقتباس ('' أو "") عند تعريف اسم الخط داخل خصائص CSS، مثل @font-face أو font-family. وذلك لعدة أسباب: إذا كان اسم الخط يحتوي على مسافات أو أحرف خاصة، يجب وضعه بين علامات الاقتباس لتحديده كاسم واحد. ولضمان التوافق فيضمن استخدام علامات الاقتباس أن المتصفح سيفهم الاسم بشكل صحيح بغض النظر عن الأحرف. وهذان مثالان عن ما كنت أتحدث عليه: اسم خط بدون مسافات: font-family: MyFont, sans-serif; اسم خط مع مسافات: font-family: 'My Custom Font', sans-serif; فاستخدام علامات الاقتباس ضروري في الحالة الثانية، ولكن في الحالة الأولى يمكن استخدام الاسم بدونها.
  15. إرسال رسائل بريدية إلى 500,000 مستلم يتطلب عملا خاصا في حال كنت ترغب في تحقيق أفضل النتائج وتجنب المشاكل خاصة تلك المتعلقة بالسبام وفشل الخادم في التعامل معها لكن حسب ملاحظتي فالعديد من الأشخاص يتغافلون عن الجانب القانوني لذا تأكد من أنك تتبع قوانين GDPR وهي اختصار للائحة العامة لحماية البيانات وCAN-SPAM، حيث قد تحتاج إلى إذن من المستلمين. كما أنصحك باستخدام خدمات مثل Mailchimp أو SendGrid، حيث توفر أدوات وإمكانيات كافية لإدارة الحملات البريدية لأن السكربتات المجانية قد تؤدي إلى مشاكل في التسليم أو حظر حسابك لهذا يُنصح باستخدام خدمات متخصصة كالتي ذكرتها لك. بعدها عليك بتقسيم قائمة المستلمين إلى مجموعات صغيرة، وهذا الأمر سيلعب فارقا كبيرا إذ سيساعد في تحسين معدل الفتح والتفاعل.
  16. وجه الفرق بينهما يكمن في طريقة استخدامهما لا أقل ولا أكثر، فكل من BeautifulSoup و Selenium يعتبران مكتبتين تستخدمان في مجال استخراج البيانات من الويب، فلو نظرنا إلى BeautifulSoup فهي تستخدم بشكل أساسي لتحليل ملفات HTML وXML أو ما يعرف بال parsing بحيث تعمل على معالجة المستندات المستخرجة من الإنترنت، مما يسهل استخراج المعلومات منها وهذا ما يجعلها أسرع في معالجة البيانات لأن العمل يتم على صفحات ثابتة ولا تحتاج هنا إلى تحميل الصفحات بالكامل كما أنها أيضا مناسبة لجمع البيانات من صفحات الويب البسيطة وغير الديناميكية. بينما Selenium فهي تستخدم بكثرة لاختبار تطبيقات الويب وأتمتة التفاعل مع المواقع لأنه يمكنها التحكم في متصفحات الويب فعليا، مما يعني أنها تحمّل الصفحة بالكامل وتتعامل مع العناصر الديناميكية لكنها أبطأ مقارنة بـ BeautifulSoup بسبب تحميل الصفحات والتفاعل معها بالرغم من هذه السلبية إلا أنها تبقى مفيدة في التعامل مع المواقع التي تحتوي على محتوى ديناميكي أو تحتاج إلى تفاعل مع المستخدم مثل تسجيل الدخول أو ملء النماذج وغيرها.
  17. الفرق بينهما يكمن في أنّ Gaussian Naive Bayes يُستخدم مع البيانات المستمرة ويفترض أن المتغيرات تتبع توزيعا طبيعيا وهو مناسب للمميزات التي يمكن أن تأخذ أي قيمة حقيقية. أما ال Categorical Naive Bayes فيستخدم مع البيانات الفئوية ويفترض أن المتغيرات هي فئوية أي أن تكون مثل: "نعم" أو "لا" أو فئات أخرى تأخذ عددا محدودا من القيم، ويعمل بشكل جيد مع البيانات التي تحتوي على فئات منفصلة ولا تحتوي على ترتيب. إذا أردت معرفة كيفية تطبيقها يمكنك تصفحّ هذه المقالة:
  18. ياسر مسكين

    Php

    يمكنك حل مشكلة عدم ظهور الصور المتشابهة في نفس المجلد عن طريق تعديل اسم الصورة عند تخزينها من خلال إضافة طابع زمني أو رقم تسلسلي إلى اسم الصورة لضمان عدم تكراره وهذا مثال لكيفية عمل هذا مع شرح الخطوات التي اعتمدتها يمكنك الاستلهام منها والتعديل وفقا لمشروعك وفكرتك: <?php if ($_SERVER['REQUEST_METHOD'] == 'POST') { $targetDir = "Good/"; $fileName = basename($_FILES["file"]["name"]); $fileType = pathinfo($fileName, PATHINFO_EXTENSION); // إنشاء اسم فريد للصورة $newFileName = uniqid() . '.' . $fileType; $targetFile = $targetDir . $newFileName; // نقل الملف إلى المجلد if (move_uploaded_file($_FILES["file"]["tmp_name"], $targetFile)) { echo "تم رفع الصورة بنجاح: " . htmlspecialchars($newFileName); } else { echo "حدث خطأ أثناء رفع الصورة."; } } ?> <form action="" method="post" enctype="multipart/form-data"> <input type="file" name="file" required> <input type="submit" value="رفع الصورة"> </form> لاحظ هنا أنّ التابع uniqid() استخدمته لإنشاء معرف فريد يعتمد على الوقت بينما move_uploaded_file تنقل الملف من الموقع المؤقت إلى المجلد المحدد وبهذا الشكل كل صورة سيتم تخزينها بإسم فريد، حتى لو كانت متشابهة.
  19. بالنسبة للبدء في كورس الأكاديمية، فجميع الدورات في الأكاديمية تولي أهمية كبيرة لهذا الأمر بحيث تقوم بتخصيص مسار كامل لمن ليس له خلفية كبيرة باللغة، كما أنّ هنالك دورة خاصّة بالمبتدئين والذين لا يملكون أيّ خلفية عن الحاسوب والبرمجة، وهذا سيسهّل عليك الأمر، لذا فنصيحتي ألا تضيّع الوقت بالدراسة من خلال تطبيقات الهاتف الذكي صحيح أنها تساعد، لكن أعتقد أنها مساعدة فقط في ترسيخ المفاهيم النظرية لا أقل ولا أكثر، فالبرمجة تحتاج إلى تطبيق وتعلّم مستمر وإلى حاسوب، لذا حتى وإن اخترت البدء في الدراسة في كورس الأكاديمية الآن، أو بعدما تكون مستعدّا لهذا فأنصحك بالصبر، الالتزام والاستمرارية مع التطبيق المستمر لما تتعلّمه مع المدرب، ويمكنك بعدها استخدام تطبيقات الهاتف معامل مكمّل فهذا لا حرج فيه بتاتا، لكن تبقى الدورات المنظمة والمهيكلة أفضل أسلوب للتعلم في وقتنا هذا لما توفّره من التزام وانضباط في التعلم.
  20. بناء أول مشروع في مجال تعلم الآلة يتطلب المرور بعدة مراحل وخطوات، أولها تحديد الهدف أساسا من المشروع كأن تطرح السؤال حول المشكلة التي تريد حلّها أو المهمة التي تودّ تحقيقها لأنّ هذا المجال واسع وينبغي التخصيص. بعد ذلك نأتي لمرحلة البحث عن مجموعة بيانات مناسبة توجد العديد من المصادر التي يمكن الاستعانة بها من خلال استخدام بيانات مفتوحة أو جمع بياناتك الخاصة إن وجدت مسبقا. يلي ذلك عملية استكشاف البيانات من خلال تحليل البيانات وفهمها واستخدام أدوات مثل Pandas وMatplotlib أو Seaborn لرسم البيانات. بعدها نقوم بتنظيف البيانات ويقصد ذلك بمعالجة أي قيم مفقودة، وحذف البيانات الغير صالحة. بعدها تقوم باختيار نموذج تعلم الآلة الذي يناسب المشكلة (مثل الانحدار الخطي، أو الشجرة العشوائية، أو الشبكات العصبية وغيرها كثير). مرحلة تدريب النموذج تبدأ من خلال تقسيم البيانات إلى مجموعتين، أولاهما للتدريب والثانية للاختبار بحيث تستخدم مجموعة التدريب لتدريب النموذج. المرحلة الحساسة وهي تقييم عمل النموذج وأدائه باستخدام مجموعة الاختبار تستخدم عادة مقاييس مثل الدقة، F1-score، أو متوسط الخطأ وبعدها يتم تجربة تحسين النموذج عبر تعديل المعلمات أو استخدام تقنيات مثل توليد البيانات حينها إذا كنت راضيًا عن الأداء، يمكنك نشر النموذج باستخدام واجهة API أو تطبيق ويب مع الاستعانة بتوثيق المشروع، بما في ذلك الخطوات والتقنيات المستخدمة.
  21. ياسر مسكين

    php

    سأجمع لك الشيفرات لكن هذا مثال فقط وأرجو فهم الفكرة، لأن كل شخص يمكنه التعديل على هذا المفهوم بناء على احتياجاته الخاصة في مشروعه: هنا ملف Edit Profile: <?php session_start(); function getUserInfo($userId, $conn) { $sql = "SELECT id, username, image_extension FROM users WHERE id = ?"; $stmt = $conn->prepare($sql); $stmt->execute([$userId]); return $stmt->fetch(PDO::FETCH_ASSOC); } $userId = $_SESSION['user_id']; $userInfo = getUserInfo($userId, $conn); $imagePath = "k4/" . $userInfo['id'] . "." . $userInfo['image_extension']; // عرض نموذج التعديل ?> <!DOCTYPE html> <html> <head> <title>Edit Profile</title> </head> <body> <h2>Edit Profile</h2> <form action="update_profile.php" method="post" enctype="multipart/form-data"> <img src="<?php echo $imagePath; ?>" alt="Profile Picture" style="width: 100px;"><br> <input type="file" name="new_image" accept="image/*"><br> <input type="hidden" name="current_extension" value="<?php echo $userInfo['image_extension']; ?>"> <button type="submit">Update Profile</button> </form> </body> </html> أما الملف الآخر فهو لتحديث البروفايل وهو كالآتي: <?php if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_FILES['new_image'])) { $userId = $_SESSION['user_id']; $currentExtension = $_POST['current_extension']; $newImage = $_FILES['new_image']; if ($newImage['error'] == 0) { $newExtension = pathinfo($newImage['name'], PATHINFO_EXTENSION); $newPath = "k4/" . $userId . "." . $newExtension; // حذف الصورة القديمة إذا كانت موجودة $oldPath = "k4/" . $userId . "." . $currentExtension; if (file_exists($oldPath)) { unlink($oldPath); } // حفظ الصورة الجديدة move_uploaded_file($newImage['tmp_name'], $newPath); // تحديث الامتداد في قاعدة البيانات $sql = "UPDATE users SET image_extension = ? WHERE id = ?"; $stmt = $conn->prepare($sql); $stmt->execute([$newExtension, $userId]); echo "Profile picture updated successfully."; } else { echo "Error uploading new image."; } } ?>
  22. ياسر مسكين

    php

    صحيح جزء ملف التعديل مثلا يبدأ من هنا: <?php // في ملف update_profile.php if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_FILES['new_image'])) {
  23. ياسر مسكين

    php

    بالطبع لا مشكلة، سأقدم نموذجا لكل جزئية بما يقابلها من شيفرة لتفهم أفضل ثم يمكنك ربط الأفكار بناء على مشروعك الخاص، أولا بالنسبة لاسترجاع معلومات المستخدم فهذه الدالة تسترجع معلومات المستخدم، بما في ذلك امتداد الصورة من قاعدة البيانات الذي يجب أن يكون مخزنا في إحدى الأعمدة في قاعدة البيانات فقد استخدمت image_extension هنا في المثال وهو عمود مفترض في جدول users في قاعدة البيانات أين يخزن امتداد ملف الصورة الخاص بكل مستخدم. function getUserInfo($userId, $conn) { $sql = "SELECT id, username, image_extension FROM users WHERE id = ?"; $stmt = $conn->prepare($sql); $stmt->execute([$userId]); return $stmt->fetch(PDO::FETCH_ASSOC); } بالنسبة لبناء مسار الصورة هنا نبني المسار باستخدام معرف المستخدم والامتداد المخزن في قاعدة البيانات كما قلنا سابقا كالتالي: $imagePath = "k4/" . $userInfo['id'] . "." . $userInfo['image_extension']; أما هذا النموذج فيعرض الصورة الحالية ويسمح بتحميل صورة جديدة بحيث يتحقق من وجود صورة جديدة مُحمّلة ويعالجها. if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_FILES['new_image'])) { $userId = $_SESSION['user_id']; $currentExtension = $_POST['current_extension']; $newImage = $_FILES['new_image']; if ($newImage['error'] == 0) { $newExtension = pathinfo($newImage['name'], PATHINFO_EXTENSION); $newPath = "k4/" . $userId . "." . $newExtension; // حذف الصورة القديمة إذا كانت موجودة $oldPath = "k4/" . $userId . "." . $currentExtension; if (file_exists($oldPath)) { unlink($oldPath); } // حفظ الصورة الجديدة move_uploaded_file($newImage['tmp_name'], $newPath); // تحديث الامتداد في قاعدة البيانات $sql = "UPDATE users SET image_extension = ? WHERE id = ?"; $stmt = $conn->prepare($sql); $stmt->execute([$newExtension, $userId]); echo "Profile picture updated successfully."; } else { echo "Error uploading new image."; } } ثم هنا نقوم بتحديث الصورة وقاعدة البيانات: move_uploaded_file($newImage['tmp_name'], $newPath); $sql = "UPDATE users SET image_extension = ? WHERE id = ?"; $stmt = $conn->prepare($sql); $stmt->execute([$newExtension, $userId]);
  24. ياسر مسكين

    php

    بما أن الصور محفوظة في ذلك المجلد، فأكيد أنه يوجد عمود يحتوي على امتداد الصورة لذا لجلب الصورة من المجلد k4 يجب استخدام معرف المستخدم كاسم للملف ثم نقوم بجلب امتداد الصورة من قاعدة البيانات مع بناء مسار الصورة كالتالي: "k4/[user_id].[image_extension]" ثم لعرض الصورة في نموذج التعديل، استخدم المسار الذي بنيته وعند التعديل، يمكنك استخدام هذه المعلومات للوصول إلى الصورة الحالية وتحديثها إذا لزم الأمر.
  25. ياسر مسكين

    php

    حسنا، لنبدأ بكود تسجيل الدخول أولا وهو الذي حسب تصفحي له ففي البداية فهو يقوم بالتحقق من وجود جلسة نشطة للمستخدم: <?php session_start(); if (isset($_SESSION['id']) && isset($_SESSION['fname'])) { // باقي الكود هنا } else { header("Location: login.php"); exit; } أما الجزء الرئيسي لتعديل البيانات فيبدأ بعد التحقق من وجود البيانات المرسلة وهو كالتالي: if(isset($_POST['fname']) && isset($_POST['uname'])){ include "../db_conn.php"; $fname = $_POST['fname']; $uname = $_POST['uname']; $old_pp = $_POST['old_pp']; $id = $_SESSION['id']; // التحقق من البيانات وتحديثها // ... } أما بخصوص أسماء الأعمدة المستخدمة في قاعدة البيانات فهي على النحو التالي: id: معرف المستخدم fname: الاسم الكامل username: اسم المستخدم pp: صورة الملف الشخصي فالكود يقوم بتحديث هذه البيانات في جدول users في قاعدة البيانات أما بخصوص تحديث البيانات بدون تغيير الصورة فهذا الجزء هو الذي يقوم بهذا الأمر: $sql = "UPDATE users SET fname=?, username=? WHERE id=?"; $stmt = $conn->prepare($sql); $stmt->execute([$fname, $uname, $id]); أما الجزء الذي يقوم بتحديث البيانات مع تغيير الصورة: $sql = "UPDATE users SET fname=?, username=?, pp=? WHERE id=?"; $stmt = $conn->prepare($sql); $stmt->execute([$fname, $uname, $new_img_name, $id]); فالكود يتحقق من وجود ملف صورة جديد، ويقوم بتحميله وحذف الصورة القديمة إذا وجدت. أما لاستخراج كود تعديل البيانات، يمكنك استخدام الجزء الذي يبدأ من: if(isset($_POST['fname']) && isset($_POST['uname'])){ وينتهي قبل القوس } الأخير في الملف.
×
×
  • أضف...