Pergunta

Um pouco estranho problema aqui ...

Eu tenho uma consulta de atualização que não está funcionando e não posso para a vida de mim descobrir o porquê!

Minha tabela possui três três campos - 'id' (int, incremento automático), 'data' (data) e 'amountReed' (decimal). Parte do aplicativo que estou desenvolvendo calcula o total de captação de recursos a cada semana feito por uma livraria de caridade. O campo 'Data' usa um tipo de coluna de data como em outras partes do site, estou usando as datas nos cálculos.

Em outros lugares do sistema, tenho outras consultas de atualização que estão funcionando muito bem, mas suspeito Digite datas no formato britânico dd-mm-yyyy e depois use o PHP para converter novamente no formato AAA-MM-DD amigável para MySQL.

Esta é a parte estranha. De acordo com a página de confirmação do site, a consulta correu bem e a atualização foi feita, mas quando eu verifico o banco de dados, nada mudou. Para que eu possa verificar qual é a saída da consulta que tentei ecoar o resultado na página da web para ver o que estou recebendo. Os valores esperados aparecem lá na página, mas, novamente, quando eu verifico o banco de dados, nada foi atualizado.

Este é o meu formulário de atualização com a função de conversão de 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 esta é a página de processamento/consulta do formulário:

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

O estranho é que o texto de confirmação "O registro foi alterado para ... etc.". Exibe exatamente como o esperado, mas quando eu verifico o banco de dados, o registro não foi atualizado.

Tenho certeza de que deve ser algo que estou perdendo com os formatos de data ou tenho algo na ordem errada, mas tentei tantas variações diferentes sobre isso agora não consigo ver a madeira para o árvores. Alguém alguma idéia do que estou fazendo de errado aqui?

Foi útil?

Solução

Eu vejo algumas bandeiras vermelhas aqui. Tu es Obtendo a data de um formulário e inseri -lo no MySQL sem qualquer forma de validação - que pode levar a injeções de SQL.

Comece mudando dateconvert função para algo mais seguro. Esta função sempre retornará uma data formada correta, mesmo que o usuário tente abusar do sistema.

Editar 1: Esqueci de colocar um : depois case 'en_en' mas consertou agora. Obrigado NeonBlue.
Editar 2: Esqueci de alimentar o date() função com o registro de data e hora. Fixo!
Editar 3: Um preg_replace para converter as travessuras de frente em traços

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

Você sempre pode dar uma olhada Zend_Date Isso permitirá que você trabalhe com datas em seu próprio formato.

Outras dicas

Mudar

$result = mysql_query($update);

para

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

E você deve ver qual é o problema quando a consulta falhar.

Três coisas que eu procuraria:

  1. O código está anexado ao mesmo banco de dados que você está olhando? (Passei algumas horas neste;)

  2. Outra instrução de atualização (ou esta) está sendo executada imediatamente depois que isso mudaria os valores de volta? Aqui você precisa de alguns logs para descobrir.

  3. Se você ecoa o SQL, o que acontece quando você o executa diretamente?

Se você vir a tabela não está alterando nenhum valor, mas a consulta não mostra nenhum erro, então WHERE id = '$id' não está atingindo o registro que você pretendia.

Não se esqueça de higienizar suas consultas, pois outras pessoas estão lhe dizendo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top