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

سمير عبود

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

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

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

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

    34

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

  1. المشكلة أن السطر: var colorSelect = $(".color_select option:selected").text(); يجلب كل الخيارات المحددة و يقوم بدمج النص الخاص بها في سلسلة نصية. لديك الآن قائمتين و تم تحديد أحمر و أزرق لذلك ناتج السطر أعلاه كان "أحمر أزرق" و هكذا حسب عدد القوائم فلو كانت ثلاثة و قمت بتحديد أحمر و أزرق و أصفر سيكون الناتج "أحمر أزرق أصفر" و هكذا أما حقول الإدخال من النوع number فالسطر: var colorNumber = $(".colorNumber_input").val(); سيتم تخزين قيمة أول حقل يوافق التحديد و هذا ما يتبين من خلال حقول الإدخال تم تخزين القيم الأولى للزر الأول فقط لكل الأزرار. يتوجب عليك تغيير المنطق الذي تعمل به فيجب عليك تخزين كل القيم في مصفوفات و إرسالها عبر طلب ajax مثلما تفعل مع الخاصية buttons بعد تخزين القيم في مصفوفات تقوم بإرسالها لصفحة php و على أساس هذه المصفوفات تقوم بإنشاء السجلات.
  2. بإمكانك إستخدام حزمة Maatwebsite / Laravel-Excel لتحقيق ذلك: حتى تعمل الحزمة بالشكل المطلوب لديها بعض المتطلبات: PHP: ^7.2\|^8.0 Laravel: ^5.8 PhpSpreadsheet: ^1.15 PHP extension php_zip enabled PHP extension php_xml enabled PHP extension php_gd2 enabled PHP extension php_iconv enabled PHP extension php_simplexml enabled PHP extension php_xmlreader enabled PHP extension php_zlib enabled تثبيت الحزمة: composer require maatwebsite/excel يُمكنك تسجيل مزود الخدمة الخاص بالحزمة بنفسك إن أردت في ملف config/app.php: 'providers' => [ /* * Package Service Providers... */ Maatwebsite\Excel\ExcelServiceProvider::class, ] و حفظ الإسم المستعار في المصفوفة aliases: 'aliases' => [ ... 'Excel' => Maatwebsite\Excel\Facades\Excel::class, ] هاتين الخطوتين ليستا ضروريتان لأن الحزمة auto-discovered. لنشر ملف الإعدادات الخاص بالحزمة في مجلد الإعدادات: php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider" --tag=config تدعم الحزمة التصدير و الإستيراد من و إلى قاعدة البيانات، مثال بسيط لتصدير سجلات النموذج User: نقوم بإنشاء صنف عن طريق الأمر: php artisan make:export UsersExport --model=User سنجد مجلد جديد بالإسم Exports في المجلد app و بداخله الملف UsersExport.php و أي صنف ننُشؤه لاحقاً بنفس الأمر نجده في نفس المسار. نقوم بملء الملف بالشكل التالي: <?php namespace App\Exports; use App\Models\User; use Maatwebsite\Excel\Concerns\FromCollection; class UsersExport implements FromCollection { public function collection() { return User::all(); } } يُمكن التصدير من مجموعة (Collection) او من إستعلام أو من صفحة عرض و كل الطرق مشروحة في توثيق الحزمة. في المتحكم المسؤول نقوم بإنشاء دالة جديدة بالشكل التالي: <?php namespace App\Http\Controllers; use App\Exports\UsersExport; use Maatwebsite\Excel\Facades\Excel; class UsersController extends Controller { public function export() { return Excel::download(new UsersExport, 'users.xlsx'); } } ثم ننُشئ المسار الذي من خلاله نصل الى الدالة export: Route::get('users/export/', 'UsersController@export'); الآن بإمكانك إنشاء زر للوصول إلى المسار او يُمكنك تصفح الرابط مباشرة من المتصفح و سيتم تحميل ملف إكسل بالإسم users.xlsx. يحتوي على البيانات. بإمكانك الإطلاع على التوثيق الرسمي للحزمة للإطلاع على الأمر بشكل موسع: Laravel Excel
  3. سأفترض أن الهيكلية الخاصة بالعناصر كالتالي: <!-- Main Container --> <div class="main-container"> <!-- Select Box Container --> <div> <select name="name" class="color-select"> <option value="" disabled>Select option</option> <option value="1000">option 1</option> <option value="2000">option 2</option> <option value="3000">option 3</option> <option value="4000">option 4</option> </select> <!-- Select Box Container Close --> </div> <!-- text Input Container --> <div> <input type="number" name="number-input1" class="number-input1" readonly> <!-- Close text Input Container --> </div> <!-- text Input Container --> <div> <input type="number" name="number-input2" class="number-input2" value="1"> <!-- Close text Input Container --> </div> <div> <input type="number" name="total" class="total-number" readonly> </div> </div> <!-- end main container --> <!-- Main Container --> <div class="main-container"> <!-- Select Box Container --> <div> <select name="name" class="color-select"> <option value="" disabled>Select option</option> <option value="1000">option 1</option> <option value="2000">option 2</option> <option value="3000">option 3</option> <option value="4000">option 4</option> </select> <!-- Select Box Container Close --> </div> <!-- text Input Container --> <div> <input type="number" name="number-input1" class="number-input1" readonly> <!-- Close text Input Container --> </div> <div> <input type="number" name="number-input2" class="number-input2" value="1"> <!-- Close text Input Container --> </div> <div> <input type="number" name="total" class="total-number" readonly> </div> </div> <!-- end main container --> <!-- Main Container --> <div class="main-container"> <!-- Select Box Container --> <div> <select name="name" class="color-select"> <option value="" disabled>Select option</option> <option value="1000">option 1</option> <option value="2000">option 2</option> <option value="3000">option 3</option> <option value="4000">option 4</option> </select> <!-- Select Box Container Close --> </div> <!-- text Input Container --> <div> <input type="number" name="number-input1" class="number-input" readonly> <!-- Close text Input Container --> </div> <div> <input type="number" name="number-input2" class="number-input2" value="1"> <!-- Close text Input Container --> </div> <div> <input type="number" name="total" class="total-number" readonly> </div> </div> <!-- end main container --> عليه يُمكنك حساب حاصل الضرب بالشكل التالي: $(document).ready(function() { $(document).on('change', '.color-select', function() { var selectedVal = $(this).val(), $mainContEl = $(this).parents('div.main-container'), $numberInputEl1 = $mainContEl.children().find("input.number-input1"), $numberInputEl2 = $mainContEl.children().find("input.number-input2"), $totalInputEl = $mainContEl.children().find("input.total-number"); $numberInputEl1.val(selectedVal); $totalInputEl.val(selectedVal * $numberInputEl2.val()) }); $(document).on('change keyup', '.number-input2', function() { var currentVal = $(this).val(), $mainContEl = $(this).parents('div.main-container'), $numberInputEl1 = $mainContEl.children().find("input.number-input1"), $totalInputEl = $mainContEl.children().find("input.total-number"); $totalInputEl.val(currentVal * $numberInputEl1.val()) }); }); إستخدمت فقط دوال الإنتقال لتحديد العناصر المطلوبة ثم قمت بضرب القيم و تغيير قيمة حقل المجموع الموافقة. و استخدمت حدثي change و keyup يُمكنك تجربة المثال من هنا:
  4. سبب المشكلة أنك تستخدم الخاصية id و هذه الخاصية يجب أن تكون فريدة أي لا يُمكن إعطاء نفس القيمة لعناصر مختلفة. في مثل هذه الحالات يُمكنك عمل traversing إنطلاقاً من عنصر ما لتحديد عُنصر بجوار أو أب للعنصر الذي أطلق الحدث و بعد تحديد العُنصر المطلوب يُمكنك تغيير قيمته و تتم عملية الإنتقال لتحديد العُنصر حسب هيكلية العناصر لديك فالأمر نسبي سأعطيك مثال و في البداية سأعطي قائمة الألوان صنف التنسيقات color-select و سأعطي حقل العدد صنف التنسيقات number-input و سأفترض أن كل من القائمة و حقل العدد موجودان في نفس الأب و هذا مثال بسيط يُوضح العملية: نفترض لدينا الهيكلية التالية: <div> <select name="name" class="color-select"> <option value="" disabled>Select option</option> <option value="1000">option 1</option> <option value="2000">option 2</option> <option value="3000">option 3</option> <option value="4000">option 4</option> </select> <input type="text" name="firstname" class="number-input"> </div> <div> <select name="name" class="color-select"> <option value="" disabled>Select option</option> <option value="1000">option 1</option> <option value="2000">option 2</option> <option value="3000">option 3</option> <option value="4000">option 4</option> </select> <input type="text" name="firstname" class="number-input"> </div> <div> <select name="name" class="color-select"> <option value="" disabled>Select option</option> <option value="1000">option 1</option> <option value="2000">option 2</option> <option value="3000">option 3</option> <option value="4000">option 4</option> </select> <input type="text" name="firstname" class="number-input"> </div> حيث حقل الإدخال يأتي مباشرة بعد القائمة لذلك يُمكن الإنتقال من القائمة إليه بإستخدام الدالة next كما هو موضح: $(document).ready(function() { $(document).on('change', '.color-select', function() { $(this).next().val($(this).val()); }); }); حيث عند إختيار عنصر من أي قائمة سيتم الإنتقال للعنصر الذي يأتي بعد القائمة و تغيير قيمته إلى القيمة المختارة و هكذا أي تغير في قائمة لن يؤثر على بقية القوائم. يُمكنك تجربة المثال من هنا: لنفترض الآن أن القائمة و حقل الإدخال ليس لديهما نفس الأب المباشر مثلاً بهذا الشكل: <div> <select name="name" class="color-select"> <option value="" disabled>Select option</option> <option value="1000">option 1</option> <option value="2000">option 2</option> <option value="3000">option 3</option> <option value="4000">option 4</option> </select> <div> <input type="text" name="firstname" class="number-input"> </div> </div> <div> <select name="name" class="color-select"> <option value="" disabled>Select option</option> <option value="1000">option 1</option> <option value="2000">option 2</option> <option value="3000">option 3</option> <option value="4000">option 4</option> </select> <div> <input type="text" name="firstname" class="number-input"> </div> </div> <div> <select name="name" class="color-select"> <option value="" disabled>Select option</option> <option value="1000">option 1</option> <option value="2000">option 2</option> <option value="3000">option 3</option> <option value="4000">option 4</option> </select> <div> <input type="text" name="firstname" class="number-input"> </div> </div> في هذه الحالة يُمكنك على سبيل المثال تحديد حقل العدد الموافق بهذه الطريقة: $(document).ready(function() { $(document).on('change', '.color-select', function() { $(this).parent().children().find('input.number-input').val($(this).val()); }); }); تستطيع تجربة المثال من هنا: و هنالك عدة دوال توفرها مكتبة جيكويري تُساعدك في الإنتقال يُمكنك إستخدامها على حسب هيكلية العناصر لديك: التنقل بين العناصر في jQuery على موسوعة حسوب.
  5. أعتقد أن قمية APP_DEBUG الحالية لديك هي false لتتحصل على معلومات أكثر عن الأخطاء يجب أن تكون true لاحظ الآن الخطأ أصبح أكثر دقة حيث رسالة الخطأ أصبحت: lluminate\Database\QueryException SQLSTATE[HY000]: General error: 1364 Field 'id' doesn't have a default value (SQL: insert into `messages` (`help_id`, `message`, `phone_number`, `updated_at`, `created_at`) values (3, lorem, 5674245, ... حيث يخبرك أن هناك حقل id في جدول messages لا تقوم بتمريره أثناء إنشاء السجل و هذا الحقل ليس nullable و ليس له قيمة إفتراضية. يُمكنك الآن حل المشكلة كما تريد.
  6. هل بإمكانك توضيح محتوى ملف الإعدادات، لأنه لحد الساعة بهذه المعطيات لا يُمكن إيجاد سبب المشكلة. هل لديك مسار يجلب بيانات من قاعدة البيانات يُمكنك تجربته للتأكد من أن الطريقة get تعمل عند جلب بيانات و للتأكد من الإتصال يعمل
  7. ماهي نتيجة الطلب الذي تُرسله لأن الخطأ 500 ليس متعلق بشيء محدد، حتى نستطيع المساعدة يُرجى تفصيل و شرح المشكلة بشكل أكبر
  8. في ملف env. قم بتفعيل APP_DEBUG مؤقتا حتى تتحصل على الخطأ الفعلي الذي يؤدي إلى المشكلة
  9. إستخدم الدالة on بدل live لأن هذه الأخيرة تم إهمالها و إستبدالها ب on لاحظ المثال التالي: <select name="name" id="name"> <option value="" disabled>Select option</option> <option value="value1">option 1</option> <option value="value2">option 2</option> <option value="value3">option 3 </option> </select> <input type="text" name="firstname" id="firstname"> <script> $(document).ready(function() { $("#name").on("change", function() { $("#firstname").val($(this).val()); }); }); </script> و هو يعمل بشكل جيد يُمكنك تجربته على codepen:
  10. يوفر Laravel طريقة ممتازة للربط بحدث معين في تطبيقك أو مشروعك باستخدام الأحداث (events) والمستمعين (listeners). ستتيح لك هذه الميزة الاشتراك والاستماع إلى الأنشطة المختلفة التي حدثت في التطبيق الخاص بك. ببساطة ، فكر في الحدث على أنه شيء حدث في تطبيقك والمستمعين كمجموعة من المنطق للرد بها على ذلك الحدث. لذلك ، يتيح هذا للمطورين ، إصدار إعلانات داخل التطبيق بحدوث شيء ما وتنفيذ مجموعة من العمليات بناءً على هذا الحدث المحدد. نتيجة لذلك ، ستساعد الأحداث والمستمعون بشكل أكبر في تبسيط أكوادنا وإعادة بناء المهام المعقدة. قد تسأل لماذا نستخدم هذه الخصائص ! تُساعد هذه الخصائص كثيراً في تحقيق مبادئ تصميم البرمجيات (SOLID) حيث أن أحد هذه المبادئ مبدأ SRP اي Single Responsibility Principle و يعني ببساطة أن كل وحدة او كلاس أو دالة يجب عليها أن تقوم بمسؤولية واحدة فقط. قد نرغب في تطبيقنا عند إنشاء منشور ما أن نُرسل إشعار إلى كافة المستخدمين عن طريق البريد الإلكتروني بوجود منشور جديد: نقوم بإنشاء الحدث و المستمع عن طريق الأمر: php artisan make:event PostCreated php artisan make:listener NotifyPostCreated --event="PostCreated" سيُنشئ الأمر أعلاه ملف للحدث بالإسم PostCreated بداخل المسار app/Events و ملف للمستمع بالإسم NotifyPostCreated بداخل المسار app/Listeners بعد ذلك ، تحتاج إلى تسجيل الأحداث والمستمعين في ملف EventServiceProvider.php. في المسار app/Providers: use App/Events/PostCreated; use App/Listeners/NotifyPostCreated; //... /** * The event listener mappings for the application. * * @var array */ protected $listen = [ //... PostCreated::class => [ NotifyPostCreated::class, ], ]; في المصفوفة listen$ مع إستدعاء الكلاسات في الأعلى. الآن بعد أن قمنا بإعداد الأحداث والمستمعين ، كل ما تبقى هو تحديد بعض المنطق داخل الحدث والمستمع. ثم ، أخيرًا إرسال الحدث. أولاً ، لنبدأ بفئة الحدث PostCreated التي أنشأناها سابقًا. ما نريده هو إخطار المستخدمين في كل مرة يتم فيها إنشاء منشور جديد. لذلك ، سنحتاج إلى تمرير كائن post الفعلي إلى باني الفئة PostCreated هذه. سنتعلم كيفية إرسال حدث في وقت لاحق ، ولكن الغرض من ذلك هو إتاحة الوصول إلى الكائن post بين جميع المستمعين. # app/Events/PostCreated.php <?php namespace App\Events; .... use App\Post; class PostCreated { use Dispatchable, InteractsWithSockets, SerializesModels; public $post; /** * Create a new event instance. * * @return void */ public function __construct(Post $post) { $this->post = $post; } } ثانيًا ، ستحتفظ فئة المستمع NotifyPostCreated بالمنطق الفعلي لإرسال البريد الإلكتروني إلى المستخدمين. لاحظ أن هناك تابع handle، هذا هو التابع الذي سيتم استدعاؤه بواسطة الحدث وضمن هذا التابع سنكتب كل الكود اللازم لإرسال البريد الإلكتروني # app/Events/NotifyPostCreated.php <?php namespace App\Listeners; use App\Events\PostCreated; use App\User; use Mail; class NotifyPostCreated { .... .... /** * Handle the event. * * @param PostCreated $event * @return void */ public function handle(PostCreated $event) { // Access the post using $event->post... $users = User::all(); foreach($users as $user) { Mail::to($user)->send('emails.post.created', $event->post); } } } يرجى ملاحظة أنني استخدمت واجهة Mail لإرسال بريد إلكتروني وقمت بتهيئة بيانات اعتماد البريد وفقًا لذلك وأنشأت أيضًا ملفًا لمحتوى البريد الإلكتروني في Resources / views / emails / post / created.blade.php. يُمكن أيضاً إنشاء صنف Notification للتعامل مع الإشعار بشكل مبسط بحيث تُصبح عملية الإخطار بالشكل التالي: $users = User::all(); foreach($users as $user) { $user->notify(new PostCreatedNotification($post)); } الخطوة الأخيرة هي تشغيل حدث PostCreated أو إطلاقه. كل ما علينا فعله هو استخدام المساعد event . سيرسل هذا المساعد الحدث إلى جميع مستمعيه المسجلين. # app/Http/Controllers/PostController.php <?php namespace App\Http\Controllers; use App\Events\PostCreated; use App\Http\Controllers\Controller; use App\Post; class PostController extends Controller { //... public function store(Request $request) { // post storing logic... event(new PostCreated($post)); } } بدلاً من ذلك ، إذا كان حدثك يستخدم Dispatchable trait ، فيمكنك استدعاء التابع الثابت dispatch بهذا الشكل: //... public function store(Request $request) { // post storing logic... PostCreated::dispatch($post); } إفتراضياً لارفل تستخدم نفس العملية عند تسجيل مستخدم جديد لإرسال بريد إلكتروني لتأكيد الحساب.
  11. بإمكانك إستخدام select لتحديد الحقول التي تريدين جلبها مثلاً: $projects = auth()->user() ->projects() ->select('field1', 'field2') ->get(); و في هذه الحالة سيتم جلب كافة مشاريع العضو الحالي على شكل مجموعة كائنات من الصنف Project و كل كائن لديه خاصيتين هما الحقلين الذين تم تحديدهما.
  12. لجمع عناصر كل صف لوحده و كل عمود لوحده نستخدم حلقتين متداخلتين حيث في جمع الصف نجعل الحلقة الخارجية للصفوف و الحلقة الداخلية للأعمدة. أما في جمع عناصر العمود نجعل الحلقة الخارجية للأعمدة و الداخلية للصفوف أي العكس و هذا مثال تطبيقي على الأمر: public class Main { public static void main(String[] args) { int rows, cols, sumRow, sumCol; int a[][] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; rows = a.length; cols = a[0].length; //Calculates sum of each row of given matrix for(int i = 0; i < rows; i++){ sumRow = 0; for(int j = 0; j < cols; j++){ sumRow += a[i][j]; } System.out.println("Sum of " + (i+1) +" row: " + sumRow); } //Calculates sum of each column of given matrix for(int i = 0; i < cols; i++){ sumCol = 0; for(int j = 0; j < rows; j++){ sumCol += a[j][i]; } System.out.println("Sum of " + (i+1) +" column: " + sumCol); } } } سيكون الخرج للمثال اعلاه كالتالي: Sum of 1 row: 6 Sum of 2 row: 15 Sum of 3 row: 24 Sum of 1 column: 12 Sum of 2 column: 15 Sum of 3 column: 18 أما لإنشاء مصفوفة و ملئها بمدخلات المستخدم نحتاج إلى إستخدام الحزمة Scanner كما هو موضح في المثال: import java.util.Scanner; public class Main { public static void main(String args[]){ System.out.print("Enter 2D array size : "); Scanner sc=new Scanner(System.in); int rows=sc.nextInt(); // قراءة عدد الصفوف int columns=sc.nextInt(); // قراءة عدد الأعمدة System.out.println("Enter array elements : "); int twoD[][]=new int[rows][columns]; // إنشاء المصفوفة بالحجم الذي أدخله المستخدم // ملء المصفوفة بالعناصر for(int i=0; i<rows;i++) { for(int j=0; j<columns;j++) { twoD[i][j]=sc.nextInt(); // قراءة العدد و تخزينه في مكانه } } // طباعة العناصر التي أدخلها المستخدم System.out.print("\nData you entered : \n"); for(int []x:twoD){ for(int y:x){ System.out.print(y+" "); } System.out.println(); } } } ستكون نتيجة تنفيذ البرنامج أعلاه كالتالي: Enter 2D array size : 3 3 Enter array elements : 1 2 3 4 5 6 7 8 9 Data you entered : 1 2 3 4 5 6 7 8 9 بإمكانك دمج المثالين مع بعض للحصول على برنامج واحد كما تريد يُمكنك الإطلاع على مفهوم المصفوفات ثنائية البعد بشكل موسع من خلال المقال: المصفوفات ثنائية البعد (Two-dimensional Arrays) في جافا
  13. لقد قمت بتنفيذ التنسيقات المطلوبة على الملفات التي أرفقتها:
  14. يُمكنك حل المشكلة كالتالي: .app-sidebar { /* ... */ overflow: auto; /* سيتم عرض شريط تمرير في حالة تجاوز المحتوى الأبعاد الخاصة بالعنصر */ /* ... */ padding-bottom: 60px; /* إضافة حشوة بمقدار 50 بيكسل من الأسفل */ /* ... */ }
  15. من خلال الرسالة التي ظهرت و التي توضح أن تعليمة foreach تحتاج أن يكون المعامل الذي يتم تمريره لها من النوع مصفوفة أو كائن لكن يبدو أنه يتم تمرير قيمة بوليانية أو منطقية أو متغير يحمل قيمة منطقية لكن من خلال الأكواد التي قمتِ بإرفاقها لم يتبين ذلك. هل بإمكانك توضيح الخطأ او المشكلة بشكل أكبر حتى نستطيع المساعدة، يُمكن أيضاً أن الإطار يعمل بنُسخة مخزنة سابقاً من صفحات العرض لذلك لم يأخذ التعديلات الجديدة بعين الإعتبار يُمكنك عمل clear لصفحات العرض من خلال تنفيذ الأمر: php artisan view:clear
  16. نعم بالطبع فالتعليمات ستتنفذ بالترتيب سيطبع أولا قيمة العداد ثم سيتحقق من الشرط أي إذا وصلت قيمة العداد إلى القيمة 10 سيطبع ما قلت له أن يطبعه في حال تحقق الشرط. و هذا عمل الحلقات التكرارية أي ان التعليمات التي أردناها أن تكرر لعدد ما ستتنفذ بشكل متكرر إلى حين إنتهاء الحلقة هذا المثال الذي أرفقته بلغة جافاسكربت: for(var i = 1; i <= 10; i++) { console.log(i); if(i === 10) console.log("الصلاة و السلام على سيدنا محمد"); } المثال أعلاه إستخدمنا الحلقة for و العداد i يبدأ من 1 إلى حين أن تتساوى قيمته بالعدد 10 و سيُضاف واحد لقيمته كل دورة للحلقة و في كل دورة يتم تنفيذ أمر طباعة و تحقق و هذا ناتج التنفيذ: 1 2 3 4 5 6 7 8 9 10 الصلاة و السلام على سيدنا محمد ستُلاحظ أنه طبع عبارة الصلاة و السلام على سيدنا محمد و أنهى الحلقة لأن شرط إنتهاء الحلقة قد تحقق. فقيمة i أصبحت 11 و 11 أكبر من 10.
  17. يُمكنك الوصول إلى ما تريد ببساطة بإستخدام: n = 123456789 print('{:,}'.format(n)) # من أجل إصدار أكبر من 2.7 print(f'{n:,}') # من أجل إصدار أكبر من 3.6
  18. يُمكنك كتابة أسطرك البرمجية و فصل الأسطر بإستخدام الأقواس بدون أية مشاكل مثلاً: x = (1 + 2 + 3 + 4 + 5) print(x) # 15 أو يُمكنك فصل الخط بشكل صريح بإستخدام علامة \ في حالتك: x = 1 + 2 + 3 + \ 4 + 5 print(x) # 15 إن كنت ستستخدم علامة \ في نهاية السطر يجب أن تكون الأخيرة و ليس بعدها مسافات فارغة او تابات فهذا سيُعطي خطأ: SyntaxError: unexpected character after line continuation character
  19. بعد الحصول على المصفوفة يمكنك الوصول للحقل الذي تريده بداخل الأقواس مثلاً: <?php $query = "SELECT name, COUNT(name) as c from users GROUP BY name ORDER BY COUNT(name) desc LIMIT 1"; $result = mysqli_query($db, $query); if ($result) { $row = mysqli_fetch_assoc($result); echo $row['name']; }
  20. يُمكن للدالة range التعامل مع الأعداد الصحيحة فقط أي لا يُمكن تمرير معاملات بقيم بفاصلة عشرية و إنما يُمكن الوصول لما تريد بعدة طرق من بينها: إستخدام list comprehension: print([x/10 for x in range(0, 10)]) # [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9] إستخدام دالة linspace من مكتبة numpy: import numpy as np print(np.linspace(0,1,10,endpoint=False)) # [0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9] إستخدام الدالة arange من مكتبة numpy تتيح لك تحديد الخطوة بالفاصلة العشرية: import numpy as np print(np.arange(0.0, 1.0, 0.1)) # [0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9] يُمكن إنطلاقاً من الطريقة الأولى إنشاء دالة لتوليد قائمة مع تمرير المعاملات: def seq(start, stop, step=1): n = int(round((stop - start)/float(step))) if n > 1: return([start + i / pow(step, -1) for i in range(n+1)]) elif n == 1: return([start]) else: return([]) print(seq(1, 2)) # [1] print(seq(10, 0, -2)) # [10, 8, 6, 4, 2, 0] print(seq(0, 5, -1)) # [] print(seq(0, 1, 0.1)) # [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
  21. ارجو أن تُحدد في سؤالك ماذا تريد بالضبط حتى نستطيع تقديم المساعدة بشكل دقيق إذا كنت تريد الإستعلام عن أكثر اسم مكرر و ليكن إسم الحقل هو name و الجدول الذي تريد الإستعلام منه هو users يُمكنك إستخدام الإستعلام التالي لجلب أكثر إسم مكرر: <?php $query = "SELECT name, COUNT(name) as c from users GROUP BY name ORDER BY COUNT(name) DESC LIMIT 1"; $result = mysqli_query($db, $query); if ($result) { $row = mysqli_fetch_assoc($result); print_r($row); } أما إن كنت تريد الأقل تكراراً فبدل الترتيب التنازلي نستخدم الترتيب التصاعدي : <?php $query = "SELECT name, COUNT(name) as c from users GROUP BY name ORDER BY COUNT(name) ASC LIMIT 1"; // أو $query = "SELECT name, COUNT(name) as c from users GROUP BY name ORDER BY COUNT(name) LIMIT 1";
  22. يُمكنك إستخدام الدالة: array_count_values التي تُعيد عدد المرات التي يظهر فيها كل عنصر في المصفوفة على سبيل المثال: <?php $superm= array('محمد','رضا','أبراهيم','محمد','محمد','رضا','محمد'); $values = array_count_values($superm); print_r($values); سيُعطي النتيجة: Array ( [محمد] => 4 [رضا] => 2 [أبراهيم] => 1 ) ثم إستخدام الدالة arsort لترتيب المصفوفة التي تحصلنا عليها بشكل عكسي حسب عدد التكرارات. <?php $superm= array('محمد','رضا','أبراهيم','محمد','محمد','رضا','محمد'); $values = array_count_values($superm); arsort($values); print_r($values); سنحصل على النتيجة: Array ( [محمد] => 4 [رضا] => 2 [أبراهيم] => 1 ) تحصلنا على نفس النتيجة لأن محمد يأتي أول الترتيب في المصفوفة المعطاة و رضا يأتي ثانياً لو جعلنا على سبيل المثال ابراهيم أولا لحصلنا على نتيجتين مختلفتين. ثم للحصول على المفاتيح فقط أي محمد و رضا و ... نستخدم الدالة array_keys التي سترجع مصفوفة تضم الأسماء حيث أول عنصر هو الأكثر تكرار و آخر عنصر هو الأقل تكرار: <?php $superm= array('محمد','رضا','أبراهيم','محمد','محمد','رضا','محمد'); $values = array_count_values($superm); arsort($values); print_r($values); /* Output: Array ( [0] => محمد [1] => رضا [2] => أبراهيم ) */
  23. ال polymorphism أو تعدد الأشكال هو أحد المبادئ الأربعة للبرمجة كائنية التوجه و هو لا يتعلق بلغة جافا بحد ذاتها و إنما يتعلق بالبرمجة كائنية التوجه كأسلوب، و أي لغة تعتمد هذا الأسلوب يُمكنها إستخدام هذا المبدأ. و ببساطة يعني أنه يُمكننا الوصول لعدة أشكال إنطلاقاً من شيء مُعين. و ينقسم إلى نوعين: static polymorphism او Compile time Polymorphism يُعرف أيضًا باسم تعدد الأشكال الثابت. يتم تحقيق هذا النوع من تعدد الأشكال عن طريق التحميل الزائد للوظيفة (Method overloading) أو التحميل الزائد للعوامل (operator overloading) . لكن Java لا تدعم التحميل الزائد للعوامل. Method Overloading: عندما تكون هناك وظائف متعددة بنفس الاسم ولكن مع وسائط مختلفة ، يُقال إن هذه الوظائف محملة بشكل زائد. يمكن زيادة تحميل الوظائف عن طريق التغيير في عدد الوسائط اوالتغيير في نوع الوسائط. مثال: بإستخدام نوع مختلف للوسائط class MultiplyFun { // Method with 2 parametera type int static int multiply(int a, int b) { return a * b; } // Method with the same name but 2 double parameters static double multiply(double a, double b) { return a * b; } } class Main { public static void main(String[] args) { System.out.println(MultiplyFun.multiply(3, 2)); // 6 System.out.println(MultiplyFun.multiply(5.5, 6.3)); // 34.65 } } مثال بإستخدام عدد مختلف من الوسائط: class MultiplyFun { // Method with 2 parameter static int multiply(int a, int b) { return a * b; } // Method with the same name but 3 parameter static int multiply(int a, int b, int c) { return a * b * c; } } class Main { public static void main(String[] args) { System.out.println(MultiplyFun.multiply(2, 4)); // 8 System.out.println(MultiplyFun.multiply(2, 3, 4)); // 24 } } لاحظ أنه في كل من المثالين وصلنا إلى أشكال مختلفة لكن من نفس الشيء و هو الوظيفة multiply. يُسمى هذا النوع ب Compile time Polymorphism لانه في وقت الترجمة المُترجم يكون لديه القدرة على تحديد الوظيفة التي ستتنفذ. Runtime polymorphism او يُعرف أيضًا باسم إرسال الوظيفة الديناميكية. وهي عملية يتم فيها حل استدعاء الدالة في وقت التشغيل. يتم تحقيق هذا النوع من تعدد الأشكال عن طريق إعادة تعريف الدوال (Method Overriding). Method Overriding: يحدث عندما يكون للفئة المشتقة (derived class) تعريف لإحدى الوظائف في الفئة الأساسية (base class). يقال إن هذه الوظيفة الأساسية تمت إعادة تعريفها او تم تجاوزها: class Parent { void print() { System.out.println("Parent class"); } } class Child1 extends Parent { void print() { System.out.println("Child 1 class"); } } class Child2 extends Parent { void print() { System.out.println("Child 2 class"); } } class TestPolymorphism { public static void main(String[] args) { Parent a; a = new Child1(); a.print(); // Child 1 class a = new Child2(); a.print(); // Child 2 class } } لاحظ أن الوظيفة print تم إعادة تعريفها في الفئات الأبناء و الكائن a الذي أنشأناه هو كائن من النوع Parent و سيتم تحديد أي وظيفة print سيتم إستدعاؤها وقت التشغيل لذلك يُسمى هذا النوع ب Runtime polymorphism. يُمكنك الإطلاع على هذا المقال للحصول على معلومات أكثر: الوراثة والتعددية الشكلية (Polymorphism) والأصناف المجردة (Abstract Classes) في جافا
  24. أعتقد أنه لديك مُشكلة في الإستعلام الذي يتم تنفيذه يُمكنك عرض الأخطاء في حالة حدوثها بإستخدام: mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); في ملف الإتصال، حيث إذا أضفته و جربت إرسال البيانات سيعرض لك رسالة تُخبرك بوجود خطأ ما في الإستعلام. سبب الخطأ هو وجود الكلمة group في الإستعلام حيث أن هذه الكلمة تُعتبر كلمة محجوزة في لغة sql لذلك في هذه الحالة يجب إحاطة الكلمة ب علامتي إقتباس مائلة `group` كما يُمكنك إحاطة كل الحقول بهذه العلامات ليُصبح الإستعلام بهذا الشكل: $query = "INSERT INTO `messages_groups` (`sender_id`, `sender_name`, `picture`, `group`, `message`) VALUES ('".$sender_id."', '".$sender_name."','".$picture."','".$group."','".$message."')";
  25. يبدو أنك أخطأت في شيء ما عند جلب البيانات من القاعدة سأرفق لك الملفين يعملان بشكل سليم: index.php response.php أضفت جدول في أسفل الإستمارة سيحتوي على كافة البيانات و عند إضافة سجل جديد سيظهر صف آخر في الجدول دون الحاجة لتحديث الصفحة.
×
×
  • أضف...