Frage

Ein bisschen seltsames Problem hier ...

Ich habe eine Update -Abfrage, die nicht funktioniert, und ich kann für mein Leben nicht herausfinden, warum!

Meine Tabelle enthält zwei drei Felder - 'ID' (int, Auto -Inkrement), 'Datum' (Datum) und 'amuntrimierter' (dezimal). Ein Teil der App, die ich entwickle, berechnet die gesamte Spendenbeschaffung, die jede Woche von einem Wohltätigkeitsbuchstall erstellt hat. Das Feld 'Date' verwendet einen Datumsspaltenentyp, wie es an anderer Stelle auf der Site die Daten in Berechnungen verwendet.

An anderer Stelle innerhalb des Systems habe ich andere Update -Abfragen, die gut funktionieren, aber ich vermute, dass das Problem damit, dass ich auch den Datensatz aktualisiere, auch das Datumsformat zu manipulieren (damit ich kann Geben Sie Daten im britischen DD-MM-YJJJJ-Format ein und verwenden Sie dann den PHP, um in das MySQL-freundliche Yjyy-MM-DD-Format zurückzukehren.

Das ist das seltsame Stück. Laut der Bestätigungsseite auf der Website ist die Abfrage in Ordnung gelaufen, und das Update wurde durchgeführt, aber wenn ich die Datenbank überprüfe, hat sich nichts geändert. Ich konnte also überprüfen, wie die Ausgabe der Abfrage versucht habe, das Ergebnis der Webseite wiederzugeben, um zu sehen, was ich bekomme. Die erwarteten Werte werden dort auf der Seite angezeigt, aber wenn ich die Datenbank überprüfe, wurde nichts aktualisiert.

Dies ist mein Aktualisierungsformular mit der Date Conversion -Funktion:

          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>

... und dies ist die Seite Formularverarbeitung/Abfrage:

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

Das Seltsame ist, dass der Bestätigungstext "der Datensatz geändert wurde ... usw." Zeigt genau wie erwartet an, aber wenn ich die Datenbank überprüfe, wurde der Datensatz überhaupt nicht aktualisiert.

Ich bin mir sicher, dass es etwas sein muss, das ich fehlt, wenn ich mit den Datumsformaten herumspiele, oder ich habe etwas in der falschen Reihenfolge, aber ich habe so viele verschiedene Variationen dazu ausprobiert, jetzt kann ich das Holz für die nicht sehen Bäume. Hat jemand Ideen, was ich hier falsch mache?

War es hilfreich?

Lösung

Ich sehe hier ein paar rote Flaggen. Sie sind das Datum aus einem Formular erhalten und Eingabe es ohne jegliche Form der Validierung in mySQL - das könnte zu SQL-Injektionen führen.

Beginnen Sie mit Änderung dateconvert Funktion zu etwas sicherer. Diese Funktion gibt immer ein korrektes formatiertes Datum zurück, auch wenn der Benutzer versucht, das System zu missbrauchen.

Bearbeiten 1: Vergaß, eine zu setzen : nach case 'en_en' Aber jetzt behoben. Danke Neonblue.
Bearbeiten 2: Vergessen, das zu füttern date() Funktion mit dem Zeitstempel. Fest!
Bearbeiten 3: Ein PREG_REPLACE, um Frontenlashes in Striche umzuwandeln

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

Sie können immer einen Blick darauf werfen Zend_Date Dadurch können Sie mit Daten in Ihrem eigenen Format arbeiten.

Andere Tipps

Veränderung

$result = mysql_query($update);

zu

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

Und Sie sollten sehen, was das Problem ist, wenn die Abfrage fehlschlägt.

Drei Dinge, nach denen ich suchen würde:

  1. Angehängt der Code an derselben Datenbank, die Sie sich ansehen? (Ich habe ein paar Stunden damit verbracht;)

  2. Wird eine weitere Aktualisierungsanweisung (oder diese) unmittelbar danach ausgeführt, die die Werte wieder ändern würde? Hier brauchen Sie etwas Protokollierung, um es herauszufinden.

  3. Wenn Sie das SQL wiederholen, was passiert, wenn Sie sie selbst direkt ausführen?

Wenn Sie sehen, dass die Tabelle keinen Wert ändert, aber die Abfrage gibt Ihnen keinen Fehler an WHERE id = '$id' trifft nicht auf das Register, das Sie beabsichtigt haben.

Vergessen Sie nicht, Ihre Anfragen zu desinfizieren, wie andere es Ihnen sagen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top