Pregunta

Poco de un extraño problema aquí ...

Tengo una consulta de actualización que no está funcionando, y no puedo para la vida de mí averiguar por qué!

La tabla tiene dos tres campos - 'id' (int, incremento automático), 'fecha' (fecha), y 'amountraised' (decimal). Una parte de la aplicación que estoy desarrollando calcula el total de la recaudación de fondos cada semana hecha por un puesto de libros caridad. El campo 'fecha' utiliza un tipo de columna fecha como en otros lugares en el sitio que estoy usando las fechas en los cálculos.

En otros lugares dentro del sistema Tengo otras consultas de actualización que están trabajando muy bien, pero sospecho que el problema con esto es que, así como la actualización del registro También estoy tratando de manipular el formato de fecha, así (por lo que puedo introducir fechas en el formato dd-mm-aaaa británica y luego usar el PHP para convertir de nuevo en el formato aaaa-mm-dd MySQL ambiente.

Esta es la extraña bits. De acuerdo con la página de confirmación en el sitio, la consulta se ha ejecutado bien, y ha realizado la actualización, pero al comprobar la base de datos, nada ha cambiado. Así que pude comprobar lo que el resultado de la consulta es que he intentado haciendo eco del resultado a la página web para ver lo que estoy haciendo. Los valores esperados aparecen allí en la página, pero una vez más, al comprobar la base de datos, nada se ha actualizado.

Esta es mi forma de actualización con la función de conversión de la fecha:

          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>

... y esta es la página de procesamiento de formularios / consulta:

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

Lo extraño es que el texto de confirmación "El registro se ha modificado para ... etc." muestra exactamente como se esperaba, pero al comprobar la base de datos, el registro no se ha actualizado en absoluto.

Estoy seguro de que debe haber algo que me falta con jugar con los formatos de fecha o Tengo algo en el orden equivocado, pero he intentado muchas variaciones diferentes en este momento no puedo ver el madera de los árboles. Cualquier persona alguna idea de lo que estoy haciendo mal aquí?

¿Fue útil?

Solución

veo algunas señales de alerta-aquí. Estás obtener la fecha de una forma y inputing en MySQL sin ningún tipo de validación -. Que podría conducir a SQL-inyecciones

Para empezar, el cambio de la función dateconvert a algo más seguro. Esta función siempre devuelve una fecha con formato correcto , incluso si el usuario intenta abusar del sistema.

Editar 1: Se olvidó de poner un : después case 'en_en' pero fija ahora. Gracias neonblue.
Editar 2: olvidó de alimentar la función date() con la marca de tiempo. ¡Fijo!
Editar 3: A preg_replace para convertir frontslashes a guiones

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

Siempre se puede echar un vistazo a Zend_Date que le permitirá trabajar con fechas en su propio formato.

Otros consejos

Cambiar

$result = mysql_query($update);

a

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

Y hay que ver cuál es el problema cuando la consulta falla.

Hay tres cosas que me gustaría tener en cuenta:

  1. es el código adjuntando a la misma base de datos que está viendo? (Pasé unas horas en éste;)

  2. es otra instrucción de actualización (o éste) que se ejecuta inmediatamente después que cambiaría los valores de nuevo? Aquí se necesita algún registro para averiguarlo.

  3. Si se hacen eco del SQL, lo que sucede cuando se ejecuta directamente a ti mismo?

Si ves la mesa no está cambiando cualquier valor, pero la consulta no muestra ningún error, entonces se WHERE id = '$id' no golpear el registro que la intención de.

No se olvide de desinfectar sus consultas como otros están diciendo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top