Domanda

Qui c'è un problema un po' strano...

Ho una query di aggiornamento che non funziona e non riesco a capirne il motivo!

La mia tabella ha due tre campi: "id" (int, incremento automatico), "date" (data) e "amountraised" (decimale).Una parte dell'app che sto sviluppando calcola il totale della raccolta fondi effettuata ogni settimana da una bancarella di beneficenza.Il campo "data" utilizza un tipo di colonna data poiché altrove nel sito utilizzo le date nei calcoli.

Altrove all'interno del sistema ho altre query di aggiornamento che funzionano bene, ma sospetto che il problema con questa sia che oltre ad aggiornare il record sto anche cercando di manipolare anche il formato della data (in modo da poter inserisci le date nel formato britannico gg-mm-aaaa e quindi utilizza PHP per riconvertirle nel formato aaaa-mm-gg compatibile con MySQL.

Questa è la cosa strana.Secondo la pagina di conferma sul sito, la query è stata eseguita correttamente e l'aggiornamento è stato effettuato, ma quando controllo il database, non è cambiato nulla.Per poter verificare qual è l'output della query, ho provato a riprodurre il risultato nella pagina Web per vedere cosa ottengo.I valori attesi vengono visualizzati nella pagina, ma ancora una volta, quando controllo il database, non è stato aggiornato nulla.

Questo è il mio modulo di aggiornamento con la funzione di conversione della data:

          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>

...e questa è la pagina di elaborazione/query del modulo:

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

La cosa strana è che il testo di conferma "Il record è stato modificato a ... ecc." Visualizza esattamente come previsto, ma quando controllo il database, il record non è stato affatto aggiornato.

Sono sicuro che si tratti di qualcosa che mi sfugge perché ho modificato i formati delle date oppure ho qualcosa nell'ordine sbagliato, ma ho provato così tante varianti diverse adesso che non riesco a vedere il legno per alberi.Qualcuno ha qualche idea su cosa sto facendo di sbagliato qui?

È stato utile?

Soluzione

Vedo alcune bandiere rosse qui.Sei ottenere la data da un modulo e inserendolo in MySQL senza alcuna forma di convalida: quello potrebbe portare a iniezioni SQL.

Inizia cambiando dateconvert funzione a qualcosa di più sicuro. Questa funzione restituirà sempre una data formattata correttamente, anche se l'utente tenta di abusare del sistema.

Modifica 1: Ho dimenticato di mettere a : Dopo case 'en_en' ma risolto adesso.Grazie neonblue.
Modifica 2: Ho dimenticato di dargli da mangiare date() funzione con il timestamp.Fisso!
Modifica 3: Un preg_replace per convertire le barre in trattini

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

Puoi sempre dare un'occhiata Zend_Date che ti consentirà di lavorare con le date nel tuo formato.

Altri suggerimenti

Cambia

$result = mysql_query($update);

a

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

e si dovrebbe vedere qual è il problema quando la query ha esito negativo.

Tre cose che vorrei cercare:

  1. è il codice allegando allo stesso database si sta guardando? (Ho trascorso un paio d'ore su questo;)

  2. è un'altra istruzione di aggiornamento (o questa) in esecuzione subito dopo che avrebbe cambiato i valori di nuovo? Qui è necessario un po 'di registrazione per capirlo.

  3. Se eco la SQL, che cosa succede quando si esegue direttamente da soli?

Se si vede la tabella non cambia alcun valore, ma la query non mostra alcun errore, allora WHERE id = '$id' non è colpire il registro si intendeva.

Non dimenticare di disinfettare le vostre domande come gli altri stanno dicendo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top