Question

Bit d'un étrange problème ici ...

J'ai une requête de mise à jour qui ne fonctionne pas, et je ne peux pas pour la vie de me comprendre pourquoi!

Ma table a deux trois champs - 'id' (int, incrémentation automatique), 'date' (date), et (décimal) 'amountraised'. Une partie de l'application que je développe calcule la collecte de fonds chaque semaine totale faite par un bouquiniste de charité. Le champ « date » utilise un type de colonne de date comme ailleurs sur le site que je utilise les dates dans les calculs.

Ailleurs dans le système que j'ai d'autres requêtes de mise à jour qui fonctionnent très bien, mais je pense que le problème avec celui-ci est aussi bien que la mise à jour du dossier que j'essaie aussi de manipuler le format de date et (si que je peux entrer des dates dans le British format jj-mm-aaaa puis utilisez le PHP pour se reconvertir dans le format aaaa-mm-jj MySQL convivial.

Ceci est le peu étrange. Selon la page de confirmation sur le site, la requête a couru bien, et la mise à jour a été faite, mais quand je vérifie la base de données, rien n'a changé. Je pourrais donc vérifier ce que la sortie de la requête est que je l'ai essayé écho le résultat à la page Web pour voir ce que je veux. Les valeurs attendues apparaissent là-bas sur la page, mais encore une fois, quand je vérifie la base de données, rien n'a été mis à jour.

Ceci est ma forme de mise à jour avec la fonction de conversion de date:

          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>

... et c'est la page de traitement de formulaires / requête:

    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 chose étrange est que le texte de confirmation « L'enregistrement a été modifié pour ... etc. » affiche exactement comme prévu, mais quand je vérifie la base de données, le dossier n'a pas été mis à jour du tout.

Je suis sûr que ce doit être quelque chose qui me manque avec déconner avec les formats de date ou j'ai quelque chose dans le mauvais ordre, mais je l'ai essayé tant de variations différentes sur ce que je peux maintenant pas voir le bois pour les arbres. Toute personne des idées ce que je fais mal ici?

Était-ce utile?

La solution

Je vois des drapeaux rouges ici. Vous êtes obtenir la date d'un formulaire et inputing dans MySQL sans aucune forme de validation -. Que pourrait conduire à des injections SQL-

Commencez par changer la fonction dateconvert à quelque chose de plus sûr. Cette fonction retournera toujours une date correcte formated , même si l'utilisateur tente d'abuser du système.

Modifier 1: Vous avez oublié de mettre un : après case 'en_en' mais fixe maintenant. Merci à neonblue.
Edit 2: Mot pour alimenter la fonction date() avec l'horodatage. Fixé!
Edit 3: A preg_replace pour convertir frontslashes à tirets

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

Vous pouvez toujours avoir un coup d'oeil dans Zend_Date qui vous permettra de travailler avec des dates sur votre propre format.

Autres conseils

Modifier

$result = mysql_query($update);

à

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

Et vous devriez voir ce que le problème est quand la requête échoue.

Trois choses que je chercherais:

  1. Le code est attaché à la même base de données que vous regardez? (J'ai passé quelques heures sur celui-ci;)

  2. est une autre déclaration de mise à jour (ou celle-ci) en cours d'exécution immédiatement après qui changerait les valeurs de retour? Ici, vous avez besoin de l'exploitation forestière à comprendre.

  3. Si vous écho sql, ce qui se passe lorsque vous exécutez vous-même directement?

Si vous voyez le tableau ne change pas une valeur, mais la requête ne vous montre pas une erreur, WHERE id = '$id' ne frappe pas le registre, vous l'intention.

Ne pas oublier de désinfecter vos requêtes comme les autres vous disent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top