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

سمير عبود

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

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

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

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

    34

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

  1. تُخبرك رسالة الخطأ ان الوسيط الثاني في التابع update و المسمى team يجب أن يكون نوعه App\Models\Team لكن عند التنفيذ تبين أن النوع هو App\Models\Tournament يجب إحترام الترتيب بما أنك كتبت المسار بهذا الشكل: Route::put('/edit/{tournament}/team/{team}/update',[TeamController::class,'update']); يجب أن يكون المعامل الأول هو tournament و نوعه Tournament و المعامل الثاني team و نوعه Team بهذا الشكل: public function update(Request $request, Tournament $tournament, Team $team) و ليس public function update(Request $request, Team $team, Tournament $tournament) أيضا لديك خطأ في القاعدة required كتبت require، و لديك مُشكلة عند تعديل حالة الفريق يتم إرسال الإستمارة مباشرةً حاول إصلاحها.
  2. جرب حذف المٌجلد storage و تأكد أنك تقوم بحذف المجلد الصحيح، بعد ذلك قم بمسح البيانات المُخزنة بشكل مؤقت (cache) عن طريق تنفيذ الأمر: php artisan optimize:clear ثم قم بإنشاء الوصلة من جديد: php artisan storage:link تأكد أنك تٌنفذ الأوامر في مسار مجلد المشروع الجديد و ليس القديم.
  3. لاحظ بعدما تقوم بعملية انشاء السجل ماذا تفعل: return redirect('/team/edit'); مبدئياً في ملف التوجيهات لا يوجد توجيه مُعرف بهذا الشكل إلا: Route::put('/team/{team}',[TeamController::class,'update']); Route::delete('/team/{team}',[TeamController::class,'destroy']); هاذين التوجيهين الميثود الخاصة بهم هي put للأول و delete للثاني، و أنت في هذه الحالة عندما تُعيد توجيه المُستخدم إلى رابط معين يتم طلبه بالطريقة get لذلك ظهرت هذه المُشكلة و ذلك هو شرحها. إن كنت تريد إعادة التوجيه إلى صفحة التعديل فالرابط هو: /team/{team}/edit و ليس: /team/edit يتوجب عليك كتابة: return redirect("/team/{$team->id}/edit"); أو إستخدام التابع back الذي يُعيد المُستخدم الى الصفحة السابقة بما أنها صفحة التعديل. return back();
  4. لا أدري ما المُشكلة التي تحدث لك لكن السطر المسؤول عن حذف السجل من الجدول الوسيط ليس به خطأ: auth()->user()->servicesInCart()->detach($book->id); و أعتقد أنه يعمل. ما لاحظته أنه عند حذف كل المُنتج من السلة لا تقوم بعملية إسناد للقيمة الجديدة لاحظ هذا السطر: $book->number_of_copies - $oldQuantity; هنا أنت تقوم بعملية طرح فقط كأن تقول 10 - 2 لكن لا تحفظ القيمة الجديدة في خاصية number_of_copies لذلك الكائن. يجب عليك التعديل: $book->number_of_copies = $book->number_of_copies - $oldQuantity; // أو $book->number_of_copies -= $oldQuantity; بإمكانك إستخدام التوابع Increment & Decrement مباشرةً عوض اسناد القيمة للخاصية ثم إستدعاء التابع save. بهذا الشكل: $book->decrement('number_of_copies ', $oldQuantity); بهذا الشكل سيتم التعديل مُباشرة في جدول الكتب. لا تستدعي التابع save. و في حالة حذف نُسخة واحدة تستخدم: $book->decrement('number_of_copies '); لاحظ لم أمرر قيمة للمُعامل الثاني و في هذه الحالة سيتم إستخدام القيمة الإفتراضية و هي 1 أي أنه سيتم الإنقاص بـ 1 نفس الملاحظة في التابع increment يُمكنك إستخدامه في التابع addToCart.
  5. مرحباً سمايلي، إن الأمر مُتعلق بالواجهات الأمامية و الطريقة بسيطة، مثلاً إن كنت ستستعمل خُطوط google fonts بعد اختيار الخط المُناسب لك مثلاً Cairo ثم تحديد السماكة التي تُريدها في ذلك الخط مثلاً أنا اخترت 300، 500 و 700 من أيقونة الخط المُختار في الأعلى أقصى اليمين بعد الضغط عليها ستظهر لك قائمة توضح طريقة تضمين الخط الذي اخترته في مشروعك، إما عن طريق الوسم link او عن طريق القاعدة import@ في css إذا أردت إستخدام الوسم link ستقوم بنسخ ما تم عرضه لك: <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=Cairo:wght@300;500;700&display=swap" rel="stylesheet"> وتضعه ضمن الوسم head في ملف application.html.erb. بعد ذلك في ملف التنسيقات الخاص بك تقوم بوضع القاعدة font-family و تُحدد الخط الذي اخترته للعناصر التي تريد تطبيق الخط عليها: font-family: 'Cairo', sans-serif; بتطبيق القاعدة على العُنصر body سيجعل جميع العناصر ترث ذلك الخط إلا عناصر الإستمارة form فهي لا ترثها، عليك تطبيقها عليها أيضاً. أما إذا اردت إستخدام الخاصية import عليك نسخ: @import url('https://fonts.googleapis.com/css2?family=Cairo:wght@300;500;700&display=swap'); إلى ملف التنسيقات الخاص بك، في تطبيقنا سيكون application.scss في الأعلى و تُطبق الخط على العناصر التي تُريد تطبيقه عليها بنفس القاعدة: font-family: 'Cairo', sans-serif; بالتوفيق.
  6. تقوم بتحويل المُتغيرين من سلاسل نصية إلى كائنات DateTime ثم تستخدم التابع diff لحساب الفرق: <?php // Enter your code here, enjoy! $date1 = '2022-03-25 14:21:36'; $date2 = '2022-03-26 10:15:48'; $start_date = new DateTime($date1); $since_start = $start_date->diff(new DateTime($date2)); سيكون الناتج عبارة عن كائن من الصنف DateInterval من خلاله تستطيع الوصول لعدة خاصيات تُساعدك في تحويل الفرق إلى دقائق أو ساعات أو ثواني ... <?php $date1 = '2022-03-25 14:21:36'; $date2 = '2022-03-26 10:15:48'; $start_date = new DateTime($date1); $since_start = $start_date->diff(new DateTime($date2)); echo $since_start->days.' days total<br>'; echo $since_start->y.' years<br>'; echo $since_start->h.' hours<br>'; echo $since_start->i.' minutes<br>'; echo $since_start->s.' seconds<br>'; سيكون الخرج: 0 days total 0 years 19 hours 54 minutes 12 seconds لحساب الفرق بالدقائق فقط نُحول ناتج الأيام إلى دقائق و نُضيف له ناتج تحويل الساعات إلى دقائق و نضيف له الدقائق كما يلي: <?php $date1 = '2022-03-25 14:21:36'; $date2 = '2022-03-26 10:15:48'; $start_date = new DateTime($date1); $since_start = $start_date->diff(new DateTime($date2)); $minutes = $since_start->days * 24 * 60; $minutes += $since_start->h * 60; $minutes += $since_start->i; echo $minutes.' minutes'; // 1194 minutes أما إن كنت تستخدم مكتبة Carbon فهي تُوفر عدة توابع للتعامل مع التواريخ و الوقت من بينها حساب الفرق بأي وحدة ترغب: <?php $date1 = '2022-03-25 14:21:36'; $date2 = '2022-03-26 10:15:48'; $startTime = \Carbon\Carbon::parse($date1); $finishTime = \Carbon\Carbon::parse($date2); echo $finishTime->diffInHours($startTime) . "<br>"; // 19 echo $finishTime->diffInMinutes($startTime) . "<br>"; // 1194 echo $finishTime->diffInSeconds($startTime) . "<br>"; // 71652 echo $finishTime->diffInSeconds($startTime) . "<br>"; // 71652 $finishTime->diffForHumans($startTime); // 19 hours after $startTime->diffForHumans($finishTime); // 19 hours before \Carbon\Carbon::setLocale('ar'); $startTime->diffForHumans($finishTime); // قبل 19 ساعة
  7. مرحباً @Smaily ناتج التابع where هو إستعلام على قاعدة البيانات بعد تطبيق first سيتم تنفيذ ذلك الإستعلام و جلب أول سجل يُطابق الشرط، ثم بتطبيق destroy سيتم حذف السجل. نعم بإمكانك ذلك لكن سيترتب على هذا التغيير بعض المشاكل يتعين عليك حلها، فالمسارات الخاصة بالمنشورات و التعليقات و التصويت ستتغير و ستُصبح كلها تحت المُجتمعات. و بالتالي جميع الصفحات التي بها روابط تؤدي إلى هذه المسارات يتعين عليك فيها تمرير مُعرف المُجتمع فيها. نعم delete و ليس destroy لكن يُمكن إستخدام post كما فعل المُدرب لا توجد مُشكلة في ذلك، أيضاً يجب تغيير الميثود في المسار أيضاً بحيث تكون delete. بالإضافة لذلك في المسارات من النوع delete نحتاج تمرير مُعرف السجل الذي نُريد حذفه مثلما فعلنا في المشروع السابق مشروع Twitter و خاصية مُتابعة و إلغاء المُتابعة للمُستخدمين. بالتوفيق.
  8. أحد الخيارات المطروحة إضافةً لأجوبة المُدربين هو إستخدام نطاقات الإستعلام الخاصة نُضيف التالي إلى نموذج المُستخدم User: public function scopeAllWithoutCurrent($query) { return $query->where('id', '!=', auth()->id()); } إسم النطاق راجع للمُطور أهم شيء يجب أن يبدأ بكلمة scope و عندما تُريد جلب المُستخدمين تستخدم التابع allWithoutCurrent بالشكل: User::allWithoutCurrent()->get()->dd(); تستطيع بعد إستدعاء التابع allWithoutCurrent أو قبله إستدعاء توابع Eloquent أو توابع لنطاقات إستعلام أنشأتها مُسبقاً مثلما ترغب، لمعلومات أكثر: Local Scopes تتجلى اهمية هذه النطاقات في عدم تكرار كتابة تلك القيود في عدة أماكن في التطبيق، بحيث تكتب النطاق مرة و تستدعيه في أي مكان في تطبيقك بشكل سلس.
  9. بإمكانك مُتابعة الشرح التالي: هنا فهو يشرح نفس الفكرة و لثلاث قوائم خيارات: الدول، المقاطعات و المدن.
  10. قم بنفس الخطوات أنشئ ملف php و ضع به الإستعلام و الحلقة التي تُنشئ عناصر option و بعد ذلك ضع مسار الملف في الخاصية url نفس ما شرحت في أول تعليق.
  11. قم بإرسال الطلب إلى ملف مُنفصل و ليس نفس الملف index.php و تتبع الطلب الذي سيُرسل عند التغيير في select من خلال أدوات المطورين في المتصفح الذي تعمل عليه من خلال تبويب Network إن حدثت أخطاء ستتمكن من معرفة معلومات عنها هناك.
  12. أعتقد أنك تريد عندما يختار المُستخدم ولاية من الولايات يتم عرض البلديات الخاصة بتلك الولاية فقط و إذا غير الإختيار يتم تغيير العرض مرة أخرى. هنا أنت بحاجة إلى إستعمال تقنية ajax و استعمال جافاسكربت للتسمع على حدث change في عُنصر select: بفرض أن عُنصر القائمة الذي تعرض فيه الولايات يأخذ الخاصية id بالقيمة state-dropdown بهذا الشكل مثلاً: <select class="form-control" id="state-dropdown"> ضع أيضاً عُنصر select خاص بالبلديات و أعطه id بالقيمة مثلاً: city-dropdown و إجعله فارغاً مبدئياً: <select class="form-control" id="city-dropdown"> </select> بعد ذلك في أسفل الملف بداخل وسم script تسمع على حدث change في قائمة الولايات: <script> $(document).ready(function() { $('#state-dropdown').on('change', function() { var state_id = this.value; $.ajax({ url: "cities-by-state.php", // هنا نرسل الطلب إلى الخادم type: "POST", data: { state_id: state_id // إرسال قيمة id الذي اختاره المُستخدم }, cache: false, success: function(result) { $("#city-dropdown").html(result); // وضع النتيجة بداخل قائمة البلديات } }); }); }); </script> و في ملف cities-by-state.php نُعالج الطلب و نُرجع النتيجة: <?php require_once "db.php"; $state_id = $_POST["state_id"]; $result = mysqli_query($conn, "SELECT * FROM cities where state_id = $state_id"); ?> <option value="">Select City</option> <?php while ($row = mysqli_fetch_array($result)) { ?> <option value="<?php echo $row["id"]; ?>"><?php echo $row["name"]; ?></option> <?php } ?> فقط نستعلم على عن السجلات التابعة لتلك الولاية التي تم إختيارها. تحتاج إلى صياغة الإستعلام على حسب أسماء الأعمدة و الجداول لديك. الأهم هي الفكرة و الخطوات كالتالي: عرض عُنصر select يحوي كل الولايات بحيث كل option يحوي قيمة الid في الخاصية value لأنه ضروري إرساله مع الطلب لصياغة الإستعلام. عرض عُنصر select مبدئياً فارغ أو يُمكنك وضع option واحد فيه تطلب فيه من المُستخدم إختيار ولاية مُحددة. التسمع على حدث change على العُنصر select الخاص بالولايات و في حالة تفعيل الحدث من المُستخدم : جلب قيمة id و إرسالها في طلب ajax. معالجة الطلب و إرجاع النتائج. في حالة نجاح الطلب نضع المحتوى بداخل قائمة البلديات. استخدمت مكتبة jQuery لكتابة شيفرات جافاسكربت.
  13. تم عمل الدورة لتأهيل الطلاب الذين يشتركون بها لسوق العمل، الأكيد أنه بعد إنهائك للدورة ستكتسب خبرات في مجال تطوير واجهات المُستخدم، من خلال تلك الخبرات يُمكنك التقديم على الوظائف في نفس المجال من خلال منصة بعيد فهناك العديد من الوظائف التي تُطرح من شركات في مختلف الدول العربية هناك، بإمكانك أيضاً تقديم عُروضك و خدماتك من خلال منصة مُستقل أو منصة خمسات. ستحصل بعد إنهائك للدورة و إجتيازك للإمتحان على العديد من النصائح في مجال العمل الحر و التوظيف تساعدك في ضمان استرداد استثمارك خلال 6 أشهر. أنصحك بالإطلاع على الروابط أدناه: الامتحان والحصول على الشهادة مراجعة لدورة تطوير واجهات المستخدم المقدمة من اكاديمية حسوب
  14. في هذا المثال لم يُعرّف Active Record الارتباطات ثنائية الاتجاه تلقائيا لأنها احتوت على: class_name و foreign_key و بالتالي في هذه الحالة لن يُحمل Active Record نُسخة واحدة من الكائن Author أي أن: a = Author.first b = a.books.first a.first_name == b.writer.first_name # => true a.first_name = 'David' a.first_name == b.writer.first_name # => false a و b.writer هنا ليسا نفس الكائن. حيث أن Active Record قام بتحميل نُسختين في البداية كانت قيمة الخاصية first_name مُتساوية في كلتا النُسختين، أما بعد تغيير القيمة للكائن a أصبح هناك إختلاف لذلك المُقارنة أعطت false. وقد ذكر المقال أنه حتى نُساعد Active Record على التعرف على الارتباط ثنائي الاتجاه ليقوم بتحميل نُسخة واحدة من الكائن نستخدم الخيار inverse_of و بالتالي في المثال الأخير: class Author < ApplicationRecord has_many :books, inverse_of: 'writer' end class Book < ApplicationRecord belongs_to :writer, class_name: 'Author', foreign_key: 'author_id' end a = Author.first b = a.books.first a.first_name == b.writer.first_name # => true a.first_name = 'David' a.first_name == b.writer.first_name # => true هنا أعطت المُقارنة true حتى بعد تغيير القيمة first_name لـِ a لأن Active Record تعرفت على الإرتباط ثنائي الإتجاه و أن a و b.writer هما نفس الكائن.
  15. لا أدري أي رسالة خطأ تظهر لك، لكن مبدئياً لديك خطأ في كتابة التابع: getElementByid لغة جافاسكربت حساسة لحالة الأحرف لذلك فالأصح هو getElementById document.getElementById('logout-form').submit();
  16. لتنفيذ الفكرة تحتاج إلى حلقتين، حلقة لتخزين عدد الظهور و حلقة لعرض النتائج، يُمكنك إستخدام الدالة array_fill لملء مصفوفة بقيمة إبتدائية بهذا الشكل: $face_of_roll = array_fill(1, 6, 0); echo "<pre>"; print_r($face_of_roll); echo "</pre>"; ناتج أعلاه سيكون: Array ( [1] => 0 [2] => 0 [3] => 0 [4] => 0 [5] => 0 [6] => 0 ) أي أن عدد ظهور كل وجه هو 0 بعد ذلك قم بتعريف متغير يحمل قيمة عدد الرميات: $number_of_throws = 5; ثم عمل حلقة عدد دوراتها هو قيمة متغير عدد الرميات و من أجل كل دورة تستخدم الدالة rand لجلب عدد عشوائي بين 1 و 6 و تستخدم العدد الذي تُرجعه كفهرس لتُضيف واحد إلى عدد مرات الظهور: $number_of_throws = 5; for($i = 0; $i < $number_of_throws; $i++) { $x = rand(1, 6); $face_of_roll[$x]++; } ثم تعرض النتائج من خلال الحلقة الثانية: for($i = 1; $i <= count($face_of_roll); $i++) { echo "{$i} occurred {$face_of_roll[$i]}<br>"; }
  17. سيتم إرسال بريد إلكتروني لك يتضمن كافة التفاصيل، في القائمة العٌلوية ستجد أنه تم إضافة عٌنصر جديد بالإسم دوراتي من خلاله تتمكن من تصفح الدورات التي اشتركت بها. أو يُمكنك الوصول للصفحة مباشرة من : هنا أحياناً عملية التسجيل تأخذ وقت لذلك لا تقلق من هذا الأمر، قد ترغب في التواصل مع الدعم الفني لطلب توضيح أو طرح إستفسار يُمكنك ذلك من خلال: مركز المساعدة
  18. حاول تطبيق الحل بنفسك وإذا واجهت مشاكل أو لديك استفسار معين قم بإرفاق الشيفرة المتعلقة بسؤالك وتوضيح الاستفسار لكي يتمكن الزوار من مساعدتك نحن لا نقوم بحل الواجبات أو الأعمال الموجهة للطلاب يُمكنك الإستفادة من هذا المقال و من: سلسلة ++c للمحترفين التي تحتوي على عدة مقالات في مواضيع مختلفة.
  19. الدورة توجه المُشتركين إلى سوق العمل لذلك تُركز كثيراً على إطار لارافل لأنه مطلوب بكثرة سواء من طرف الشركات أو عروض التوظيف أو من خلال مشاريع العمل الحر في المواقع، حتى و لو كنت متمرس في اللغة نجد أن مُعظم المطورين المحترفين ينصحون بإستخدام اُطر العمل ليس فقط لأنه تختصر الوقت بل لأنها مبنية بشكل أفضل و بأحسن الممارسات و تحميك من مُعظم الثغرات الموجودة و يتم صيانتها و تحديثها بإستمرار لأنه يعمل عليها و يُشارك فيه العديد من المطورين من مختلف البلدان. الدورة تشرح أساسيات اللغة كما يوجد تطبيق مصغر يجمع تلك الأساسيات مع بعض. عُموما أحيطك علما بأن الإدارة تتابع الأسئلة و تأخذ ملاحظات الطلاب و تدرسها في التحديثات القادمة.
  20. تحتاج إلى توجيه كل الطلبات التي تأتي إلى نُقطة مُعينة مثلاً ملف (index.php) الموجود في مجلد المشروع الرئيسي ثم معالجتها عن طريق إنشاء نظام توجيهات (Router) مهمته توجيه المستخدم حسب الرابط الذي يطلبه. تتم عملية توجيه الطلبات إلى نُقطة مُعينة عن طريق ملف htaccess. يكون ضمن مجلد المشروع و هذا مثال بسيط عن محتواه: <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php [L,QSA] </IfModule> بإمكانك الإطلاع على هاته المساهمات لفهم ملف htaccess: يُمكنك أيضاً البحث عن مساهمات أخرى للإستفادة. أما بخُصوص النُقطة الثانية و هي نظام التوجيهات يُمكنك إما إستخدام مكتبة جاهزة توفر لك ذلك يُمكنك البحث عن ذلك في موقع Packagist من هنا تحتاج إلى معرفة مُسبقة للتعامل مع مدير الحزم composer، أو تقوم بإنشاء نظام توجيه بسيط خاص بك.
  21. هل قمت بإستيراد مكتبة cookie-parser تحتاج إلى الطبقة الوسيطة cookieParser قبل التعامل مع ال cookies لتثبيتها: npm i cookie-parser ثم تقوم بإستيراد المكتبة: const cookieParser = require('cookie-parser'); بعد ذلك تستخدم الطبقة الوسيطة ضمن التطبيق: app.use(cookieParser()); ثم تستطيع إضافة cookie: res.cookie('cookieName', 'cookieValue');
  22. يجب تواجد الحقل user_id قبل إعتماده كمفتاح أجنبي، لذلك يظهر لديك خطأ أن الحقل user_id غير موجود. ويجب عند إضافة المفتاح الأجنبي أن يكون الحقلين من نفس النوع حيث أن id في جدول users عبارة عن unsignedBigInteger لذلك يجب أن يكون أيضاً الحقل user_id نوعه unsignedBigInteger $table->unsignedBigInteger('user_id'); $table->foreign('user_id')->references('id')->on('users'); نُعرف الحقل ثم نٌعينه كمفتاح ثانوي. في النُسخ الحديثة بالإمكان إختصار السطرين أعلاه إلى سطر واحد: $table->foreignId('user_id')->constrained(); أو: $table->foreignId('user_id')->constrained('users'); بحيث نُمرر إسم الجدول للتابع constrained إذا لم نتبع الأعراف في التسميات. بالإمكان إستخدام التوابع cascadeOnUpdate أو cascadeOnDelete و غيرها: $table->foreignId('user_id') ->constrained() ->cascadeOnDelete();
  23. أعتقد أنك تستخدم حزمة Sanctum و قد أنشأت ملف التهجير الخاص بالرموز السرية بنفسك ولم تقم بنشره عن طريق الأمر: php artisan vendor:publish --tag=sanctum-migrations بالتالي أصبح لديك ملفين تهجير لنفس الكلاس و هنا يحدث الخطأ. لقد ذُكر في التوثيق الرسمي: migration-customization أنه في حالة اردت التخصيص تحتاج إلى إستدعاء الميثود Sanctum::ignoreMigrations في التابع register من الصنف App\Providers\AppServiceProvider. و هذا حتى يتم إهمال ملف التهجير الخاص بالحزمة و الإعتماد على ملف التهجير الخاص بك فقط.
  24. يستحسن أن يكون لديك خلفية و لو بسيطة بلغات الويب الأساسية و ذلك لأننا سنستخدمها في المسارات التطبيقية و العملية، تستطيع قبل البدء في دورة تطوير تطبيقات بإستخدام php متابعة المسار الأول من دورة تطوير واجهات المستخدم مسار أساسيات تطوير الويب الذي يحتوي على شرح وافي لهذه التقنيات و من خلاله تستطيع دخول دورة php بدون اي مشكلة. إن قمت بالإشتراك في أي دورة من دورات الأكاديمية ستتمكن من الوصول إلى المسارات الأولى من بقية الدورات.
  25. في ملف المسارات user.js لديك: let usercontroller = require("../controller/usercontroller") router.get("/user",usercontroller) التابع get يقبل callback function كوسيط ثاني و انت تُمرر له كائن. يجب تغيير ذلك إلى: let usercontroller = require("../controller/usercontroller") router.get("/user",usercontroller.view) أيضا ملف conn.js لا يُمكنه الوصول إلى متغيرات البيئة يجب نقل التالي للأعلى في ملف app.js: const express = require('express') require('dotenv').config() // هذا السطر موجود في الأسفل يجب نقله قبل عملية الإتصال let con = require("./conn") بداخل الملف conn.js هناك إستعمال لمتغير غير مُعرف هو conn: conn.query("SELECT * FROM customers", function (err, result) { if (err) throw err; console.log(result); }); // الصواب con.query("SELECT * FROM customers", function (err, result) { if (err) throw err; console.log(result); }); الأفضل دائما نشر صورة لرسالة الخطأ الذي يظهر لك أو نسخ رسالة الخطأ كاملة ووضعها ضمن السؤال، حتى نستطيع المساعدة بشكل أفضل.
×
×
  • أضف...