سؤال

قليلا من مشكلة غريبة هنا ...

لدي استعلام تحديث لا يعمل، ولا أستطيع أن أعود حياة لي لماذا!

يحتوي طاولتي على اثنين من ثلاثة حقول - 'ID' (ID، زيادة تلقائية)، "التاريخ" (التاريخ)، و "Amountraised" (عشري). جزء من التطبيق الذي أقوم بتطوير يحسب إجمالي جمع التبرعات كل أسبوع أدلى به مكتبة خيرية. يستخدم حقل "التاريخ" نوع عمود تاريخ في أماكن أخرى من الموقع، فأنا أستخدم التواريخ في العمليات الحسابية.

في أماكن أخرى داخل النظام، لدي استعلامات تحديث أخرى تعمل على ما يرام، لكنني أظن أن المشكلة مع هذا واحد هو أنه بالإضافة إلى تحديث السجل الذي أحاول أيضا التعامل مع تنسيق التاريخ أيضا (حتى أتمكن من ذلك أدخل التواريخ في تنسيق DD-MM-YYYY البريطاني، ثم استخدم PHP للتحويل إلى تنسيق MySQL الصديق YYYY-MM-DD.

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

هذا هو نموذج التحديث الخاص بي مع وظيفة تحويل التاريخ:

          function dateconvert($date,$func) {
          if ($func == 1){ //insert conversion
          list($day, $month, $year) = split('[/.-]', $date); 
          $date = "$year-$month-$day"; 
          return $date;
          }
          if ($func == 2){ //output conversion
          list($year, $month, $day) = split('[-.]', $date); 
          $date = "$day/$month/$year"; 
          return $date;
            }
          } // end function      
          require_once('/home/thebooks/admins/connect.php');
          $id = $_GET['id'];
          $dateinput = $_GET['dateinput'];
          $query = "SELECT * FROM fundraisingtotal WHERE id='$id'";
          $result = mysql_query($query);
          $row = mysql_fetch_array($result);
          extract($row);
          $date = $row['date']; //your mysql date
          $realdate = dateconvert($date,2); // convert date to British date
          $amountraised = stripslashes($amountraised); //amount raised
          mysql_close();?>
            <div id="title">Update Fundraising Total</div>
            <form id="updatetotals" action="updated.php" method="post">
                <div class="row"><label for="dateinput" class="col1">Date&nbsp;&nbsp;</label><span class="col2"><input id="dateinput" name="dateinput" type="text" size="25" value="<?php echo $realdate ?>" maxlength="10" /></span></div>
                <div class="row"><label for="amountraised" class="col1">Fundraising Total&nbsp;&nbsp;</label><span class="col2"><input id="amountraised" name="amountraised" type="text" size="25" value="<?php echo $amountraised ?>" maxlength="7" /></span></div>
                <div class="submit"><input type="submit" name="submitted" value="Update" /><input type="reset" name="reset" value="Clear the form" /></div>
                <input type="hidden" name="id" value="<?php echo $id ?>" />
            </form>

... وهذا هو صفحة المعالجة / الاستعلام:

    require_once('/home/thebooks/admins/connect.php');
    $dateinput = $_POST['dateinput'];

    // Date conversion from: http://www.phpbuilder.com/annotate/message.php3?id=1031006
    // using type 1
    $convdate = $_POST['dateinput']; // get the data from the form
    $convdate = dateconvert($convdate, 1); // Would convert to e.g. 2005-12-19 which is the format stored by mysql

    function dateconvert($convdate,$func) {
    if ($func == 1){ //insert conversion
    list($day, $month, $year) = split('[/.-]', $convdate); 
    $date = "$year-$month-$day"; 
    return $date;
    }
    if ($func == 2){ //output conversion
    list($year, $month, $day) = split('[-.]', $convdate); 
    $date = "$day/$month/$year"; 
    return $date;
      }
    }
    $date = "$convdate";
    $amountraised = $_POST['amountraised'];         

    $update = "UPDATE fundraisingtotal SET date = '$date', amountraised = '$amountraised' WHERE id='$id' ";
    $result = mysql_query($update);
    $realdate = dateconvert($date,2); // convert date to British date 
    if ($result) {
    echo "<p class=\"dbpara\">Thank you. Your update to the record was successful.</p>";
    echo "<p class=\"dbpara\">The record has been amended to a date of <b>$realdate</b> and amount of <b>$amountraised</b>.</p>";
    }
    else {
    echo "<p>Nothing has been changed.</p>";
    }
    mysql_close();

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

أنا متأكد من أنه يجب أن يكون هناك شيء أفتقده مع العبث بتنسيقات التاريخ أو لدي شيء في الترتيب الخطأ، لكنني جربت الكثير من الاختلافات المختلفة في هذا الآن لا أستطيع رؤية الخشب ل الأشجار. أي شخص أي أفكار ما أفعله خطأ هنا؟

هل كانت مفيدة؟

المحلول

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

ابدأ بالتغيير dateconvert وظيفة إلى شيء أكثر أمانا. ستظهر هذه الوظيفة دائما تاريخا صحيحا, ، حتى لو حاول المستخدم إساءة استخدام النظام.

تحرير 1: نسيت وضع : بعد case 'en_en' ولكن إصلاحها الآن. شكرا حديثي النيون.
تحرير 2: نسيت أن تطعم date() وظيفة مع الطابع الزمني. مثبت!
تحرير 3: preg_replace لتحويل frontslashes إلى شرطات

// this function always returns a valid date
function dateconvert($date = NULL, $date_type = 'sql') {
        $date = preg_replace("/", "-", $date);
    $timestamp = strtotime($date);
    switch($date_type) {
        default: case 'sql' : return date('Y-m-d', $timestamp); break; // prints YYYY-MM-DD
        case 'en_EN' : return date('d-m-Y', $timestamp); break; // prints DD-MM-YYYY
    }
}

يمكنك دائما إلقاء نظرة Zend_Date سيتيح لك ذلك العمل مع التواريخ على شكلك الخاص.

نصائح أخرى

يتغيرون

$result = mysql_query($update);

ل

$result = mysql_query($update) or die(mysql_error());

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

ثلاثة أشياء كنت أبحث عنها:

  1. هل يتم إرفاق التعليمات البرمجية بنفس قاعدة البيانات التي تنظر إليها؟ (قضيت بضع ساعات في هذا واحد؛)

  2. هل بيان تحديث آخر (أو هذا) يعمل مباشرة بعد ذلك من شأنه أن يغير القيم مرة أخرى؟ هنا تحتاج إلى بعض التسجيل لمعرفة ذلك.

  3. إذا قمت بالضديد من SQL، فما يحدث عند تشغيله مباشرة بنفسك؟

إذا رأيت الجدول لا يغير أي قيمة، فلن يظهر لك الاستعلام أي خطأ، ثم WHERE id = '$id' لا يضرب السجل الذي تهدف إليه.

لا تنس تنظيم استعلاماتك لأن الآخرين يخبرونك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top