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

علي عبد محسن

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

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

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

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

    4

أجوبة بواسطة علي عبد محسن

  1. بتاريخ 17 دقائق مضت قال علي الكاسر:

    هل يمكن اعادة كتابة الكود والاتصال بقاعدة البيانات بطريقة pdo 

    لان هذه الطريقه قديمه ولم تعد تعمل 

    كما ذكرنا في الأجابة الأصلية يمكنك تغيير ما يلزم تغييره وفقاً لمتطلباتك. حاول تغيير الإتصال بإستخدام pdo كما يلي وعندما تواجه مشكلة يمكنك البحث عن الخطأ في google أولاً فأن تعذر عليك الحل سنساعدك بكل سرور.

    try {
      $conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);
      // set the PDO error mode to exception
      $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      echo "Connected successfully";
    } catch(PDOException $e) {
      echo "Connection failed: " . $e->getMessage();
    }
    	
  2. بتاريخ 5 دقائق مضت قال علي الكاسر:

    اخي لقد ظهر لي هذا الخطأ

     

    Fatal error: Uncaught Error: Call to undefined function Controllers\mysql_connect() in /storage/emulated/0/wanachat/Controllers/Database.php:21 Stack trace: #0 /storage/emulated/0/wanachat/Core/Route.php(24): Controllers\Database->index() #1 /storage/emulated/0/wanachat/wepUrl.php(20): Route::get('database', Array) #2 /storage/emulated/0/wanachat/index.php(9): require('/storage/emulat...') #3 {main} thrown in /storage/emulated/0/wanachat/Controllers/Database.php on line 21

     

    ويشير الخطاء الى هذا السطر 

     

    mysql_connect($mysql_host, $mysql_username, $mysql_password) or die('Error connecting to MySQL server: ' . mysql_error());

    يعتمد الأمر على ما تستخدمه من أدوات برمجية ونظام تشغيلي.يمكنك نسخ  الخطأ الى google لتفهم أكثر. إذا كنت تستعمل linux قم بتثبيت الحزمة المطلوبة كما يلي.

    	sudo apt install php-mysqli
    	
  3. بتاريخ 1 ساعة قال علي الكاسر:

    عفوا اخي لم افهم اي شي 

    انا استخدم لغة php. ومكتبة pdo في التعامل مع قواعد البيانات، 

    الذي احتاجه كود يقووم  بنسخ قاعدة البيانات الموجودة في ملف بعد تصديرها ، ينسخها في قاعدة بيانات جديده، اعلم انه يتم فعل هذا في phpmyadmin ولكن انا اريد فعل ذلك بكود خاص، من اجل الموقع الذي اعمل عليه 

    بما أن الحل المطلوب يجب أن يكون بلغة php يمكنك إستعمال الكود التالي لتحقيق المطلوب شرط أن تكون صيغة الملف الذي تم تصديره من قاعدة البيانات الأصلية هي sql.

    يمكنك تغيير ما يلزم تغييره وفقاً لمتطلباتك مع الحفاظ على نفس طريقة العمل وكما يلي

    <?php
    	 
    	// مسار الملف
    	$filename = 'name.sql';
    	// MySQL host
    	$mysql_host = 'localhost';  // عنوان المضيف
    	// MySQL username
    	$mysql_username = 'root'; // اسم المستخدم
    	// MySQL password
    	$mysql_password = ''; // كلمة المرور
    	// Database name
    	$mysql_database = 'database_name'; // قاعدة البيانات التي تريد إستيراد الملف لها
    	 
    	// Connect to MySQL server
    	mysql_connect($mysql_host, $mysql_username, $mysql_password) or die('Error connecting to MySQL server: ' . mysql_error());
    	// الإتصال بقاعدة البيانات واختيارها
    	mysql_select_db($mysql_database) or die('Error selecting MySQL database: ' . mysql_error());
    	 
    	// ننشئ متغير لخزن الجملة المراد تنفيذها
    	$templine = '';
    	// Read in entire file
    	$lines = file($filename); // sql نقرأ
    	// Loop through each line
    	foreach ($lines as $line) // نقوم بعمل حلقة تكرار للمرور على جميع السطور
    	{
    	 
    	if (substr($line, 0, 2) == '--' || $line == '') // نتجاهل التعليقات
    	    continue;
    	
     
    	$templine .= $line; // نسند السطر قيد المعالجة الى المتغير المنشأ مسبقاً
    	 
    	if (substr(trim($line), -1, 1) == ';') // نحدد فيما إذا كانت نهاية سطر من خلال الفاصلة المنقوطة
    	{
    	    // نقوم بتنفيذ السطر
    	    mysql_query($templine) or print('Error performing query \'<strong>' . $templine . '\': ' . mysql_error() . '<br /><br />');
    	    // بعد غنتهاء التنفيذ نعيد قيمة المتغير الى حالته الأصلية ليكون جاهزاً للسطر القادم
    	    $templine = '';
    	}
    	}
    	 echo "Tables imported successfully";
    ?>
    	
  4. يمكن عمل animation لعنصر ما عندما يعمل المستخدم scroll ويصبح العنصر في مجال الرؤية داخل الصفحة viewport من خلال css و javascript. 

    أولا: ننشئ مراقب observer ونقوم بربطه بالعنصر المستهدف  

    ثانياً: ننشئ التنسيق والحركة المطلوبين من خلال css 

    ثالثا: نتحكم في بدء الحركة وإيقافها من خلال صنف css يتضمن تعريف الحركة المطلوبة بواسطة animation, transition,  transform.. الخ

    ...
    /* CSS */
    .square {
        width: 200px;
        height: 200px;
        background: teal;
        border-radius: 8px;
        opacity: 0;
        /* العنصر مخفي قبل أن يصبح في مجال الرؤية */
    
    }
    
    
    .square-transition {
        /* تعريفات الحركة */
    
        opacity: 1;
        /* إظهار العنصر  */
        transform: translate(50%);
        transition: opacity 1.5s ease, transform 1.5s ease;
    
    }
    ...
    <body >
    
    <p>scroll </p>
    <p>scroll </p>
    <p>scroll </p>
    <p>scroll </p>
    <p>scroll </p>
    <p>scroll </p>
    <p>scroll </p>
    <p>scroll </p>
    <p>scroll </p>
    <p>scroll </p>
    <p>scroll </p>
    <p>scroll </p>
    <p>scroll </p>
    <p>scroll </p>
    <p>scroll </p>
    <p>scroll </p>
    <div class="square-wrapper">
        <!-- scroll العنصر الذي نريد تحريكه عند عمل  -->
        <div class="square square-transition"></div>
    </div>
    
    <p>scroll </p>
    <p>scroll </p>
    <p>scroll </p>
    <p>scroll </p>
    <p>scroll </p>
    <p>scroll </p>
    <p>scroll </p>
    <p>scroll </p>
    <script>
    
    const square = document.querySelector('.square');// الوصول على العنصر 
    square.classList.remove('square-transition');// في كانت الحركة نشطة نوقفها
    
    // نقوم بإنشاء المراقب 
    const observer = new IntersectionObserver(entries => { 
      entries.forEach(entry => { //scroll حلقة تكرار للمرور على العناصر عندما نعمل
        if (entry.isIntersecting) { // أذا الصور في ظاهر للمستخدم
          square.classList.add('square-transition'); // نفعل الحرمة المرتبة بهذا الصنف من خلال إضافته للعنصر
          return;
        }
        square.classList.remove('square-transition'); // إيقاف الحركة
      });
    });
    
    observer.observe(document.querySelector('.square-wrapper')); // تشغيل المراقب وإسناد نطاق عمله على العنصر الحاوي للعنصر المستهدف بالحركة
    </script>
    </body>
    
  5. بداية من الضروري فهم أن SQLiteAssetHelper  غير قادر على فتح قاعدة بيانات مشفرة من النوع sqlite ولكن فقط يستطيع التعامل مع قاعدة البيانات المفتوحة من خلال الدالتين getReadableDatabase و getWritableDatabase. ما تستطيع فعله بهذا الخصوص هو إستعمال الأداة  SQLCipher for Android مع SQLiteAssetHelper لحل المشكلة ولكن بطريقة نوعاً ما يشوبها التعقيد.

    أولاً - نستعمل SQLCipher لإنشاء قاعدة بيانات فارغة مشفرة.

    ثانياً - نستعمل SQLiteAssetHelper لقراءة قاعدة البيانات المفتوحة لديك ومن ثم نسخ بياناتها الى المشفرة سابقة ألإنشاء.

    ثالثاً - نحذف قاعدة البيانات المفتوحة بعد إغلاقها.

    تستطيع الإطلاع أكثر على SQLCipher هنا

    • أعجبني 1
  6. بتاريخ 3 ساعات قال Aya Dawod:

    نعم يبدو انك مع سرعة القراءة او نحو ذلك ولتشابه الوسمين اعتقدت ان u هي ul  ولكنني اقصد u والتي تعني underline text

    عذراً على الخطأ نعم كنت مستعجلاً. لاحظي أن الصواب هو أن ins تستعمل للدلالة على أن النص تم وضعه لاحقاً كتحديث على النص الأصلي وغالباً ما يتم وضعه برفقة الوسم del الذي يدل على أن جزء من النص تم إستبداله أو التعديل عليه  أو إلغاءه من خلال خط يظهر على النص.

    أما الوسم u فهو لا معنى له سوى وضع خط تحت النص لغرض تمييزه.

    • أعجبني 1
  7. لا يوجد تشابه بين عمل أي من الوسمين في سؤالك. نستخدم الوسم ul للتعبير عن قائمة عناصر بدون ترقيم unordered list. بينما نستعمل الوسم ins لحشر نص تحته خط في نص ما. لاحظ المثال التالي

    ...
    <p>My favorite color is <ins>red</ins>!</p>
    <!--  لاحظ الوسم هنا يقوم بأضافة النص تحته خط -->
    ...
    <ul> <!-- li  تعريف قائمة من العناصر بدون ترقيم ولا يمكن وضع شيء داخل هذا الوسم العنصر ما عدا -->
        <li>one</li>
        <li>two</li>
        <li>Three</li>
    </ul>
    ...
    	
    • أعجبني 1
  8. يعتمد الجواب على سؤالك كثيراً على الأدوار المناطة بك كمطور backend. إذا كان دورك يقتصر على تكويد تطبيق الواجهة الخلفية وتسليمه, فإنك بهذه الحالة لا علاقة لك بالنظام التشغيلي Operating System الذي سيعمل عليه التطبيق. لكن إذا كان من ضمن أدوارك عمل deployment و ربط النطاق domain  والربط مع قاعدة البيانات database محلياً داخل الخادم server أو خارجه , فإنك ستكون بحاجة لتعلم هذه المهارات المرتبطة بشكل مباشر أو غير مباشر مع النظام التشغيلي سواء كان linux أم windows وسواء كنت تتعامل مع جهاز  حقيقي physical أو  إفتراضي virtual machine.

    خلاصة القول وبكلام أدق أنت بحاجة الى تعلم  المهارات المرتبطة بعملك كمطور backend  وليس كل شيء في أنظمة التشغيل.

    • أعجبني 1
  9. يمكنك إستعمال الدوال isAfter, isBefore,  isAtSameMomentAs المرتبطة بالنوع DateTime لمقارنة الوقت و ترجع كل من هذا الدوال true أو false وكما يلي

    	
    snapshot.data[index]['LastDate'].isAfter(DateFormat('dd-MM-yyy').format(DateTime.now()))
    
    snapshot.data[index]['LastDate'].isBefore(DateFormat('dd-MM-yyy').format(DateTime.now()))
    
    snapshot.data[index]['LastDate'].isAtSameMomentAs(DateFormat('dd-MM-yyy').format(DateTime.now()))
    
    //compareTo كما يمكنك إستخدام
    
    // لكن هذه الدالة ترجع لك 1 أو 0 أو -1 بنفس الدلالة السابقة
    
    snapshot.data[index]['LastDate'].compareTo(DateFormat('dd-MM-yyy').format(DateTime.now()))
    
    // DateTime ‌لاحظ أننا نقارن النوع
    
    //String إذا الوقت لديك من النوع
    //كما يلي DateTime يمكنك تحويله الى
    
    dt= DateTime.parse('2020-01-02T07:12:50+07:00') // مثال
    
    // ثم تجري المقارنة كما سبق

    الحل المطروح هنا يحل الإشكالية الموجودة في المثال في سؤالك أي المقارنة بين قيم الوقت كما يفهم من الكود الذي تطرحه. إذا كنت تريد مقارنة قيم أخرى فلا بد من تحديد نوع هذه القيم لتحديد طريق المقارنة ذات العلاقة.

    • أعجبني 1
  10. بتاريخ 2 ساعات قال محمد الحربي24:

    هذه هي

    backend.rar

    لاتوجد مشكلة في schema كذلك unique:true تعمل بشكل طبيعي ولا تسمح بتكرار الأدخال كما تبين لنا عند الفحص. 

    هل قمت بتطبيق unique:true على ال schema بعد إنشاءك قاعدة البيانات؟  يبدو أن المشكلة بسببب عدم سريان مفعول الخاصية على قاعدة البيانات مسبقة الإنشاء لديك. جرب حذف قاعدة البيانات ثم تعيد التجربة أو إذا كانت البيانات مهمة ولا تريد حذفها أنشئ قاعدة بيانات جديدة ثم جرب إنشاء مستخدم بنفس الإيميل أكثر من مرة ستجد الخطأ 

    	E11000 duplicate key error
    	
  11. بتاريخ 5 دقائق مضت قال محمد الحربي24:

    ملف اليوزر هو ملف السكيما

    هل أقوم بإرفاق ملف الباكاج جيسون أم لا؟

    db.js

    server.js

    user.js

    يمكنك جمع ملفات المشروع في الباكيند بملف مضغوط zip و إدراجها. بالتأكيد package.json حتى أشغل المشروع على جهازي وأشخص لك المشكلة

  12. الخاصية overflow في css تتحكم فيما إذا  كان المحتوى في عنصر من نوع block-level سيتم عمل clipping من عدمه وفيما إذا كان سيتم إضافة scrollbar من عدمه وبحسب القيم المسندة الى overflow. 

    في الصورة لديك العنصر الرئيسي body يحتوي على overflow-x:hidden أي أن المحتوى إذا تجاوز عرض الصفحة سيتم إخفاء جزء منه ولن يظهر scrollbar.

    يمكنك الإطلاع هنا https://wiki.hsoub.com/CSS/overflow-x#hidden

  13. بتاريخ 4 دقائق مضت قال محمود سعداوي:

    شكرا.

    كل شيء تمام مع firefox - edge

    المشكل في chrome.

    هل يوجد حل.

    غالباً المشكلة في cache المتصفح. ربما كنت تعمل على نسخة قديمة من الكود ومازالت عالقة. لحل المشكلة قم بعمل clear

    	settings > privacy and security > clear browser data
    >
    • أعجبني 1
  14. بتاريخ 1 ساعة قال علي محسن:

    لا يحدث تغيير تلقائي لكن بما أنك لم تجري تعديلات على الكود فلاحظ أنك تستعمل bootstrap لتصميم ال layout فهل قمت بتحديث هذه المكتبة أو غيرت نسختها؟

     

     

    بتاريخ 18 دقائق مضت قال Ahmed Alfadaly:

     

    لا لم احدثها انا استخدم الاكواد في الاصدار الذي وضعته او ضمنته ف مستند html 

     

    بتاريخ 5 دقائق مضت قال علي محسن:

    يمكنك إضافة padding الى الجزء المسيطر على حجم الصور لتظهر لك بشكل اصغر مع حاشية مثلا أو تضيف لها margin.

    
    .row-padding {
      padding: 10%;
    }
    ...
    <!-- ثم ضع الصنف  أعلاه مع الصنف  الذي يحوي أعمدة الصور  -->
    <div class="row row-padding">...</div>
    ...

     

    • أعجبني 1
  15. بتاريخ 20 دقائق مضت قال Ahmed Alfadaly:

     

    استاذي اذا لاحظت حجم الصور كانت اصغر وتوجد حاشيه اما الان فانه لا يوجد اي حواشي وكبرت حجمها وانا لم افعل ذلك 

    اعلم ان شكله جيد ايضا ولكن لقد عدلت فيه حيث كان يوجد sections فوق بعضها اي متداخله 

    هل هذا طبيعي ان يتغير بشكل تلقائي هكذا! 

    لا يحدث تغيير تلقائي لكن بما أنك لم تجري تعديلات على الكود فلاحظ أنك تستعمل bootstrap لتصميم ال layout فهل قمت بتحديث هذه المكتبة أو غيرت نسختها؟

     

    • أعجبني 1
  16. الحل الأمثل في مثل هذه الحالة هو إستعمال recursive method طالما أن نوع السلسلة متعدد المستويات من العمق  multiple levels depth. إليك المثال التالي

    my_list = [[1, 2], [3, 4, [5, 6, [7]], 8], 9, [10, 11, [12, [13, [14], 15], 16], 17]]
    def flatten(L):
        if not isinstance(L,(list)): # إذا لم يكن المدخل الحالي قيد المعالجة من النوع سلسلة
            yield L  
            # generator object نعيد
            return
        for F in L: # نمر في حلقة تكرار على المدخل
            yield from flatten(F)  # نعيد الناتج ونستمر بالإرجاع لحين المرور على جميع العناصر
    
    flat= list(flatten(my_list)) #  نستدعي الدالة ونحول الى سلسلة

    لا يوجد طريقة مسبقة التعريف تقوم بهذه المهمة ولكن هذه الطريقة الأكثر كفاءة.

  17. الطريقة الأسرع  لتنقية مصفوفة جافاسكربت من العناصر المكررة هي إستخدام Set مع spread function ( أو ...) كما في المثال

    	let myString = "EElllzzzzzzzeroo";
    	let array= myString.split("")  // نحول النص الى مصفوفة
    	let uniqueArrayElements = [...new Set(array)];  // نستخرج العناصر الفريدة  
    	

    لاحظ أننا لم نعدل على المصفوفة الأصلية الناتجة من تقسيم النص. أيضاً بالنسبة للخطأ الذي يظهر لك سببه أنك تحاول إستدعاء دالة filter ( التابعة للنوع Array ) من خلال  متغير من النوع String.

  18. إذا كان المشروع الأصلي حديث الإنشاء ولم يمضي عليه الكثير فلا مشكلة في نسخك للأشياء المذكورة في سؤالك, لكن في حالة كان قد مضى عليه فترة طويلة (لنقل أكثر من شهر ) فقد يعرضك إستعمال أدوات ومكتبات بإصدارات قديمة إلى مشكلات أمنية وتقنية أثناء وبعد التطوير. 

    في كثير من الأحيان يتم أكتشاف ثغرات أمنية security issues في بعض الأدوات والمكتبات مما يدفع منشئيها إلى إجراء معالجات سريعة بغية عدم تسببها بأضرار للمستخدم النهائي. أيضا يقوم القائمين على تطوير هذه البرمجيات بشكل دوري بإطلاق إصدارات تتضمن ميزات جديدة new features و إصلاح الأخطاء bug fixes. 

×
×
  • أضف...