Tarihleri ​​güncelleme ile değil MySQL / PHP güncelleme sorgusu

4 Cevap php

Burada garip bir sorun biraz ...

Ben çalışmıyor bir güncelleştirme sorgusu var ve ben bana yaşam için neden çalışmak değil!

Benim tablo iki üç alan vardır - 'id' (int, otomatik artış), 'tarih' (tarih), ve (ondalık) 'amountraised'. Ben hesaplar bağış geliştiriyorum app parçası bir hayır kitap sergisi ile yapılan her hafta toplam. 'Tarih' alanı olarak başka bir yerde ben hesaplamalarda tarihleri ​​kullanıyorum sitede bir tarih sütun türünü kullanır.

Başka bir yerde sistem içinde ben sadece iyi çalışan diğer güncelleştirme sorguları var, ama (bu bir sorun de kayıt güncelleme gibi ben aynı zamanda tarih biçimini manipüle etmeye çalışıyorum olduğunu sanıyorum I can böylece İngiliz gg-aa-yyyy biçiminde tarihleri ​​girin ve ardından MySQL dostu yyyy-aa-gg biçime geri dönüştürmek için PHP kullanabilirsiniz.

Bu garip bit. Sitede onay sayfasına göre, sorgu tamam tükendi ve güncelleme yapılmış, ama ben veritabanını kontrol ettiğimde, hiçbir şey değişmedi. Yani sorgunun çıktı ben alıyorum ne olduğunu görmek için web sayfasına sonuç yankılanan denedim ne olduğunu kontrol edebilir. Beklenen değerler sayfada orada göstermek, ama ben veritabanını kontrol ettiğimde yine, hiçbir şey güncelleştirilmiş.

Bu tarih dönüştürme fonksiyonu ile benim güncelleme şeklidir:

          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>

... Ve bu form işleme / sorgu sayfası:

    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();

Garip bir şey onay metni "rekor ... vs tadil edilmiştir" olduğunu görüntüler tam beklendiği gibi, ama ben veritabanını kontrol ederken, kayıt tüm güncellenmiş değil.

Şimdi için odun göremiyorum ben ben tarih biçimleri ile karıştırmasını ile eksik ya da yanlış sırada bir şey var bir şey olmalı eminim, ama ben bu kadar çok farklı varyasyonları denedim ağaçlar. Ben burada yanlış ne yapıyorum Herkes herhangi bir fikir?

4 Cevap

Burada bazı kırmızı bayraklar görüyorum. Sen getting the date from a form ve doğrulama herhangi bir form olmadan MySQL içine inputing - yani could lead to SQL-injections.

Daha güvenli bir şey için dateconvert fonksiyonunu değiştirerek başlayın. This function will always return a correct formated date, kullanıcı sistemi kötüye çalışır bile.

Edit 1: Forgot to put a : after case 'en_en' but fixed it now. Thanks neonblue.
Edit 2: Forgot to feed the date() function with the timestamp. Fixed!
Edit 3: A preg_replace to convert frontslashes to dashes

// 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
    }
}

Her zaman Zend_Date bu sizin kendi formatında tarihleri ​​ile iş sağlayacak bir göz atabilirsiniz.

Değişim

$result = mysql_query($update);

karşı

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

Ve sorgu başarısız olduğunda sorunun ne olduğunu görmek gerekir.

Ben cekti bakmak için üç şey:

  1. Kod bakıyorsun aynı veritabanına bağlama mı? (Ben bu sefer birkaç saat geçirdim ;)

  2. Başka bir güncelleme bildirimi (ya da bu bir) bu geri değerlerini değiştirmek istiyorsunuz hemen sonra çalışıyor? İşte bunu anlamaya bazı günlük gerekir.

  3. Eğer sql yankı Eğer kendinizi doğrudan çalıştırdığınızda, ne olur?

Eğer tablo herhangi bir değeri değişiyor değil görmek ama sorgu size herhangi bir hata görünmüyor, sonra da WHERE id = '$id' sen amaçlanan kayıt vurmak değildir.

Başkalarının size söylüyorum gibi sorguları sterilize unutmayın.