-
المساهمات
1388 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
16
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Sam Ahw
-
أخطاء null safety ليس لها علاقة بالحزمة أو المكتبة التي تستخدمها، بل تتعلق بلغة Dart نفسها. ولذلك يجب عليك فهم آلية عملها لتستطيع استخدامها في الشيفرة البرمجية لديك وتجنب هذه الأخطاء مع المكتبات الخارجية. Null Safety أو اختصاراً NNBD هي آلية تعتمدها Dart بدءً من الإصدار الثاني ويقوم بها المترجم للتأكد من صحة نمط المتغيّرات أثناء كتابة الكود البرمجي لتجنّب الأخطاء مستقبلاً أثناء التشغيل أو runtime مما يسمح بكتابة شيفرة برمجية عالية الأداء وخالية من الأخطاء. باختصار إن وضع الأمان في null safety يعني أن المتغيرات لا يمكن أن تحتوي على قيم فارغة، ففي حال أراد المطوّر تعريف متغيّر على أنه قيمة فارغة أو null، يجب عليه ذكر ذلك صراحةً أثناء تعريف هذا المتغيّر. فعلى سبيل المثال، بمجرّد تعريف نمط لمتغيّر على أنه int، أي سيحوي حصراً قيمة عددية من نمط int ولا يمكن أن تكون هذه القيمة (null): void main() { int marks; marks = null; //سيسبب بظهور رسالة خطأ أثناء الترجمة } وهنا ستظهر لك رسالة الخطأ نفسها الظاهرة في الصورة، وهي أنه لا يمكن للمتغيّر marks أن يحوي القيمة null لأنه من نمط int. في حال أردنا إضافة القيمة null إلى هذا المتغيّر أثناء التعريف يجب استخدام الإشارة ? فيصبح من النمط int? int? marks = 36; // تتيح الإشارة إمكانية اسناد القيمة الفارغة لهذا المتغيّر marks = null; وهنا سيتم اسناد القيمة null إلى هذا المتغيّر دون حدوث خطأ أثناء الترجمة. وأيضاً في حالتك وعند وجود خصائص فرعية يمكنك إضافة العلامة ? إلى هذه الخصائص: final value = person?.address?.street?.value; وبنفس الطريقة أثناء استخدام هذا المتغيّر فيما بعد ضمن الشيفرة البرمجية، في حال كان يقبل القيمة null، يجب عليك إحاطة أماكن استخدام هذا المتغيّر بجمل شرطية، مثل شرط if: if(marks != null){ .... } وإلا ستظهر لك الرسالة الظاهرة في الصورة: "The property audio can't be unconditionally accessed" والتي تعني أنه لا يمكنك استخدام متغيّر ما بشكل مباشر ضمن الشيفرة البرمجية لأنه يقبل القيمة null، وبالتالي يجب عليك استخدام شرط ما للتحقق من أنه لا يساوي null. ويمكنك قراءة المزيد من المعلومات والأمثلة من قسم Null Safety في التوثيق الرسمي لـ Dart.
- 2 اجابة
-
- 1
-
يجب عليك حذف منصات SDK المثبتة مسبقاً والتي يمكنك إيجادها ضمن المسار التالي: ~\Android\Sdk\platforms وإعادة تحميلها من جديد من خلال SDK Manager. في حال لم تتم حل المشكلة، يمكنك تحديث Gradle ضمن مشروعك: في الملف android/build.gradle: buildscript { repositories { google() mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:7.0.2' // قم بتحديث النسخة لأحدث نسخة موجودة ... } } ضمن الملف android/gradle/wrapper/gradle-wrapper.properties: distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-all.zip # تحديث رقم النسخة هنا أيضاً
- 1 جواب
-
- 1
-
أبسط طريقة هي باستخدام مكتبة image_picker، حيث تحتوي خاصية imageQuality وهي قيمة رقمية يمكنك تعديلها بشكل فوري: ImagePicker imagePicker = ImagePicker(); PickedFile compressedImage = await imagePicker.getImage( source: ImageSource.gallery, imageQuality: 75, ); أو يمكنك أيضاً كتابة حد أعظمي لأبعاد الصورة كي لا تتجاوزه بكتابة الخاصيتين maxWidth و maxHeight: PickedFile compressedImage = await imagePicker.getImage( source: ImageSource.gallery, maxHeight: 200, maxWidth: 200 ); ); وأيضاً يوجد حزمة من الأدوات ضمن مكتبة الصور في لغة البرمجة Dart والتي يمكنك استخدامها مع المكتبة path_provider لتحقيق ذلك، مثال: import 'package:image/image.dart' as Im; import 'package:path_provider/path_provider.dart'; import 'dart:math' as Math; void compressImage() async { File originialImage = await ImagePicker.pickImage(); final tempDir = await getTemporaryDirectory(); final path = tempDir.path; int randomTitle = new Math.Random().nextInt(10000); Im.Image image = Im.decodeImage(originialImage.readAsBytesSync()); Im.Image smallImage = Im.copyResize(image, 500); var compressedImage = new File('$path/new_$randomTitle.jpg')..writeAsBytesSync(Im.encodeJpg(image, quality: 85)); } حيث نقوم بضغط الصورة المطلوبة من خلال التابع copyResize وهنا وضعنا القيمة التجريبية 500. يمكنك الاطلاع على المزيد من التفاصيل والأدوات من توثيق المكتبة image_picker أو حزم التعامل مع الصور ضمن لغة dart.
- 3 اجابة
-
- 1
-
يتم تحديث المحتوى باستمرار ضمن كافة دورات أكاديمية حسوب، ولكن حتماً ستبقى وتيرة التحديث ضمن المكتبات نفسها ولغات البرمجة أسرع من أي محتوى مسجّل على الانترنت. وبما أن طريقة الشرح تعتمد على التطبيق الواقعي وليس الأمور النظريّة، قد تتطلب هذه التحديثات بعض الوقت لإضافتها. أما في حال واجهتك أي مشكلة برمجية أو خطأ أثناء متابعتك للدروس والتطبيق العملي جراء هذه التحديثات، يمكنك متابعة التعليقات أسفل الدروس وكتابة تعليقك الخاص مع ذكر تفاصيل المشكلة وسيقوم فريق المدربين بمساعدتك وتقديم الحل بشكل مباشر. كما أنصحك باستخدام نفس النسخ والإصدارات من المكتبات أو أطر العمل التي يستخدمها المدربون ضمن الدروس لتلافي هذه الأخطاء قدر المستطاع.
-
بالنسبة لنقل المشروع إلى جهاز آخر أو نشره، ستجد خيارين عند النشر ضمن Deployment Mode: 1- Framework-Dependent: والتي تعني أنه سيتم فقط نقل حزم ومكاتب محددة الخاصة بالتطبيق إلى مكان النشر. 2- Self-Contained: والتي ستقوم بنسخ كافة ملفات .NET Core runtime وجميع المكتبات الأخرى اللازمة لعمل التطبيق. أما عن آلية تشغيل مواقع الويب ASP.net على خادم IIS: تأكد من تحميل حزمة .NET Core Hosting على خادم IIS والتي تحوي كل من NET Core Runtime و .NET Core Library و ASP .NET Core Module لتسمح بتشغيل مواقع .NET Core على خادم IIS. وبعدها قم بإعادة تشغيل الجهاز والخادم، ثم بعد تهيئة الإعدادات اللازمة لعمل الموقع مثل تحديد مسار الملف واسم النطاق localhost والأمور الأساسية، توجه لمشروع وقم بنشره publish إلى مجلّد (Folder) ثم نضع المسار الذي قمت بتحديده سابقاً في إعدادات الخادم. وسيقوم بدوره بتوليد الملف web.config ضمن مجلّد المشروع بشكل تلقائي. ملاحظة: في حال لم تتمكن من تشغيل الموقع الرجاء كتابة الخطوات التي حاولت تنفيذها ورسائل الخطأ التي تظهر لك بوضوح لنستطيع مساعدتك بشكل أفضل في المستقبل.
- 2 اجابة
-
- 1
-
في حال لا ترغب باستخدام مكاتب إضافية، يمكنك استخدام التابع setInterval في جافاسكريبت والذي يقوم بالتنقّل بين الشرائح أو الصور خلال فترات زمنية معيّنة بشكل تلقائي: مثال بسيط بفرض لديك الشرائح التالية: <div class="carousel"> <div class="carousel-item"> <div class="red"></div> </div> <div class="carousel-item"> <div class="green"></div> </div> <div class="carousel-item"> <div class="yellow"></div> </div> <div class="carousel-item"> <div class="violet"></div> </div> </div> التنسيق المبدئي للشرائح (يمكنك تغييرها أو استبدالها بصور حسب المطلوب): * { box-sizing: border-box; } .carousel { position: relative; width: 400px; height: 270px; overflow: hidden; background-color: #cdcdcd; } .carousel .carousel-item { position: absolute; width: 100%; height: 270px; border: 1px solid #2e2e2e; top: 0; left: 100%; } .carousel .carousel-item.active { left: 0; transition: all 0.3s ease-out; } .carousel .carousel-item div { height: 100%; } .carousel .carousel-item .red { background-color: red; } .carousel .carousel-item .green { background-color: green; } .carousel .carousel-item .yellow { background-color: yellow; } .carousel .carousel-item .violet { background-color: violet; } وبعد ذلك يتم استدعاء شيفرة جافاسكريبت التالية للتنقّل بين الشرائح: window.onload = function(){ var slides = document.getElementsByClassName('carousel-item'), addActive = function(slide) {slide.classList.add('active')}, removeActive = function(slide) {slide.classList.remove('active')}; addActive(slides[0]); setInterval(function (){ for (var i = 0; i < slides.length; i++){ if (i + 1 == slides.length) { addActive(slides[0]); slides[0].style.zIndex = 100; setTimeout(removeActive, 350, slides[i]); if (slides[i].classList.contains('active')) { slides[i].removeAttribute('style'); setTimeout(removeActive, 350, slides[i]); addActive(slides[i + 1]); break; } } }, 4000); } يمكنك التحكّم بزمن تأخير الانتقال بين الشرائح بتعديل القيمة 4000 الموجودة في التابع setInterval.
-
لا يمكن تحديد أسباب الرفض فهي غير محدودة، ولكن يجب عليك اتباع الإرشادات الموجودة في الموقع حسب المنتج الذي ترغب بنشره، فكل منتج له قواعد معيّنة يجب اتباعها يوجد متطلبات واضحة لكل منتج، ويمكنك الوصول إليها بكتابة المتطلبات أو requirements مع نوع المنتج لديك فمثلاً إذا كان لديك صفحات bootstrap يمكنك البحث عن Bootstrap Skins Category Requirements وهكذا في حال كان لديك تطبيق موبايل أو غيره. أما بالنسبة للخطوط والهوامش وjQuery، فلا يوجد قيم معيّنة مفروضة لذلك وإنما يجب على التصميم أن يكون متاجوب بشكل كامل على كافة المتصفحات والأجهزة والشاشات، ومراعاة جميع القواعد ضمن أطر العمل التي تستخدمها (مثلاً في bootstrap يجب عليك اتباع Bootstrap core styling). وفي حال استخدمت أي مكتبة خارجية ضمن jQuery يجب عليك كتابة شرح كامل عن استخدام هذه المكتبة بالإضافة لوضع تعليقات ضمن الشيفرة البرمجية توضّح كل قسم لديك وما الغرض منه. هذه القواعد وغيرها هي لضمان جودة المنتجات التي يتم نشرها واستخدامها، ويمكنك البحث عنها ضمن الموقع.
- 1 جواب
-
- 1
-
إن مفهوم البرمجة الكائنية أو object oriented هو مفهوم موجود في جميع لغات البرمجة، وبمجرّد فهمك له ستستطيع تطبيقه في جافاسكريبت وغيرها من لغات البرمجة. عندما يتواجد لديك مجموعة من الخصائص المرتبطة ببعضها، من الأفضل تجميعها ضمن كائن. فمثلاً إذا كان لديك صفات الاسم، العمر، العنوان،..إلخ وكل هذه الصفات تابعة لشخص (أو مستخدم): var name = "Ahmad" var age = 30 var address = "any address 123" يمكنك تجميعها ضمن غرض واحد لتصبح بالشكل التالي: var person = { name: "Ahmad", age: 30, address: "any address 123" } وبنفس الطريقة بالنسبة للتوابع، في حال كانت تتشارك حول محور معيّن أو مهمة معيّنة، يمكنك تجميعها معاً ضمن كائن واحد. وذلك سيساعد أي مطوّر يقرأ الشيفرة البرمجية، لأن هذه الصفات مرتبطة ببعضها وتعبّر جميعها عن الكائن نفسه، ولا معنى لها بتواجدها بشكل مستقل. يمكنك الاطلاع على المزيد الأمثلة والتفاصيل حول البرمجة الكائنية وطرق استخدامها في الشيفرة البرمجية في المقال التالي:
- 1 جواب
-
- 1
-
يمكنك طلب تزويدك بتوثيق لخطوات الدمج من قبلهم، كما أنك لن تحتاج لبناء موقع ويب كامل بخصائص أخرى، يكفي وجود خادم ويب لمعالجة هذه العملية وحفظ البيانات اللازمة لتطبيقك في قاعدة البيانات.
- 4 اجابة
-
- 1
-
في حال قمت بتحويل الصورة إلى النمط svg يمكنك إدراج شيفرة جافاسكريبت ضمنها باستخدام الوسم CDATA والاستجابة لنشاط المستخدم داخلها، مثال بسيط: <svg width="600" height="600"> <script type="text/JavaScript"> <![CDATA[ function showColor() { alert("Color of the Rectangle is: "+ document.getElementById("rect1").getAttributeNS(null,"fill")); } function showArea(event){ var width = parseFloat(event.target.getAttributeNS(null,"width")); var height = parseFloat(event.target.getAttributeNS(null,"height")); alert("Area of the rectangle is: " +width +"x"+ height); } ]]> </script> <g> <text x="30" y="50" onClick="showColor()">show rectangle color.</text> <rect id="rect1" x="100" y="100" width="200" height="200" stroke="green" stroke-width="3" fill="red" onClick="showArea(event)"/> </g> </svg> يعتبر النمط SVG أفضل للحفاظ على تجاوبية الرسم مع اختلاف أحجام شاشات العرض، ولكن ذلك قد يتطلب منك معرفة إضافية بالتعامل مع SVG للوصول إلى العناصر المطلوب التفاعل معها.
-
لقراءة الملف: يجب أن تقوم أولاً بتحديد مسار الملف، ثم قراءة المحتوى باستخدام الدالة readlines وإرساله إلى المستخدم كالتالي: root = os.path.realpath(os.path.dirname(__file__)) json_path = os.path.join(root,'myfile.json') {% قم بتغيير المسار حسب تموضعه ضمن مشروعك %} myfile = open(json_path) json_data = myfile.readlines() myfile.close() return json_data وللكتابة على الملف، يمكنك استخدام الدالة dump الموجودة ضمن مكتبة json: with open('myfile.json', 'w') as f: json.dump(data, f) {% مع استبدال المتغيّر data بالبيانات المطلوبة %} يمكنك أيضاً الاطلاع على المزيد من الخصائص والأمثلة التي تقدمها هذه المكتبة من التوثيق الرسمي.
-
بما أنك ستحتاج موقع على الويب (بغض النظر عن لغة البرمجة) فنعم ستحتاج لاستضافة للموقع واسم نطاق (دومين). أما بالنسبة للغة البرمجة أو التقنية المطلوبة ضمن الموقع فيجب عليك التواصل معهم لمعرفة لغات البرمجة المدعومة من قبلهم والخطوات التفصيلية لعملية الدمج. بعض وسائط الدفع لا تدعم التكامل المباشر مع طرف المستخدم وهنالك وسائط أخرى تحتاج لآلية توثيق معيّنة (خادم إلى خادم) لذلك قد يطلب منك وجود موقع الكتروني أو ببساطة (خادم ويب) يستطيع إجراء هذه العملية مع وسيط الدفع.
- 4 اجابة
-
- 1
-
كما في التعليق السابق يتم استخدام نسب مئوية ليتناسب العرض مع عرض الشاشة. وعندما نرغب بتغيير العرض والطول معاً عند تغيير حجم الشاشة نستخدم بالإضافة لذلك height: auto ليبقى الطول متناسق مع العرض (وهو الشكل التلقائي) كالتالي: .res-img { width: 100%; height: auto; } في حال أردنا من الصورة أن تزداد في الطول فقط دون أن تصبح أكبر من حجم الشاشة، نقوم بكتابة الحد الأعظمي لعرض الصورة: .res-img { max-width: 100%; height: auto; } كما يمكننا وضع حد أعظمي للصورة لكي لا تتجاوزه مهما كبر بعدها حجم الشاشة، وذلك يستخدم للتعامل مع شاشات الأجهزة الكبيرة: .res-img { width: 100%; max-width: 400px; height: auto; } ويمكنك البحث على خصائص object-fit في CSS للتحكم بطريقة عرض الصورة نفسها.
-
Arithmetic Operators أو العمليات الحسابية في الجافاسكريبت هي: + , - , * , / , % هل قمت بمحاولة حل السؤال؟ أرجو أن تنشر الطرق التي جربتها والناتج الذي ظهر معك
- 3 اجابة
-
- 1
-
حاول التأكد من إعادة كتابة التنسيقات لتتوافق مع النسخة الخامسة. وتأكد من أنه تم تضمين جميع ملفات بوتستراب اللازمة في حال قمت بتحميله من خلال Nuget أو بطريقة مباشرة. إذا لم تستطع حل المشكلة يجب عليك ذكر المزيد من التفاصيل وأجزاء الشيفرة البرمجية من مشروعك المتعلقة بتضمين المكتبة ورسالة الخطأ التي تظهر لك كما هي لنستطيع مساعدتك بشكل أفضل.
-
يتم شطب الدوال التي تم تحديثها وإهمالها في النسخ الحديثة من android. وهذه الدالة أصبحت مهملة وتم استبدالها بالدالة registerForActivityResult حيث كانت الطريقة السابقة كالتالي: public void openSomeActivityForResult() { Intent intent = new Intent(this, SomeActivity.class); startActivityForResult(intent, 123); } @Override protected void onActivityResult (int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK && requestCode == 123) { doSomeOperations(); } } والتي يمكن استبدالها لتصبح بالشكل التالي: ActivityResultLauncher<Intent> someActivityResultLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() { @Override public void onActivityResult(ActivityResult result) { if (result.getResultCode() == Activity.RESULT_OK) { Intent data = result.getData(); doSomeOperations(); } } }); public void openSomeActivityForResult() { Intent intent = new Intent(this, SomeActivity.class); someActivityResultLauncher.launch(intent); } للمزيد من التفاصيل والأمثلة يمكنك مراجعة التوثيق الرسمي والبحث عن الدالة registerForActivityResult
- 1 جواب
-
- 1
-
قم بتغيير new ScriptBundle إلى new Bundle في RegisterBundles لديك ليصبح بالشكل التالي: bundles.Add(new Bundle("~/bundles/bootstrap").Include("~/Scripts/bootstrap.js"));
-
المشكلة إذاً في التعرّف على ClientID، ضع القيمة ClientIDMode = Static ضمن صفحة aspx ثم يمكنك الوصول بشكل مباشر للعنصر بهذا الشكل: $("#1stBoxTest")
- 6 اجابة
-
- 1
-
تأكد من ربط الملف والإشارة للمسار بالشكل الصحيح، كما يمكنك تجربة استخدام إحدى الطريقتين ضمن ترويسة الصفحة أو ضمن الكود: <head runat="server"> <script src="test.js" type="text/javascript"></script> </head> Page.ClientScript.RegisterClientScriptInclude("test", ResolveUrl("~/js/test.js"));
- 6 اجابة
-
- 1
-
هل قمت بربط ملف الجافاسكريبت بعد إنشائه؟ بقد أن قمت بإنشاء ملف الجافاسكريبت وليكن test.js ووضعت بداخله الشيفرة البرمجية التالية: $(document).ready(function () { $('<%=lstBoxTest.ClientID %>').SumoSelect({ okCancelInMulti: true }); }); يجب عليك ربطه مع الصفحة السابقة التي سيتم تنفيذ هذا الكود بداخلها من خلال الوسم التالي: <script src='<%=ResolveClientUrl("~/js/test.js") %>' type="text/javascript"></script> مع استبدال المسار: ~/js/test.js حسب اسم ومكان توضّع ملف الجافاسكريبت الذي قمت بإنشائه.
- 6 اجابة
-
- 1
-
تعرف الجريمة الإلكترونية على أنها جريمة يكون فيها الكمبيوتر هدفًا للجريمة أو يُستخدم كأداة لارتكاب جريمة أو للوصول إلى المعلومات الشخصية للمستخدم أو المعلومات التجارية السرية أو المعلومات الحكومية أو لتعطيل جهاز معيّن. يعد بيع المعلومات المذكورة أعلاه أو الحصول عليها عبر الإنترنت جريمة إلكترونية. ولها أيضاً عدة أنواع منها: هجمات منع الوصول للخدمة DDOS: تُستخدم هذه لجعل الخدمة عبر الإنترنت غير متاحة وتعطيل الشبكة عن طريق إغراق الموقع بحركة المرور من مجموعة متنوعة من المصادر. Botnets أو شبكات الروبوت: هي شبكات من أجهزة كمبيوتر تم اختراقها يتم التحكم فيها خارجيًا بواسطة متسللين عن بُعد. ثم يرسل المتسللون عن بُعد رسائل غير مرغوب فيها أو يهاجمون أجهزة كمبيوتر أخرى من خلال شبكات الروبوت هذه. يمكن أيضًا استخدام شبكات الروبوت للعمل كبرامج ضارة وأداء المهام الضارة. التصيد أو Phishing: يتضمن هذا النوع من الهجوم قراصنة يرسلون مرفقات بريد إلكتروني ضارة أو عناوين URL إلى المستخدمين للوصول إلى حساباتهم أو أجهزة الكمبيوتر الخاصة بهم. الهندسة الاجتماعية Social Engineering: تتضمن قيام المجرمين بالاتصال المباشر بالشخص المراد اختراقه عادةً عن طريق الهاتف أو البريد الإلكتروني لاكتساب ثقته وعادة ما يقومون بانتحال شخصية وكيل خدمة عملاء وهي بحد ذاتها جريمة أخرى. يمكنك الاطلاع على المزيد من التفاصيل من خلال البحث على الانترنت على مصطلح Cyber Crime أو الجريمة الالكترونية كما يمكنك إيجاد المزيد من التفاصيل هنا:
- 1 جواب
-
- 2
-
إن مصطلح Theming system هو مصطلح عام، ويجب عليك تحديد ما الذي ترغب بتحقيقه في مشروعك. ولكن بشكل عام يمكن إنشاء قوالب أو themes مختلفة ضمن مشروع لارافل ضمن ثلاثة مستويات: على مستوى التنسيقات CSS، أو على مستوى هرمية الملفات Folder Structure أو ضمن مستوى قاعدة البيانات نفسها. بحيث يتم استبدال القطع أو التنسيقات اللازمة لكل ثيم، ويتم اعتماد إحدى هذه المستويات أو جميعها تبعاً لغايتك أثناء بناء المشروع وماهي الخصائص التي ترغب بإجراء التعددية لها. فعلى سبيل المثال أبسط المستويات هي من خلال CSS بحيث يتم اعتماد وحذف التنسيقات اللازمة، أما في حال أردت التخصيص أكثر أو تغيير المكونات بشكل كامل سيتم ذلك على مستويات إضافية مثل المتحكّمات وبنية الملفات، بحيث يتم تقسيم بنية الملفات في مشروعك لكل قالب على حدى وإظهار الشيفرات البرمجية حسب القالب المختار: بفرض لديك: darkTemplate و lightTemplate من الممكن إنشاء مجلدين منفصلين لكل قالب كالتالي: resources/views/layouts/darkTemplate/master.blade.php resources/views/layouts/lightTemplate/master.blade.php أو إنشاء مجلّد واحد والتبديل بين عناصر المقاطع sections ضمن الصفحات. أما من طرف المستخدم، فيجب تخزين القالب المختار بطريقة معيّنة في قاعدة البيانات لديك أو ضمن المتصفح لحفظ هذه الإعدادات للمستخدم وتكرارها في الزيارات المنفصلة. لا يوجد قاعدة معيّنة لذلك فيمكنك تضمين هذه الخصائص بما يتناسب مع مشروعك، وفي حال كنت تستخدم blade أو يتم التعامل مع إطار عمل لواجهة المستخدم. ولكن المبدأ نفسه في أي لغة برمجة أو إطار عمل تعمل عليه.
- 1 جواب
-
- 1
-
يتيح مفهوم semi-join تنفيذ عدّة عمليات أثناء الاستعلام أي في وقت تحضير البيانات ويمكنه تنفيذ عدّة استراتيجيات على البيانات والجداول مثل سحب البيانات المتعددة والمطابقة بين البيانات والتحقق وغيرها.. وبالتالي يحسّن من أداء استخدام الاستعلامات الفرعية من خلال تصفية مجموعة من صفوف البيانات rows بناءً على دمجها مع مجموعة صفوف أخرى. أو بمعنى آخر، في حال كنا نقوم بعملية مقارنة inner-join بين جدولين، هنا يعيد الاستعلام جميع البيانات طالما هنالك تقابل بين الجدولين، ولكن في بعض الاستعلامات يلزمنا فقط معرفة في حال كان هنالك تقابل ولا نرغب بمقارنة جميع الأسطر والحصول على عددها، وهنا يمكننا استخدام مفهوم semi-join وهي تعمل بشكل مشابه للاستعلام التالي في MySQL: SELECT * FROM A WHERE A.key IN (SELECT B.key FROM B) وبالتالي يمكننا اختصار بعد الاستعلامات الطويلة مثل الاستعلام الذي يعتمد على left outer join: SELECT DISTINCT c.id FROM customers c LEFT JOIN salaries s ON s.customer_id = c.id WHERE s.customer_id IS NOT NULL بحيث يصبح بالشكل التالي: SELECT c.id FROM customers c WHERE EXISTS (SELECT 1 FROM salaries s WHERE s.customer_id = c.id)
- 2 اجابة
-
- 1
-
يمكنك إضافة بيانات الجدول الآخر من خلال الاستعلام التالي: INSERT INTO [table2] SELECT * FROM [table1] WHERE [condition]; بحيث يشير table2 الجدول الحالي الذي ترغب بإضافة البيانات إليه، أما الجدول table1 فهو يحوي البيانات التي ترغب بالحصول عليها وإضافتها هنا. كما يمكنك وضع شرط محدد في حال أردت إضافة بيانات محددة من ذلك الجدول أو الاستغناء عن الشرط وبالتالي يتم جلب كافة البيانات التي يحويها. مثال: INSERT INTO Customers SELECT * FROM Customers_bk;
- 2 اجابة
-
- 1
-
يقوم التابع setFetchMode بضبط وضع جلب البيانات، فيمكنك التحكم بطريقة جلب هذه البيانات لاستخدامها لاحقاً في شيفرتك البرمجية من خلال أنماط عديدة ومنها: PDO::FETCH_ASSOC والتي تقوم بجلب البيانات وفهرستها اعتماداً على اسماء الأعمدة في قاعدة البيانات PDO::FETCH_BOTH الافتراضية والتي تقوم بجلب البيانات وفهرستها ضمن مصفوفة من اسماء الأعمدة والقيم. PDO::FETCH_BOUND تعيد القيمة true والتي تقوم باسناد قيم الأعمدة إلى النتيجة النهائية كما يوجد أيضاً FETCH_CLASS , PDO::FETCH_INTO , PDO::FETCH_LAZY وغيرها الكثير. يمكنك الاطلاع عليها من التوثيق الرسمي ل PHP لمعاينة بعض الأمثلة وطرق الاستخدام.
- 4 اجابة
-
- 1