صفحة 1 من 2 12 الأخيرةالأخيرة
النتائج 1 إلى 15 من 25

الموضوع: [استفسار] دالة تحسب تاريخ الانتهاء نتائجها غير صحيحة

  1. #1
    عضو نشيط
    تاريخ التسجيل
    May 2006
    المشاركات
    168

    [استفسار] دالة تحسب تاريخ الانتهاء نتائجها غير صحيحة



    السلام عليكم ورحمة الله وبركاته

    اسأل الله تعالى أن يرزق من يرد علي رزقا واسعا حلالا طيبا مباركا فيه :shy:

    أردت إنشاء دالة تقوم بقراءة تاريخ الإنتاج مثلا من قاعدة البيانات
    وتقرأ أيضا مدة الصلاحية بالأشهر مثلا : 5 أو 6 أو 15 شهر
    فتقوم هذه الدالة بحساب التاريخ الذي يكون المنتج قد انتهت صلاحيته

    العملية باختصار : جمع للأشهر . قمت بتنفيذها بالطريقة التالية
    كود PHP:
    <?php
    // date now
    $e=date('Y / m / d');
    echo
    "e= $e";
     
    // using mktime  and getdate  to convert the date to seconds and then return it into string date
      
    $second_numbefore=mktime($e)  ;
      
    $second_num=getdate($second_numbefore);
      
    $z=$second_num[year]."/".$second_num[mon]."/".$second_num[mday];
    echo
    "<font size=4 color=darkblue><b><br>the date in new argument z= $z</font><br><br>";

    // using mktime to insert a date .
    $date1=date('Y / m / d',mktime(0,0,0,02,22,2008));
    echo
    "<br><b><font size=5 color=#f00767> date1=$date1";


    echo
    "<b><br>NOW : add 3 months to date1<br>";

    $date1_seconds=mktime($date1);
    $date1_getdate=getdate($date1_seconds);
    $date1_year=$date1_getdate[year];
    $date1_month=$date1_getdate[mon];
    $date1_day=$date1_getdate[mday];

    $date1_month_plus=$date1_month+3;
    if(
    $date1_month_plus>12)
            {
            
    $date1_month_plus=$date1_month_plus-12;
            
    $date1_year+=1;
                }

    $date1_add=$date1_year."/".$date1_month_plus."/".$date1_day;
    echo
    "<font size=5 color=#f00767><b>date1_add=$date1_add<br><br>";



    $xd=22;$xm=3;$xy=2008;

     
    $date2=date('Y / m / d',mktime(0,0,0,$xm,$xd,$xy));
        echo
    "<br><b><font size=5 color=#99ee33> date2=$date2";
          echo
    "<b><br>NOW<br>add 12 month to date2<br><br>";
    ?>


    لكن هناك خطأ في الجمع والنتيجة غير صحيحة
    هل من مرشد ؟؟

    الحمد لله والصلاة والسلام على رسول الله
    اللهم علمنا ماينفعنا وانفعنا بما علمتنا رب وزدنا علما
    الحمد لله والصلاة والسلام على رسول الله





    __________________
    100 صقر !!
    يومياتي في تعلم php ..
    أرحب بالمبتدئين لنتعلم معا والمحترفين ليقدموا النصح والتوجيه .
    .
    .
    سبحان الله وبحمده عدد خلقه .. ورضا نفسه .. وزنة عرشه .. ومداد كلماته .


  2. #2
    عضو شرف
    تاريخ التسجيل
    May 2007
    المشاركات
    1,647


    بصراحة لا أملك الوقت لقراءة الكود ، فالوقت متأخر وحان وقت النوم :# ..

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

    لنفرض أن date$ هو تاريخ الإنتاج .. سيكون تنسيقه dd/mm/yyyy على سبيل المثال !
    و months$ هو متغير يحوي عدد أشهر الصلاحية ..

    كود PHP:
    <?php
     $date 
    '23/05/2008';
     
    $months 5;
     
    $date_parts explode('/'$date);
     list(
    $d$m$y) = $date_parts;
     echo 
    $expiry_date date('d/m/Y'mktime(000$m $months$d$y));
    ?>
    أتمنى أن أكون قد أفدتك في كيفية التنفيذ ..

    تحياتي، أشرف السمهوري





    __________________
    # اتبعني على Twitter
    # عِرفان ساهم ببناء المحتوى العربي العلمي على الإنترنت!

  3. #3
    عضو نشيط
    تاريخ التسجيل
    May 2006
    المشاركات
    168


    أشكرك استاذ أشرف
    فكرتك صحيحة برمجيا حتى بدون أن أطبقها
    لكني لا أريد استخدام دالة explode لأن المستخدم قد يدخل التاريخ بطريقة مختلفة "- أو / "

    وماقمت بعمله هو : تحويل التاريخ إلى ثواني بواسطة دالة mktime
    ثم تجزئتها مرة آخرى بواسطة دالة getdate بحيث يتم حفظ السنة في متغير والشهر في متغير واليوم في متغير آخر . ثم تتم عملية الجمع مع الأشهر فقط مع شرط بإنقاص 12 من الناتج إن كان أكبر من 12 وإضافة ذلك إلى السنة .
    اعتقد ان فكرتي برمجيا صحيحة وحتى طريقة كتابتي للكود لا أرى فيها أي خطأ

    كود PHP:
    $date1=date('Y / m / d',mktime(0,0,0,02,22,2008));
    echo
    "<br><b><font size=5 color=#f00767> date1=$date1";


    echo
    "<b><br>NOW : add 3 months to date1<br>";

    $date1_seconds=mktime($date1);
    $date1_getdate=getdate($date1_seconds);
    $date1_year=$date1_getdate[year];
    $date1_month=$date1_getdate[mon];
    $date1_day=$date1_getdate[mday];

    $date1_month_plus=$date1_month+3;
    if(
    $date1_month_plus>12)
            {
            
    $date1_month_plus=$date1_month_plus-12;
            
    $date1_year+=1;
                }

    $date1_add=$date1_year."/".$date1_month_plus."/".$date1_day;
    echo
    "<font size=5 color=#f00767><b>date1_add=$date1_add<br><br>"
    لكن النتيجة منطقيا غير صحيحة إطلاقا :con2:


    هل من مرشد !!





    __________________
    100 صقر !!
    يومياتي في تعلم php ..
    أرحب بالمبتدئين لنتعلم معا والمحترفين ليقدموا النصح والتوجيه .
    .
    .
    سبحان الله وبحمده عدد خلقه .. ورضا نفسه .. وزنة عرشه .. ومداد كلماته .

  4. #4
    عضو شرف
    تاريخ التسجيل
    May 2007
    المشاركات
    1,647


    عفواً ، طريقتك معقدة وأرى فيها حتى أخطاء منطقية ( خوارزمية ) ..

    يجب علينا دائماً التفكير بالحلول الأبسط والأسهل علينا كمبرمجين ، لا تنسي أنك ستعودين لقراءة الكود لاحقاً لتطويره أو مراجعته ، كلما كان أبسط فالمراجعة أسهل .

    غير ذلك ، أرى أن لديك خلل بسيط في فهم عمل دالة mktime ، فهي لم تقبل في حياتها أن نمرر لها تاريخاً وتحوّله لنا إلى ثوانٍ ، عمل mktime هو تمرير الشهر واليوم والسنة والساعة والدقيقة والثانية ، كي تحوّلها لنا إلى ثوانٍ ( نظام Unix Timestamp ) .. للمزيد: PHP: mktime - Manual

    لكني لا أريد استخدام دالة explode لأن المستخدم قد يدخل التاريخ بطريقة مختلفة "- أو / "
    إذا كانت هذه هي المشكلة الوحيدة لديك ، فهناك حلول أسهل:
    كود PHP:
    <?php
     $date 
    '2008 - 05 - 23';
     
    $months 5;
     list(
    $y$m$d) = split('[/.-]'$date);
     echo 
    $expiry_date date('Y/m/d'mktime(000$m $months$d$y));
    ?>
    تحياتي، أشرف السمهوري





    التعديل الأخير تم بواسطة أشرف السمهوري ; 23-05-2008 الساعة 11:18 AM
    __________________
    # اتبعني على Twitter
    # عِرفان ساهم ببناء المحتوى العربي العلمي على الإنترنت!

  5. #5
    عضو فعال
    تاريخ التسجيل
    Jul 2003
    المشاركات
    1,576


    هل التاريخ مخزن في الداتا بيز ؟ على اي صيغة ؟

    لو قمت بتخزين التاريخ في الداتا بيز على شكل timestamp .. يمكنك الحصول على مدة الصلاحية في سطر واحد ..





    __________________
    SWF Thumbnail - tweet me

  6. #6
    عضو شرف
    تاريخ التسجيل
    May 2007
    المشاركات
    1,647


    هل التاريخ مخزن في الداتا بيز ؟ على اي صيغة ؟

    لو قمت بتخزين التاريخ في الداتا بيز على شكل timestamp .. يمكنك الحصول على مدة الصلاحية في سطر واحد ..
    يبدو أن التاريخ لديها مخزّن بصيغة Y / m / d كما هو واضح في الكود في الموضوع ..

    إذا كان Timestamp كما ذكرت ، هناك حل ممكن هو :
    كود PHP:
    $date time();
    $months 5;
    echo 
    date('Y/m/d'mktime(000date('m'$date) + $monthsdate('d'$date), date('Y'$date)); 
    هي نفس الفكرة البرمجية ، وطبعاً توجد حلول وأفكار أخرى ، لكني أجد أن هذه مناسبة لهذا الغرض ..

    التفكير بتحويل months إلى ثوانٍ صعبٌ بعض الشيء ، لأن الأشهر ليست متساوية في عدد الأيام ..

    فلا يمكننا ضرب 5 في 31 يوم أو 30 يوم ثم ضربها بـ 24 ساعة ثم 60 دقيقة ثم 60 ثانية .. لأن الشهر قد يكون 30 وقد يكون 31 وقد يكون 29 وقد يكون 28 ..

    الأفكار ليست بهذه المحدودية ، لكني أطرح بعض وجهات النظر لأترك لصاحب الموضوع دائماً الحرية بالاختيار والتفكير ، وليس الاتباع بنسخ ولصق الكود فقط ..

    تحياتي، أشرف السمهوري





    __________________
    # اتبعني على Twitter
    # عِرفان ساهم ببناء المحتوى العربي العلمي على الإنترنت!

  7. #7
    عضو نشيط
    تاريخ التسجيل
    May 2006
    المشاركات
    168


    Egyptechno شكرا لك لكني احترت عند اختيار نوع البيانات عند تخزينها واخترت أن تكون من النوع date لكن إن كنت ترى الأفضل أن تكون من النوع الذي ذكرته سأغيرها .. كل شيء بالنسبة لي محير :shy: لذلك انشأت قاعدة بيانات آخرى مطابقة للأولى وتختلف عنها في نوع التاريخ بأنه TIMESTEMP

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

    كود PHP:
    $sql=mysql_query("SELECT * FROM Table1");
    while(
    $row=mysql_fetch_array($sql))
                     {
                    @
    extract($row);
                    
    $months 5;
                     list(
    $y,$m,$d) = split('[/.-]','$row[test_date_mod3]');
                     
    $expiry_date date('Y/m/d'mktime(000$m $months$d$y));
                     echo 
    $expiry_date;
                     
    $insert_expiry_date;= "INSERT INTO Table1(date2) VALUES('$expiry_date')";
                    
    $insert_$expiry_date_Table1 mysql_querey($insert_duedate);
                    echo    
    "<table width=60% border=1>
                                  <tr><td align=center>
    $row[id1]</td>
                                     <td align=center>
    $row[date1]</td>
                                    <td align=center>
    $row[date2]</td>
                                    </tr>
                            </table><br>"
    ;


                    } 
    ;كان هناك خطأ ولكن عدلته
    أضفته هنا للفائدة .

    وشكرا جزيلا لك أشرف وبارك الله فيك وفي علمك ووقتك .





    التعديل الأخير تم بواسطة SaharRose ; 23-05-2008 الساعة 08:46 PM سبب آخر: إضافة
    __________________
    100 صقر !!
    يومياتي في تعلم php ..
    أرحب بالمبتدئين لنتعلم معا والمحترفين ليقدموا النصح والتوجيه .
    .
    .
    سبحان الله وبحمده عدد خلقه .. ورضا نفسه .. وزنة عرشه .. ومداد كلماته .

  8. #8
    عضو شرف
    تاريخ التسجيل
    May 2007
    المشاركات
    1,647


    كود PHP:
                     list($y,$m,$d) = split('[/.-]','$row[test_date_mod3]');
                     
    $expiry_date date('Y/m/d'mktime(000$m $months$d$y))"; 
    اجعليه:
    كود PHP:
                     list($y,$m,$d) = split('[/.-]',$row[test_date_mod3]);
                     
    $expiry_date date('Y/m/d'mktime(000$m $months$d$y)); 
    ولا داعٍ لسطر:
    كود PHP:
    @extract($row); 
    وإن كان من بد منه ، حاولي ألا تستخدمي معامل @ الذي يبطّئ تنفيذ الكود ..

    تحياتي، أشرف السمهوري





    __________________
    # اتبعني على Twitter
    # عِرفان ساهم ببناء المحتوى العربي العلمي على الإنترنت!

  9. #9
    عضو نشيط
    تاريخ التسجيل
    May 2006
    المشاركات
    168


    نعم قمت بتعديله لكن نسيت إضافته هنا .

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

    أشكرك على حسن تواصلك





    __________________
    100 صقر !!
    يومياتي في تعلم php ..
    أرحب بالمبتدئين لنتعلم معا والمحترفين ليقدموا النصح والتوجيه .
    .
    .
    سبحان الله وبحمده عدد خلقه .. ورضا نفسه .. وزنة عرشه .. ومداد كلماته .

  10. #10
    عضو شرف
    تاريخ التسجيل
    May 2007
    المشاركات
    1,647


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

    أولاً:
    كود PHP:
    $row['test_date_mod3'
    هذه هي الطريقة الصحيحة لكتابة عنصر المصفوفة عندما يكون المفتاح index عبارة عن نص string ..

    الآن ، يمكنك مراجعة نتيجة كل سطر بطباعة المخرجات في كل مرحلة ، جملة echo لن تفارق عملية الـ Debug أبداً ..

    ننتظر النتيجة ،،

    تحياتي، أشرف السمهوري





    __________________
    # اتبعني على Twitter
    # عِرفان ساهم ببناء المحتوى العربي العلمي على الإنترنت!

  11. #11
    عضو نشيط
    تاريخ التسجيل
    May 2006
    المشاركات
    168


    هل ينطبق ماقلته بطريقة كتابة اسم عنصر المصفوفة على أن يكون هذا العنصر : هو نص string ويعبر عن اسم لحقل في أحد الجداول ؟؟

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





    __________________
    100 صقر !!
    يومياتي في تعلم php ..
    أرحب بالمبتدئين لنتعلم معا والمحترفين ليقدموا النصح والتوجيه .
    .
    .
    سبحان الله وبحمده عدد خلقه .. ورضا نفسه .. وزنة عرشه .. ومداد كلماته .

  12. #12
    عضو شرف
    تاريخ التسجيل
    May 2007
    المشاركات
    1,647


    واياك ، الأساسيات بدأت تترسخ لدي بعد مرور أكثر من 5 سنوات على بدء برمجتي بهذه اللغة ..

    لغة PHP بحر واسع لا يمكن الحصول على أساسياته وترسيخها في فترة بسيطة ، ربما كانت الظروف في تلك الأيام لا تسمح، الآن المصادر متوفرة ، والمصدر الأهم والأكثر إفادة هو مانيوال الـ PHP الرسمي .

    بخصوص المصفوفات ، لا علاقة للاسم بالمحتوى ، المحتوى مهما كان ننظر فقط إلى اسم العنصر،

    إذا كان الاسم ( المفتاح ) عبارة عن نص يحب إحاطته بعلامات اقتباس Quotation Marks ، مثلاً:
    كود PHP:
    $row['name'
    أما إذا كان المفتاح عبارة عن رقم ، يمكن الحصول على القيمة بالرقم دون Quotations:
    كود PHP:
    $row[1
    في استعلامات SQL من قواعد MySQL يمكنك الحصول على مصفوفة رقمية أو نصية أو كلاهما ..

    mysql_fetch_row رقمية
    mysql_fetch_assoc نصية
    mysql_fetch_array كلاهما ( نصية + رقمية )

    العناصر الرقمية يبدأ ترقيمها من 0 ..

    ملاحظة: يمكنك داخل الحلقة طباعة المصفوفة row$ للتأكد من محتواها ومن الأسماء حتى تتأكدي من طريقة استدعائها ..
    كود PHP:
    print_r($row); 
    تحياتي، أشرف السمهوري





    __________________
    # اتبعني على Twitter
    # عِرفان ساهم ببناء المحتوى العربي العلمي على الإنترنت!

  13. #13
    عضو نشيط
    تاريخ التسجيل
    May 2006
    المشاركات
    168


    شكرا لك
    سعيدة جدا بردودك
    واسأل الله تعالى أن يزيدك من فضله .

    قمت بمراجعة عملي ووجدت أن الخطأ كان نتيجة إجراء عملية جمع الشهر بداخل الدالة mktime
    وقمت بهذا التعديل :

    كود PHP:
    $new_mon=$m $mon_date1;
                echo 
    "<br>$new_mon";

                while( 
    $new_mon>12) {$new_mon-=12;    $y++;}
                
    $date2 date('Y/m/d'mktime(000,$new_mon$d$y)); 
    لكن سؤالي الآن : هو عندما حاولت طباعة المتغيرات $y $m $d لم أنجح في ؟؟ لماذا :con2:





    __________________
    100 صقر !!
    يومياتي في تعلم php ..
    أرحب بالمبتدئين لنتعلم معا والمحترفين ليقدموا النصح والتوجيه .
    .
    .
    سبحان الله وبحمده عدد خلقه .. ورضا نفسه .. وزنة عرشه .. ومداد كلماته .

  14. #14
    عضو شرف
    تاريخ التسجيل
    May 2007
    المشاركات
    1,647


    عجيب ، وهل يمكنك طباعة :
    كود PHP:
    echo $row['test_date_mod3']; 
    وما النتيجة ؟

    إذا كانت نفسها المخزنة في القاعدة ..
    ما نتيجة الكود التالي؟
    كود PHP:
    print_r(split('[/.-]',$row['test_date_mod3'])); 
    وأنا سعيد كذلك بإصرارك على تعلم اللغة ..

    تحياتي، أشرف السمهوري





    __________________
    # اتبعني على Twitter
    # عِرفان ساهم ببناء المحتوى العربي العلمي على الإنترنت!

  15. #15
    عضو نشيط
    تاريخ التسجيل
    May 2006
    المشاركات
    168


    سؤال آخر " أكثر أهمية بالنسبة لي "

    نموذج إدخال البيانات الآن يحتوي ثلاثة حقول :
    id
    date1
    num of month

    وكل منتج له جدول خاص به بنفس الحقول الثلاثة السابقة .
    لدي خمس منتجات فقط .

    سؤالي الأول : طريقتي هي حفظ بيانات كل منتج في الجدول الخاص به عبر نموذج خاص بكل جدول .
    لكني أريد إضافة حقل إلى النموذج ليختار أحد هذه المنتجات الخمسة وبناء على اختياره هذا يتم التخزين في الجدول الخاص بذلك .
    فكيف يتم ذلك :shy:





    __________________
    100 صقر !!
    يومياتي في تعلم php ..
    أرحب بالمبتدئين لنتعلم معا والمحترفين ليقدموا النصح والتوجيه .
    .
    .
    سبحان الله وبحمده عدد خلقه .. ورضا نفسه .. وزنة عرشه .. ومداد كلماته .





ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •  

أضف موقعك هنا| اخبار السيارات | حراج | شقق للايجار في الكويت | بيوت للبيع في الكويت | دليل الكويت العقاري | مقروء | شركة كشف تسربات المياه | شركة عزل اسطح بالرياض | عزل فوم بالرياض| عزل اسطح بالرياض | كشف تسربات المياة بالرياض | شركة عزل اسطح بالرياض