-
المساهمات
18935 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
448
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Mustafa Suleiman
-
المقصود أنّ الدالة تُغيّر أو تتفاعل مع أشياء خارج نطاقها المحلي، أي عند القيام بما يلي: تعديل متغير عام تغيير قيمة مُدخلات الدالة نفسها الاتصال بقاعدة بيانات أو ملف. طباعة شيء في الكونسول. أي تفاعل خارج الكود بمعنى الإتصال بـ API خارجي مثلاً وذلك ليس أمر سيء، فأحيانًا كثيرة نريد التأثير الجانبي لأنّ المنطق الذي نكتبه يفرضه فالإتصال بقاعدة بيانات أو الكتابة في ملف أمر خارج عند إرادتنا. counter = 0 def increment(): global counter counter += 1 return counter لاحظ الدالة increment() تغيّر المتغير العام counter، مما يجعلها غير قابلة للتنبؤ لو استُخدمت في أماكن أخرى في حال وجود متغير باسم counter. الممارسات الجيدة تقتضي عزل الأجزاء التي تحتوي على Side Effects بوضعها في دوال منفصلة وتقليل الاعتماد على الحالة الخارجية قدر الإمكان، وبالتطبيق على الدالة السابقة سنكتبها كالتالي بتمرير معامل لها فقط ولا تقوم بتعديل أي شيء خارجها: def increment(current_counter): return current_counter + 1 counter = 0 counter = increment(counter) print(counter) counter = increment(counter) print(counter) أو من خلال دالة مغلقة Closure: def create_counter(): counter = 0 def increment(): nonlocal counter counter += 1 return counter return increment increment = create_counter() print(increment()) print(increment()) أما الدالة النقية Pure فهي تعتمد على مدخلاتها فقط ولا تغير أي شيء خارجي: def add_numbers(a, b): return a + b result = add_numbers(5, 3) print(result)
- 4 اجابة
-
- 1
-
-
ستحتاج إذن إلى استخدام RewriteRule طالما الملف داخل مجلد فرعي Admin، لتحديد المسار النسبي للمجلد بالنسبة لجذر الموقع، فلو المجلد موجود في /public_html/Admin/، فيجب كتابة RewriteBase /Admin/ وبدونها سيحاول الخادم البحث عن update.php في جذر الموقع بدلاً من داخل مجلد Admin. مع حذف قاعدة منع الـ Hotlink لملفات PHP لأنها تسبب مشاكل كبيرة في أغلب الأحيان داخل أجزاء النظام. RewriteEngine On RewriteBase /Admin/ RewriteRule ^update/([0-9a-zA-Z_]+)$ update.php?t=$1 [NC,L] RewriteRule ^up_img/([0-9a-zA-Z_]+)$ up_img.php?t=$1 [NC,L] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.*)$ $1.php [NC,L] <ifmodule mod_speling.c> CheckSpelling On </ifmodule> <IfModule mod_headers.c> Header unset X-Powered-By </IfModule> <IfModule mod_headers.c> Header set X-Frame-Options: "sameorigin" </IfModule> Options -Indexes ErrorDocument 404 /404 ErrorDocument 403 /403 ErrorDocument 500 /500 ServerSignature off
-
الغالب يمر بتلك المرحلة، والأمر نابع من دراسة غير صحيحة للدورات، ما تحتاجه هو الاستيعاب والحفظ ثم الإعتماد على ما استوعبته ولا مشكلة في نسيان بعض الأمور، ويتم تعويض ذلك بالممارسة والبحث والقراءة والمشاهدة عندما تريد تفقد معلومة معينة طالما تم الاستيعاب. وأثناء ذلك تطبيق ما تعلمته على نماذج صغيرة وليس الإنتظار لحين الوصول للتطبيق على مشروع كامل، فذلك من شأنه تأهيلك تدريجيًا لتوظيف ما تعلمته في بناء مشروع كامل، الأمر يشبه تعلم اللغة الإنجليزية عن طريق حفظ الكلمات دونّ استخدامها في جمل بالتالي عند التحدث أو الكتابة لا تستطيع توظيف ما تعلمته. في الوقت الحالي، يجب التطبيق على الأساسيات، أي بدون استخدام أي مكتبات مثل بوتستراب. قم ببناء جزء صغير من الموقع باستخدام html و CSS وأنصحك بتنفيذ التحديات على موقع Frontend mentor مع تحديد التمارين الخاصة بالمستوى المبتدئ newbie ثم junior ثم تستطيع زيادة الصعوبة فيما بعد إلى intermediate، وإليك التمارين مباشرًة: https://www.frontendmentor.io/challenges?difficulty=1&type=free%2Cfree-plus اختر أي تمرين تراه مناسب ثم حاول تنفيذه، وفي حال واجهتك مشكلة تستطيع الاستفسار في قسم أسئلة البرمجة، ومع الوقت والإلتزام والصبر سيتحسن مستواك وتستطيع بعدها تنفيذ تصميم كامل. ثم التمارين التالية: ثم بعد ذلك تدرج في الصعوبة نحو إنشاء موقع بالكامل، ثم تدرج في الصعوبة نحو إنشاء موقع متعدد الصفحات. ثم الإنتقال لمرحلة تعلم الـ JS والتعمق بها من خلال المسار الأول من دورة جافاسكريبت هنا بالأكاديمية فهو مجاني لك كحال باقي المسارات الأولى من جميع الدورات، بعد أن تصبح قادرًا على رؤية تصميم وقادر على تنفيذه أي أنك قادر على بناء موقع بالكامل باستخدام HTML و CSS على الأقل التصاميم المتوسطة في الصعوبة، أي بعد إنشاء تصميمين كاملين. ثم بعد ذلك استكمال الدورة.
-
أهم قاعدة هي ألا تستلم مدخلات المستخدم دونّ معالجتها أيًا كانت، فأغلب الثغرات من خلالها. وتعيين DEBUG=False في ملف الإعدادات عند النشر على الاستضافة، واستخدم متغيرات بيئية للمعلومات الحساسة، وتلك إعدادات جيدة تستطيع استخدامها: SECURE_HSTS_SECONDS = 31536000 SECURE_HSTS_INCLUDE_SUBDOMAINS = True SECURE_SSL_REDIRECT = True SESSION_COOKIE_SECURE = True CSRF_COOKIE_SECURE = True وطبق مبدأ الصلاحيات الأدنى بعدم منح صلاحيات أكثر مما هو مطلوب بواسطة @permission_required و @login_required للتحكم بالوصول وهو نظام التصاريح الموجود في جانغو. وحافظ على تحديث Django وجميع المكتبات المستخدمة في حالة وجود تحديثات أمنية أو تحديثات ليست جذرية بحيث تؤدي إلى تغيير في كود المشروع فأحيانًا لن يكون لديك الوقت لذلك. ستجد تفصيل هنا:
- 2 اجابة
-
- 1
-
-
عن طريق تخصيص قطعة متجاورة من الذاكرة على الـ Heap لاستخدامها كمصفوفة، وتحتوي على دلاء buckets أو فتحات slots، وحجم المصفوفة هو أحد المحددات الرئيسية لكمية الذاكرة الأولية التي يستهلكها جدول الهاش، فيبدأ الجدول بحجم افتراضي 16 أو 32 فتحة ويتغير الحجم لاحقاً. كل فتحة تخزن إما مؤشر pointer إلى بداية قائمة كقائمة مرتبطة لو كان الجدول يستخدم طريقة السلسلة المنفصلة Separate Chaining لحل التصادمات، أو البيانات نفسها وهي المفتاح والقيمة أو مؤشر للبيانات في حال الجدول يعتمد على العنونة المفتوحة Open Addressing. ثم تخزين البيانات الفعلية على شكل أزواج مفتاح-قيمة Key-Value pairs وتحتاج أيضاً إلى ذاكرة والتي تضاف إلى الذاكرة التي تستهلكها المصفوفة الأساسية، وفي طريقة السلسلة المنفصلة، كل عنصر يتم إضافته يتم تغليفه wrap داخل عقدة قائمة list node تحتوي على البيانات الفعلية ومؤشر إلى العقدة التالية في السلسلة، وكل عقدة منها تستهلك ذاكرة إضافية للبيانات وللمؤشر. وفي العنونة المفتوحة، توضع البيانات مباشرة أو مؤشر إليها داخل الفتحات الموجودة في المصفوفة الأساسية. مع تخصيص ذاكرة إضافية لحل التصادمات إما في شكل عقد قوائم ومؤشرات في السلسلة المنفصلة، أو بالحاجة إلى مصفوفة أساسية أكبر في العنونة المفتوحة. وعندما يمتلئ جدول الهاش بدرجة معينة أي يصل عامل التحميل إلى حد معين، مثلاً 0.75، يصبح الأداء خصوصاً عمليات البحث والإضافة والحذف أسوأ بسبب زيادة التصادمات، فيحدث ما يسمى بعملية إعادة التحجيم وتتطلب تخصيص مصفوفة جديدة أكبر بكثير بشكل مؤقت قبل تحرير القديمة.
- 3 اجابة
-
- 1
-
-
لا تكن حبيس أفكارك، ما تقوم به غير عملي وغير واقعي، فحتى الشركات الكبيرة لا تقوم بما تفعله، أحيانًا كثيرة يتم نشر ميزة ليست كاملة وبها أخطاء ويتم إصلاحها بعد النشر. المهم هو إخراج نتيجة بجودة مقبولة ثم التحسين، فلو لاقت قبول ومفيدة فعلاً يتم تطويرها لتجنب إضاعة الوقت والمجهود في أمر لا عائد منه عند إختباره في الواقع. وعامًة المشكلة شائعة جداً جداً بين المبرمجين، خصوصاً في البدايات، ويسمى شلل التحليل Analysis Paralysis أو السعي للكمال المضر. اعتمد منهجية MVP وابدأ دائماً بأبسط نسخة تعمل وتحقق الهدف الأساسي المطلوب، ولديك الهدف الأساسي هو إدخال بيانات لتقرير واحد بطريقة ثابتة ربما اجعل ذلك يعمل أولاً، أي ركز على أن يعمل الكود بشكل صحيح مبدئياً، حتى لو كان غير أنيق أو غير قابل للتوسع بسهولة وبعد أن يعمل، تستطيع العودة لتحسينه وعمل Refactoring، وجعله يتعامل مع حالات أكثر تعقيداً. وبدلاً من التفكير في المشروع ككتلة واحدة ضخمة تتطلب حلاً مثالياً لكل شيء، قسّمه إلى مهام صغيرة جداً يمكن إنجازها في فترة قصيرة. وستواجهك مشكلة ماذا لو؟ فقم بكتابة ما تفكر به جانبياً وامضِ قدماً، بأي طريقة تريدها تحت عنوان تحسينات مستقبلية أو مشاكل محتملة، ثم انسَها في الوقت الحالي وركز على المهمة التي بين يديك وستتعامل مع ذلك لاحقاً عندما يحين وقتها.
- 2 اجابة
-
- 1
-
-
الإضافة تعمل بشكل سليم، ربما قمت بتثبيتها بشكل غير صحيح، كل ما تحتاجه هو التوجه للرابط التالي: https://marketplace.visualstudio.com/items?itemName=qiuqiu-xt.css-flex وستظهر لك صفحة الإضافة في vscode اضغط على install وستظهر لك رسالة اختر trust وسيتم التثبيت، ثم توجه إلى ملف CSS واكتب: body { display: flex; } وستجد أنّ أيقونة الإضافة قد ظهرت بجانب flex
- 3 اجابة
-
- 1
-
-
يوجد مشكلة في تهيئة .htaccess أدى إلى الخطأ 500، وليس عملية إعادة الكتابة بحد ذاتها، فاختصار الروابط من خلال RewriteRule لا يؤدي إلى إيقاق الاستدعاء، ما يفعله عند وصول طلب بمسار معين /Admin/dir/update/123 إلى الخادم، تقوم قاعدة RewriteRule بإعادة كتابة المسار داخلياً إلى مسار آخر Admin/dir/update.php?t=123 قبل أن يقوم الخادم بتحديد الملف الذي سيقوم بتشغيله. قم بإرفاق ملف htaccess لتفقده وتحديد ما تريد فعله بالضبط بشكل واضح.
-
RewriteBase الهدف منه تحديد المسار الأساسي الذي تُطبق عليه قواعد RewriteRule، ومن المفترض أن يكون مجلد وليس ملف. بمعنى لو ملف .htaccess موجود في المسار public_html/Admin/dir/، فـ RewriteBase الصحيح سيكون /Admin/dir/. وتستطيع دمج القاعدتين في قاعدة واحدة: RewriteEngine On RewriteBase /Admin/dir/ RewriteRule ^update/([0-9a-zA-Z_]+)$ update.php?t=$1 [NC,L] وسيتم توجيه مسارات مثل update/123 و update/abc و update/ID_456 بغض النظر عن حالة الأحرف إلى update.php?t=قيمة هنا
-
الأمر ليست بتلك السهولة، ستحتاج إلى تعلم لغة برمجة وإطار عمل وذلك يستغرق وقت ما بين 3 أشهر حتى 6 أشهر، لذا هل ستتعلم من الصفر أم تعلمت لغة برمجة بالفعل أو تنوي تعلم لغة برمجة جديدة؟ في حال ما زلت في مرحلة التعلم، الأسهل لك تعلم لغة PHP ثم تعلم إطار لارافل لتطوير المشروع، وبه نظام مدمج لإدارة المستخدمين والمصادقة وميزة Laravel Task Scheduling لجدولة المهام اليومية لخصم النقاط تلقائياً ومكتبات QR منها SimpleSoftwareIO/simple-qrcode. وذلك لتطوير تطبيق ويب أي سيعمل من خلال المتصفح، أما لو تريد تطبيق هاتف فستحتاج إلى استخدام Flutter أو React Native.
-
طالما تعمل من خلال PHP الأسهل لك استخدام إطار NativePHP وسيوفر لك تحويل مشاريع PHP ولارافل إلى برامج سطح مكتب لمنصات ويندوز، ماك ولينكس وذلك في الوقت الحالي، وفي الإصدارات القادمة سيتم دعم التحويل لتطبيقات هواتف لمنصتي أندرويد وiOS. لتطبيقات الهواتف أنصحك باستخدام React Native لكونها تعتمد على مكتبة React والتي بدورها تعتمد على جافاسكريبت، وتعلم ما سبق يقع ضمن إختصاصك كمطور ويب وسيعود عليك بالفائدة في تطوير مهاراتك.
-
هناك مقاسات ثابتة لمقاسات الشاشات أي تعتبر قياسية standard، لكن الأمر يعتمد على التصميم، فأحيانًا نقوم بكتابة قيم قريبة من تلك المقاسات لكي تتناسب مع التصميم الخاص بالموقع الذي نعمل عليه، فعند اختبار الموقع عن طريق أدوات المطور في المتصفح حيث يوجد أداة لإختبار التجاوبية responsive، نتفقد النقاط التي ينكسر عندها التصميم بمعنى يصبح غير سليم، ثم نكتب media query بمقاس الشاشة بالـ px الذي انكسر عنده التصميم ونقطة الإنكسار تُعرف باسم break point.
-
يحمل قيمة العنصر في كل دورة تكرار، بمعنى الحلقة تقوم بالتكرار على عناصر المصفوفة وعددهم 4، في الدورة الأولى ستكون قيمة i تساوي العنصر الأول في المصفوفة وهو meshal وهكذا في باقي الدورات، بالتالي في كل دورة تستطيع استخدام تلك القيمة لتنفيذ أمر معين كالطباعة.
- 3 اجابة
-
- 1
-
-
صحيح، وذلك لنسخ مستودع بعيد على منصة GitHub وإنشاء نسخة محلية منه على حاسوبك حيث ستجد مجلد جديد باسم المستودع وذلك في نفس المسار الذي قمت به بتنفيذ الأمر في منفذ الأوامر، تكتب الأمر وتضع بعده رابط المستودع لإنشاء نسخة منه. git clone https://github.com/username/repository.git وللعلم تستطيع تغيير اسم المجلد بكتابة اسم بعد رابط المستودع: git clone https://github.com/username/repository.git اسم المجلد الجديد
- 6 اجابة
-
- 1
-
-
الحد الأدنى هو 4 مسارات وليس 4 دورات فكل دورة مقسمة إلى مسارات، وسيتم إختبارك في تلك المسارات فقط، لكن الأفضل إنهاء الدورة بالكامل لتحقيق استفادة في حال كانت تلك المرة الأولى لك في دراسة ذلك التخصص. وكل دورة لها شهادة خاصة بها لذا أرجو التقدم بطلب الإختبار بالتحدث لمركز المساعدة وتوفير روابطgithub للمشاريع العملية على التي قمت بإنهائها في تلك المسارات
-
توجه للمسار التالي على حاسوبك: C:\Users\Alamir Bn Talal\AppData\Local\Android\sdk\ndk قم بحذف جميع ما بداخل ذلك المجلد، ثم تشغيل مشروع flutter لتحميل وإنشاء ملف NDK مُجددًا، وذلك من خلال الأوامر التالية: flutter clean flutter pub get cd android && ./gradlew clean && cd .. flutter run في حال استمرت المشكلة، قم بحذف المجلد مجددًا ثم توجه إلى إعدادات android studio وابحث عن sdk واختر Android SDK ثم من تبويب SDK Tools ستجد NDK تفقد الإصدار 26.3.11579264 وتأكد من تفعيله بالضغط على المربع الذي بجانبه وستظهر أيقونة التحميل اضغط عليها بجانبه، ثم اضغط على APPLY، وفي حال لم تجد ذلك الإصدار قم بإختيار أحدث إصدار متوفر أو إصدار قريب منه: ثم توجه إلى android/app/build.gradle.kts في مشروعك ثم في جزء android ستجد خاصية باسم ndkVersion قم بوضع رقم الإصدار الذي قمت بتحميله: ثم تشغيل المشروع من خلال الأوامر التالية: flutter clean flutter pub get cd android && ./gradlew clean && cd .. flutter run
-
هل تريد تعلم ذلك من خلال الأكاديمية؟ يوجد دروس خاصة بذلك هنا: https://academy.hsoub.com/marketing/core-concepts-of-marketing/ https://academy.hsoub.com/marketing/?show=categories ويوجد كتب لتعلم التسويق:
-
ما الذي قمت بفعله بالضبط لتفقد المشكلة، وأين وضعت الكود المسؤول عن التوجيه لصفحة الصيانة
-
يدعم التصدير لمنصات الحواسيب والتي تعمل بأنظمة ويندوز، ماك ولينكس، وأيضًا منصات الهواتف وهما أندرويد و iOS، بالإضافة إلى الويب لتعمل اللعبة من خلال HTML5. أما منصات الكونسول وهي البلايستيشن وإكس بوكس فلا يدعمها بشكل مباشر، ستحتاج إلى الإعتماد على منصات خارجية لتصدير اللعبة لتلك المنصات. ويدعم تطوير ألعاب 2D ويبرع في ذلك، أما ألعاب 3D فيوفر أدوات لتطويرها لكن وبالطبع لا يوجد مقارنة بينه وبين المحركات الرائدة كـ Unity أو Unreal في ذلك، بالتالي مناسب في حال ستقوم بتطوير لعبة بمفردك أو من خلال فريق صغير بسبب سهولة استخدامه وبدون تكلفة.
-
يجب تهيئة قاعدة البيانات لتخزين حالة الموقع مفتوح أو مغلق من خلال جدول بسيط، عليك تنفيذ الاستعلام التالي لإنشائه من خلال phpMyAdmin: CREATE TABLE IF NOT EXISTS settings ( setting_key VARCHAR(100) PRIMARY KEY, setting_value TEXT ); ثم أضف صفًا لتحديد حالة الصيانة، بقيمة on لتفعيل الإغلاق أو off لإلغاء الإغلاق: INSERT INTO settings (setting_key, setting_value) VALUES ('maintenance_mode', 'off') ON DUPLICATE KEY UPDATE setting_value = VALUES(setting_value); بالطبع من المفترض أن لديك صفحة صفحة الإغلاق maintenance.php أو offline.php، لعرض رسالة للزوار، وفي حال لم يكن لديك، أنشيء الملف البسيط التالي: <!DOCTYPE html> <html lang="ar" dir="rtl"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>الموقع تحت الصيانة</title> <style> body { font-family: 'Arial', sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; background-color: #f8f9fa; text-align: center; direction: rtl; } .container { padding: 30px; background-color: #fff; border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1); } h1 { color: #dc3545; } p { color: #6c757d; } </style> </head> <body> <div class="container"> <h1>عذراً، الموقع تحت الصيانة حالياً</h1> <p>نحن نقوم ببعض التحديثات الضرورية لتحسين تجربتكم. سنعود قريباً!</p> <p>شكراً لتفهمكم.</p> </div> </body> </html> بعد ذلك أنشئ ملف PHP جديد باسم maintenance_check.php في المجلد الرئيسي أو مجلد الإعدادات مثلاً، وسنكتب به سيتصل بقاعدة البيانات ويتحقق من الحالة، ثم يوجه الزائر حسب الحالة: <?php require_once __DIR__ . 'db_connection.php'; //أضف مسار ملف الإتصال بقاعدة البيانات $maintenance_page_url = '/maintenance.php'; if (!isset($pdo) || !$pdo instanceof PDO) { http_response_code(503); header('Location: ' . $maintenance_page_url); exit; } $current_page_url = $_SERVER['REQUEST_URI'] ?? ''; if (strpos($current_page_url, basename($maintenance_page_url)) !== false) { return; } try { $stmt = $pdo->prepare("SELECT setting_value FROM settings WHERE setting_key = 'maintenance_mode' LIMIT 1"); $stmt->execute(); $maintenance_mode_status = $stmt->fetchColumn() ?: 'off'; if ($maintenance_mode_status === 'on') { http_response_code(503); header('Location: ' . $maintenance_page_url); exit; } } catch (PDOException $e) { http_response_code(503); header('Location: ' . $maintenance_page_url); exit; } ?> والآن نحتاج إلى أن يتم تنفيذ maintenance_check.php في بداية كل طلب قبل أي كود HTML أو PHP آخر. أضف السطر التالي في أعلى الملف الرئيسي index.php أي يجب أن يكون أول شيء يتم تنفيذه: <?php require_once __DIR__ . '/maintenance_check.php'; ?>
-
هل يتم استقبال البيانات من id أم من t ؟ سأفترض أنه الـ id. عامًة لا يتم استخدام PDO، بل دوال mysqli_* القديمة، والأهم يوجد ثغرة SQL Injection واضحة. تستقبل القيمة مباشرًة من المستخدم هنا دون تحويله إلى INT أي رقم صحيح ولا تتحقق من جوده: $id = $_GET['id']; ثم تضع المتغير $id مباشرة في نص الاستعلام، بالتالي أي أحد يستطيع إرسال قيمة مثل 1 OR 1=1 في باراميتر id لسحب كل المحتوى، أو أسوأ من ذلك. $Record = mysqli_query($conn,"SELECT * FROMcontentWHERE id= $id"); أيضًا يتم جلب البيانات إلى المتغير $data باستخدام mysqli_fetch_array($Record), لكن لا يقوم بطباعة أو استخدام أي عمود من البيانات، لذا لا يتم ظهور أي شيء في المتصفح حتى لو نجح الاستعلام. بالإضافة إلى إخفاء الأخطاء في error_reporting(0); ini_set('display_errors', 0) ولن تتمكن من معرفة سبب عدم عمل الكود أثناء التطوير. <?php //تمكين عرض الأخطاء مؤقتاً للتطوير فقط ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); include_once('config.php'); $id = null; $t_is_valid = false; if (isset($_GET['id']) && filter_var($_GET['id'], FILTER_VALIDATE_INT) && $_GET['id'] > 0) { $id = (int)$_GET['id']; } if (isset($_GET['t']) && is_numeric($_GET['t'])) { $t_is_valid = true; } if ($id !== null && $t_is_valid) { if ($conn && $conn instanceof mysqli) { $sql = "SELECT title, content, image_path FROM `content` WHERE id = ?"; $stmt = $conn->prepare($sql); if ($stmt) { $stmt->bind_param("i", $id); $stmt->execute(); $result = $stmt->get_result(); $data = $result->fetch_assoc(); if ($data) { echo "<h1>" . htmlspecialchars($data['title']) . "</h1>"; echo "<div>" . htmlspecialchars($data['content']) . "</div>"; if (!empty($data['image_path'])) { echo "<img src='" . htmlspecialchars($data['image_path']) . "' alt='" . htmlspecialchars($data['title']) . "'>"; } } else { echo "لم يتم العثور على محتوى بالمعرف (ID) المحدد."; } $stmt->close(); } else { echo "خطأ في إعداد الاستعلام: " . htmlspecialchars($conn->error); } $conn->close(); } else { echo "خطأ: مشكلة في الاتصال بقاعدة البيانات."; } } else { header("Location: index.php"); exit; } ?> أضفت htmlspecialchars لحماية مخرجات HTML لمنع ثغرات XSS.
-
الأمر غير واضح سببه، قم بإرفاق كود الاستعلام لتفقد سبب المشكلة. عامًة استخدم قيمة id صالحة من قاعدة البيانات لديك، وقم بتشغيل الاستعلام التالي مباشرة في أداة مثل phpMyAdmin أو أي عميل SQL آخر، وفي حال لم يقم الاستعلام بإعادة البيانات المتوقعة، فالمشكلة في الاستعلام نفسه أو البيانات في قاعدة البيانات. أو بعد سطر $row = $stmt->fetch(PDO::FETCH_ASSOC) أضف التالي: echo "<pre>"; print_r($row); echo "</pre>"; لعرض محتويات المتغير $row بالضبط، ولو طبع bool(false)، فيعني أنه لم يتم العثور على صف. ولو طبع مصفوفة، فسترى أسماء الأعمدة الفعلية وقيمها، تفقد هل هي مطابقة لقاعدة البيانات أم لا؟
-
هل أنت مشترك بأحد الدورات، أم تتساءل عن خارطة طريق لتعلم بايثون بمفردك؟ عامًة ستجد مصادر هنا:
-
ما هي الدورة التي اشتركت بها؟ وهي لديك هاتف فقط؟ وهل تنوي شراء حاسوب أو لابتوب عما قريب؟ عامًة ستجد هنا تفصيل بخصوص طريقة دراسة الدورة: وبخصوص الحفظ ستجد تفصيل هنا: