-
المساهمات
3124 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
29
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو محمد عاطف17
-
اذا يوجد خطأ بربط جدول projects بجدول students لذلك من فضلك تاكد من ان الربط بين الجدولين صحيح .
-
لاحظ انه يوجد اخطاء فى ربط البيانات لذلك ظهرت فارغه الا اسماء المشاريع . ما هو عمود Num_STD فى جدول projects هل هو عدد الطلاب ام ماذا ؟ واذا كان هو id الطالب اذا لماذا لم يتم ربطه ب id_std ؟ من فضلك قم بتجربة هذا الكود واخبارى بالنتيجة . SELECT s.Num_std ,s.Name_std ,s.Email_STD ,p.name_project,t.Name_teah,d.Name_dept FROM student s LEFT JOIN projects p ON p.Num_STD=s.Num_std LEFT JOIN teachers t ON s.id_teah=t.id_teah LEFT JOIN departments d ON t.id_dept=d.id_dept;
-
اذا جدول projects فارغ ولا يوجد به اى بيانات . وايضا الجداول الاخرى . من فضلك قم بارسال صورة تحوى على بعض البيانات من الجداول التى لديك لنرى اين المشكلة .
-
يبدو انه يوجد اخطاء فى ربط الجداول . اولا من فضلك قم بتغير كلمة INNER JOIN الى LEFT JOIN فى اى مكان لديك فى ال query ومن ثم ارسال النتيجة لى . وايضا هل يمكنك ارسال صورة لشكل هيكل الجداول وان امكن لبعض البيانات فيه .
-
الامر بسيط ويوجد عدة طرق ولكن الافضل هو . اولا انشاء متغير يحمل المنشورات التى تم تحميلها الى الان حيث لا نريد فى كل مرة يصل المستخدم الى اخر الصفحة وناتى بالمنشروات من جديد , ونعطى قيمة افتراضية لهذا المتغير بمصفوفة فارغة . public $postCotainer = []; وايضا نقوم بانشاء متغيرين اخرين احدهما يحمل القيمة الافتراضية لعدد المنشورات التى سيتم تحميلها فى بداية الصفحة او حتى عند التمرير لاسفل الصفحة . والاخر يحمل عدد المنشورات الذى تم عرضها الى الان . public $take = 5; public $skip = 0; والان نقوم بانشاء استماع الى حدث التمرير جديد وفى الدالة نقوم بزيادة عدد المنشورات التى عرضها . protected $listeners = ['scrollPosts'=>'getMorePosts']; public function getMorePosts() { $this->skip += $this->take; } هكذا كل مرة يتم التمرير لاسفل الصفحة نقوم بزيادة العدد الذى تم عرضه . والان فى الدالة getPostsProperty نضع هذا الكود. public function getPostsProperty() { $ids = auth()->user()->following()->wherePivot('confirmed', true)->get()->pluck('id'); $this->postCotainer = array_merge($this->postCotainer,Post::whereIn('user_id', $ids)->latest()->skip($this->skip)->take($this->take)->get()->all()); return $this->postCotainer; } لاحظ هنا اننا اولا استخدمنا دالة array_merge وذلك لدمج المنشورات التى تم تحميلها سابقا الى المنشورات الجديدة الذى سوف يتم تحميلها . ولاحظ اننا فى الاستعلام الخاص بال sql اضفنا داليتن الاولى هى skip اى اننا لا نريد ان ناتى بعدد معين بالمنشورات وهى المنشورات التى تم تحميلها بالفعل ولذلك نمرر لها المتغير skip الذى يحمل عدد المنشروات الذى تم تحميلها الى الان. والدالة take التى تسمح لنا باحضار عدد معين فقط من المنشورات ولذلك ارسلنا لها المتغير take الذى يحمل عدد المنشورات التى نريد عرضها . وبهذا نكون قد انتهينا من الكود الخلفى . ولكن ستجد مشكلة سوف تحدث فى الحدث الذى لديك toggleFollow فمثلا اذا قام المستخدم بالغاء متابعه او متابعه مستخدم جديد فان منشوراته التى تم تحميلها سابقا نريد ان نحذفها او عرضها . لذلك سنجعل عند استماع الى الحدث toggleFollow هو حذف جميع المنشورات التى تم تحميلها سابقا واعادة التحميل من جديد حتى لا تحدث تلك المشكلة.وهذا هو كود المكون كاملا بعد التعديل. <?php namespace App\Livewire; use Livewire\Component; use App\Models\Post; class PostsList extends Component { protected $listeners = ['toggleFollow' => 'resetPosts','scrollPosts'=>'getMorePosts']; public $take = 5; public $skip = 0; public $postCotainer = []; public function resetPosts() { $this->postCotainer = []; $this->take = 5; $this->skip = 0; } public function getPostsProperty() { $ids = auth()->user()->following()->wherePivot('confirmed', true)->get()->pluck('id'); $this->postCotainer = array_merge($this->postCotainer,Post::whereIn('user_id', $ids)->latest()->skip($this->skip)->take($this->take)->get()->all()); return $this->postCotainer; } public function getMorePosts() { $this->skip += $this->take; } public function render() { return view('livewire.posts-list'); } } اما فى الواجهة الامامية فسوف نضيف استماع الى حدث التمرير و التحقق من ان المستخدم قد قام بالتمرير الى اخر الصفحة . واذا كان قام بالتمرير الى اخر الصفحة نقوم بارسال الحدث scrollPosts الذى سوف يقوم باحضار المزيد من المنشورات وبذلك كلما قام بالتمرير ياتى بالمنشورات الجديد . <div class="w-[30rem] mx-auto lg:w-[95rem]"> @forelse($this->posts as $post) <livewire:post :post="$post" :wire:key="'post_'.$post->id" /> @empty <div class="max-w-2xl gap-8 mx-auto dark:text-gray-100"> {{ __('Start Following Your Friends and Enjoy.') }} </div> @endforelse </div> @script <script> window.onscroll = function(ev) { if ((window.innerHeight + Math.round(window.scrollY)) >= document.body.offsetHeight) { $wire.dispatch('scrollPosts'); } }; </script> @endscript وهكذا قد انتهينا من جميع الاكود ويمكنك استعمالها وستعمل معك . ويمكنك تغير القيمة الافتراضية للمتغير take على حسب عدد المنشورات التى تريدها حيث انا اعطيته قيمة ابتدائية ب 5
- 4 اجابة
-
- 1
-
ويمكنك الضغط على قائمة File ثم قم بتفعيل خيار auto save لحفظ التعديلات تلقائيا دون الحاجة للضغط على CTRL + s
-
يبدو انن قد نسيت حفظت التعديلات التى على الملف . لاحظ الدائرة البيضاء المشار اليها فى الصورة التاليه . معنى هذه الدائرة هو انه تم تعديل الملف ولم يتم حفظ التعديلات . لذلك قم بالضغط على CRTL + S لحفظ التعديلات وتاكد من ان الدائرة البيضاء قد اختفت . وقم بالمحاولة مرة اخرى وسيعمل معك ان شاء الله.
-
وعليكم السلام ورحمة الله وبركاته . نظام التشغيل هو الطبقة الوسيطة بين الهاردوير والسوفتوير وهو المتحكم الاساسى والرئيسى فى الهاردوير الخاص بالجهاز . فهو من يقوم بتوصيل الاوامر من اجهزة الادخال الى اجهزة الاخراج و الى ايضا الهاردوير . فعند الضغط على زر الفأرة او حتى على زر من ازرار لوحة المفاتيح فانه يقوم بارسال هذا الامر الى البرنامج او السوفتير المطلوب ويخبره بحدث الضغط او تحريك الفأرة ثم مثلا يرسل البرنامج الامر الى نظام التشغيل مثلا بطباعة الحرف على الشاشة او تحريك الفأرة ثم ياخذ نظام التشغيل الامر ويرسله الى كارت الشاشة مثلا او اللى الهاردوير المطلوب ويظهر الحرف او يتم المهمة المطلوبة . اما عملك كمبرمج فهو يعتمد على الوظيفة التى تقوم بها . فان مهندسين نظم التشغيل والكومبايلرز هم من اقوى و اذكى المهندسين فهو من يقوم بهندسة نظام التشغيل كاملا و التحكم فى الهاردوير . اما مهندسين البرمجيات فانت فقط تقوم بكتابة البرنامج على حسب اللغه التى تعمل عليها والكومبايلر هو المسؤل عن تحويل الكود الخاص بك الى اوامر يستطيع نظام التشغيل فهمها والتعامل معها ومن ثم نظام التشغيل هو من يقوم باعطاء هذه الاوامر الى الهاردوير الصحيح . وبدون نظام التشغيل فان الهاردوير لا قيمة له فسيصبح عبارة عن قطعة لا قيمة لها فنظام التشغيل هو مثل العقل المسئول عن الجسم من تحريكه الى التحكم فيه بشكل كامل . ويمكنك قراءة هذه المقالات لتتعرف اكثر عن نظم التشغيل .
-
الخطأ الذى يظهر لك بسبب انك تحاول تثبيت اخر اصدار من لارافيل وهو يتطلب php اصدار 8.2 فما اعلى ويبدو انه لديك اصدار php 7 . ولذلك الحل هو هو تثبيت لاراجون يدعم اصدار php 8 او انشاء مشروع لارافيل دون تحديد اصدار لارافيل و هو سيتعرف تلقائيا على اصدار php لديك وانشاء مشروع متوافق معه . لذلك من فضلك استخدم الامر التالى . composer create-project laravel/laravel ex-t1
-
الخطأ الذى يظهر لديك هو انه يوجد بعض الملفات المفقودة يبدو ان التثبيت لم يكتمل لديك . اولا قم بفتح laragan as administrator ومن ثم قم بالمحاولة مرة اخرى . اذا ظلت المشكلة كما هى فيجب الغاء تثبيت laragon واعادة تثبيته مرة اخرى وذلك سيحل المشكلة ان شاء الله ولكن يجب التاكد من التثبيت قد اكتمل وتم بنجاح.
-
وعليكم السلام ورحمة الله وبركاته . خادم ال FTP هو خادم يوفر لك بروتوكول ال ftp الخاص بنقل البيانات من والى الخادم . وكل خادم منفصل عن جميع الخوادم الاخرى على الانترنت اى ان كل خادم لديه الملفات الخاصة به وليس جميع الملفات على الانترنت . لناخذ مثال مثلا الهارد الخاص بك هل يوجد فيه جميع الملفات التى توجد عند جميع الاشخاص ؟ ام الملفات الخاصة بك فقط ؟ واذا اردت مثلا نقل ملف من او الى الهارد الخاص بك ماذا تفعل ؟ الهارد الخاص بك هو مثل ال ftp server يوجد فيه بيانات خاصة بصاحب الخادم فقط . واذا اراد صاحب الخادم السماح بنقل الملفات من والى سيرفره سيسمح باستخادم بروتوكول ftp كما تقوم انت بتوصيل الهارد او الفلاشة الذى تريد نقل منها او اليها الملفات . اما بالنسبة لل ip فيجب التفرقة بين نوعين local ip و Public ip . ال local ip هو ال ip الذى يقوم الراوتر بتوفيره لجهازك وهذا ال ip لا يمكن ان يتكرر على الشبكة الخاصة بك اى لا يمكن ان يوجد جهازين على نفس الراوتر لهما نفس ال ip . لنفرض مثلا انه يوجد جهازين متصلين على الراوتر الخاص بك . وعنوان الراوتر هو 192.168.1.1 اذا سيكون اول جهاز ال ip الخاص به مثلا هو 192.168.1.10 ولا يمكن للجهاز الثانى ان يكون له نفس هذا ال ip . ولكن من الممكن ان جارك مثلا او شخص اخر لديه راوتر اخر ومتصل به ويكون عنوانه هو 192.168.1.10 حيث انهم منفصلين عن بعضهم وال local ip هو خاص بالراوتر نفسه كما وضحت لك . اما ال public ip وهذا هو ال ip الذى تقوم بتزويده لك مقدم خدمة الانترنت ISP وهذا هو ال ip الذى تراه المواقع عند الاتصال بها وهو الذى يمكنك من تصفح المواقع وهذا ال ip هو الخاص بالراوتر وهذا مستحيل ان تجد راوترين لهم نفس ال public ip . ولكن اذا اتصل جهازين بنفس الراوتر فان ال public ip الخاص بهم هو نفس ال ip الخاص بالراوتر اى اذا ذهبت الى موقع https://www.myip.com/ ودخلت من جهازين مختلفين ولكنهم متصلين بنفس الراوتر ستجد ان ال ip واحد ولكن اذا قمت بالدخول لنفس الموقع ولكن من راوتر اخر ستجد ان ال ip مختلف . وايضا هنا معلومة اخرى اذا لم تكن مشترك فى خدمة الانترنت الثابت اى static ip و هى خدمة توفرها معظم شركات الانترنت فان كل ما تقوم باطفاء وتشغيل الراوتر فان ال public ip الخاص به سيتغير تلقائيا حيث ان مزود الخدمة حين اطفاء الراوتر سيقوم باعطاء ال ip الذى كنت تاخذه لشخص اخر وحين اعادة تشغيل الراوتر فان مزود الخدمة سيبحث عن ip ليس مستخدما وسيقوم باعطاءه لك.
-
الخطأ لديك انك تقوم باستخدام foreach بداخل foreach اخرى لهذا يتم تكرار الصور وايضا المحتوى . ويوجد خطأ اخر هو انك تقوم بانشاء المحتوى بداخل ال foreach وهذا خاطئ بل يجب انشاء المحتوى قبل ال forech . لذلك الحل هو اخراج الكود من اول جزء if($check) خارج ال foreach الاولى وهذا سوف يحل المشكلة لديك. واذا كان هذا السؤال خاصا بدرس من دروس الدورات فمن فضلك مستقبلا قم بالتعليق اسفل الدرس فى التعليقات وذلك لمساعدتك بشكل افضل
- 2 اجابة
-
- 1
-
من الافضل نقل هذا المجلد بداخل المشروع و كتابة المسار هكذا . require 'vendor/autoload.php'; لان المجلد بداخل ملفات الويندوز واعتقد ان الخطأ يحدث لان المشروع ليس له الصلاحيات للوصول لهذا المكان. لهذا من الافضل نقله بداخل المشروع كمل وضحت لك.
-
الخطا لديك هنا يبدو ان المسار الذى قمت بادخاله خاطئ لذلك قم بتحديد مسار ملف ال autoload الصحيح ووضعه هنا فى هذا السطر
-
وعليكم السلام ورحمة الله وبركاته . هل يتم توليد صورة ال qrcode بشكل صحيح ؟ تاكد من الصورة يتم توليدها بشكل صحيح اولا وفى المسار الذى حددته انت فى الكود /img/qr يمكنك ارسال الصور عن طريق تضمين الصورة فى الايميل عن طريق الدالة AddEmbeddedImage حيث تستقبل عدة معاملات ما نريده هو اول معاملين , حيث اول هو مسار الصورة وثانى معامل هو cid اى الاسم المستعار الذى ستقوم باستعماله فى رسالة الايميل ويمكنك استعماله هكذا cid:name واستبدال name بالاسم الذى قمت بتمريرة للدالة . <?php include('header.php'); use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require 'PHPMailer/src/Exception.php'; require 'PHPMailer/src/PHPMailer.php'; require 'PHPMailer/src/SMTP.php'; // require 'C:\Windows\System32\vendor/autoload.php' require 'include/phpqrcode/qrlib.php'; // ?> <!--------------------------------------------------------------------------------> <!------------------------------------header--------------------------------------> <!--------------------------------------------------------------------------------> <div class="col-md-9 pan1"> <ol class="breadcrumb" style="background-color: #fff;padding-top:8px;padding-bottom:8px;color:#000;font-size:16px;"> <li><a href="projetcs.php">المشاريع</a></li> <li class="active">القبول</li> </ol> </div> </div> <div class="row"> <div class="col-md-9 pan1"> <div class="panel" style="color:#000;"> <div class="panel-body" style="font-size:14px; padding-left:40px;padding-right:40px;padding-bottom:25px;padding-top:25px;"> <?php if(isset($_GET['id'])){ // $id_p = intval($_GET['id']); $sql = "SELECT * FROM `show_projects_adm` WHERE id_Pro=$id_p"; $query_p = mysqli_query($con,$sql); $rows_p = mysqli_fetch_array($query_p); // $id_pro = intval($_GET['id']); $querypost2="SELECT * FROM `projects` WHERE `id_Pro`=$id_pro"; $result2=mysqli_query($con,$querypost2); $rows2=@mysqli_fetch_array($result2); $id_std = $rows2['Num_STD']; // //$id_std = intval($_GET['id']); $querypost="SELECT * FROM `student` WHERE `id_std`=$id_std"; $result=mysqli_query($con,$querypost); $rows=@mysqli_fetch_array($result); $email_std = $rows['Email_STD']; // // البيانات التي تريد تضمينها في رمز الاستجابة السريعة (QR code) $data = $rows_p['desc_Project']; // اسم الملف الذي يتم حفظه (يمكنك تغييره إلى أي اسم تفضله) $filename = 'img/qr/'.$rows_p['id_Pro'].'_qrcode.png'; // إنشاء رمز QR وحفظه في الملف المحدد QRcode::png($data, $filename); // // Create a new PHPMailer instance $mail = new PHPMailer(true); try { // Server settings $mail->isSMTP(); $mail->Host = 'aaa'; // SMTP server $mail->SMTPAuth = true; $mail->Username = 'aa'; // SMTP username $mail->Password = 'aa'; // SMTP password $mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted $mail->Port = 587; // TCP port to connect to $mail->CharSet = 'UTF-8'; // Sender and recipient $mail->setFrom('info@aa.com', 'موقع koora'); $mail->addAddress($email_std, 'info'); // Email content $mail->isHTML(true); $mail->Subject = 'قبول المشروع من قبل اللجنة'; $mail->addEmbeddedImage($filename, 'qrcode'); // $mail->Body = '<h3>تم القبول المشروع الخاص بك بنجاح</h3>'; $mail->Body= 'qrcode <img src="cid:qrcode" alt="cid:qrcode">'; // Send email $mail->send(); //echo 'Email has been sent successfully'; } catch (Exception $e) { echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}"; } //$message = "لقد م قبول تم قبول المقترح بنجاح"; //$headers = "From: info@aa.com"; /// Send // mail($email_std, 'تم قبول المقترح بنجاح', $message); $sql = "UPDATE `projects` SET `Stat`=1 WHERE `id_Pro`='".intval($_GET['id'])."'"; mysqli_query($con,$sql); echo '<div class="col-md-12">'; echo '<div class="text-center alert alert-success" role="alert">تم قبول بنجاح</div>'; echo '<meta http-equiv="refresh" content="3;url=projetcs.php" />'; echo '</div>'; //$send = mysqli_real_escape_string($con,$_POST['username']); /* if(isset($_POST['submit'])){ } */ } ?> </div> </div> </div> </div> <?php include('footer.php'); ?> وهذا الكود بعد التعديل
- 6 اجابة
-
- 1
-
وعليكم السلام ورحمة الله وبركاته . نعم يمكنك استخدام الدالة gcd فى numpy التى تسمح لك بتمرير رقمين لها وتقوم بارجاع لك ناتج القسمة المشترك الاكبر "Greatest common divisor" . وهذا كود للتوضيح. import numpy as np num1 = 6 num2 = 9 x = np.gcd(num1, num2) print(x) #3 ويمكنك ايضا استخدمها على مصفوفة تحتوى على عدة ارقام و تقوم بارجاع ناتج القسمة الاكبر لجميع هذه الارقام معا . وهذا هو الكود الخاص بها . import numpy as np arr = np.array([20, 8, 32, 36, 16]) x = np.gcd.reduce(arr) print(x) #ُ4
- 3 اجابة
-
- 1
-
وعليكم السلام ورحمة الله وبركاته . المطلوب هو ان تقوم بانشاء دالة تاخذ اول معامل وهو عبارة عن dictionary اى مصفوفة تحتوى على الاسماء الخاصة بالمنتجات وعددها الموجود لديك فى المخزن . والمطلوب هو التكرار على هذا ال dictionary ورؤية اذا كان لديك مخزون كافى لتقوم بالبيع للعميل . حيث ان ثانى معامل هو اسم المنتج الذى يرد ان يقوم بشراءه والاخير هو عدد المنتجات . الخطأ لديك انك تقوم باستقبال سلسلة نصية وليس dictionary
- 13 اجابة
-
- 1
-
العفو اخى الكريم . نعم يمكن وضع العنصر كاملا داخل عنصر جديد ويجب على هذا العنصر ان يحتوى خاصية position:relative ووضعه قبل ال footer ولكن تاكد من هذا العنصر طوله مثل طول العنصر عند فتحه حتى لل يحدث مشكلة . واذا اضفت مزيد من العناصر فللاسف لن يظهر سوى العناصر التى تساوى طول الصفحة حاول جعل ال body يحتو على height كبير بحيث يظهر شريط التمرير سيعمل معك . كما وضحت لك فان العنصر سيكون عائما اى اذا طوله اصبح اكبر من طول الصفحة فان الباقى لن يظهر لانه اصبح خارج الصفحة. هناك حل اخر باستخدام الجافا سكريبت يمكنك الشرجوع الى التصميم الاساسى الخاص بك وعند الضغط وبعد عمل ال transition قم بعمل scroll لاسفل الصفحة بالجافاسكريبت واعتقد ان هذا الحل المناسب لما تريد ان تقوم به .
- 4 اجابة
-
- 2
-
وعليكم السلام ورحمة الله وبركاته . الخطأ لديك اخى الكريم فى العنصر الذى يحتوى على السمة feedback-v2 فلاحظ انك لتضع مكانه فى اخر الصفحة قمت باستخدام الخاصية margin-top وهى تقوم بوضع مسافات بين العناصر وبذلك وضعت مسافة بين هذا العنصر وبداية الصفحة . وعندما تقوم بعمل ال transition فان طول العنصر يصبح اكبر وبذلك المكان الخاص بالعنصر يتغير ويقوم بازاحة العناصر الاخرى لذلك يحدث تمرير للصفحة . ولحل تلك المشكلة فيجب علينا ان نحذف العنص من ال flow بحيث لا يتعامل مع العناصر الاخر فلا يوثر على مكانها . ويمكننا استخدام الخاصية postion:absolute فهذه الخاصية تقوم بحذف العنصر من ال flow ويصبح كانه عائما فى الصفحة فلا يؤثر على اماكن العناصر التى معه وبذلك طول الصفحة . فيمكنك حذف ال margin-top واضافة تلك الخصائص فى السمة feedback-v2. position: absolute; bottom: 0; واذا اردت ان تجعل هذا العنصر ثابت تماما فى اخر الصفحة حتى معى التمرير يظل ثابت قم بوضع fixed بدلا من absoulte وهاتين الطريقتين ستحل لك المشكلة فيمكنك استخدام ما تريد منهما
- 4 اجابة
-
- 2
-
هل هذا المسار صحيح ويوجد الملف بداخله ؟
-
لجعل ملف يتم تحميله يجب الذهاب للمسار الخاص به . حاول ان تذهب الى عنوان ملف backup.php فى المتصفح و استبدله باسم ملف نسخه احتياطيه لديك على الاستضافه واخبرنى اذا تم تحميله ام لا. وايضا قارن المسار الذى يتم تحويلك له عند الضغط على زر تحميل والمسار الذى سوف تقوم بكتابته يدويا واخبرنى بالفرق .
-
وعليكم السلام ورحمة الله وبركاته . لغة بايثون لا يوجد بها null كما فى اللغات الاخرى ولكن بديل لها هى None . وكما فى اللغات الاخرى فان None فى بايثون تشير ايضا الى لاشئ او شئ فارغ لا قيمة له . والفرق ان None فى بايثون ليست قيمة بل هى كائن . وتستخدم None لتهيئة المتغيرات قبل ان نعطيها اى قيمة هكذا مثلا . a = None b = None ومن ثم من الممكن ان نتتحقق لاحقا فى الكود هل تم اسناد قيم ام لا عن طريق الكود التالى . a = None if a is None: print('empty') اذا كما وضحت فان None فى بايثون هى الكلمة المفتاحية المكافئة ل Null فى اللغات الاخرى
- 3 اجابة
-
- 1
-
الحل يعتمد على مكان حفظ الملفات لديك وهل تقوم باستخدام اطار عمل لانشاء ال routes ام لا . وايضا من الممكن انك لا تسمح بتحميل الملفات لديك على الاستضافة عن طريق htaccess مثلا. لذلك هل يمكنك توضيح لى مكان ملف php الذى ارفقته فى السؤال ؟ وهل ملفات ال النسخ الاحتياطى يتم انشاءها فى نفس المكان بجوار الملف php ؟ وهل يمكنك ارسال الرابط الذى كان يذهب اليه قبل تعديل الكود كما اخبرتك ؟ لانى قد قمت بتجربة الكود الذى ارفقته لك وهو يعمل جيدا لدى لان الملفات موجودة بجوار ملف ال php و ايضا لم اقم بحذر الوصول اليها .
-
يبدو انك لم تضع السطر الذى قمت بارفاقه لانه مازال يعيد توجيهك الى المسار الكامل للمشروع لذلك من فضلك قم باستبدال هذا السطر بما لديك واخبرنى.