Запрос на обновление MySQL / PHP с датами, которые не обновляются

StackOverflow https://stackoverflow.com/questions/1724174

  •  19-09-2019
  •  | 
  •  

Вопрос

Здесь немного странная проблема...

У меня есть запрос на обновление, который не работает, и я ни за что на свете не смогу понять, почему!

В моей таблице есть два трех поля - 'id' (int, автоматическое увеличение), 'date' (дата) и 'amountraised' (десятичное число).Часть приложения, которое я разрабатываю, вычисляет общую сумму сбора средств каждую неделю, производимого благотворительным книжным киоском.В поле "дата" используется тип столбца даты, как и везде на сайте, где я использую даты в расчетах.

В другом месте системы у меня есть другие запросы на обновление, которые работают просто отлично, но я подозреваю, что проблема с этим заключается в том, что помимо обновления записи я также пытаюсь манипулировать форматом даты (чтобы я мог вводить даты в британском формате dd-mm-yyyy, а затем использовать PHP для преобразования обратно в удобный для MySQL формат yyyy-mm-dd.

Это самый странный момент.Согласно странице подтверждения на сайте, запрос выполнен нормально, и обновление внесено, но когда я проверяю базу данных, ничего не изменилось.Чтобы я мог проверить, каков результат запроса, я попытался повторить результат на веб-странице, чтобы увидеть, что я получаю.Ожидаемые значения отображаются там же, на странице, но опять же, когда я проверяю базу данных, ничего не обновляется.

Это моя форма обновления с функцией преобразования даты:

          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>

...а это страница обработки формы / запроса:

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

Странно то, что текст подтверждения "Запись была изменена на ... и т.д." Отображается точно так, как ожидалось, но когда я проверяю базу данных, запись вообще не обновлялась.

Я уверен, что это должно быть что-то, чего я не понимаю, возясь с форматами дат, или у меня что-то не в том порядке, но я перепробовал так много разных вариантов этого, что теперь не вижу дерева за деревьями.У кого-нибудь есть идеи, что я здесь делаю не так?

Это было полезно?

Решение

Я вижу здесь несколько красных флажков.Ты такой получение даты из формы и вводить его в MySQL без какой-либо формы проверки - это может привести к SQL-инъекциям.

Начните с изменения dateconvert переключитесь на что-то более безопасное. Эта функция всегда будет возвращать правильно отформатированную дату, даже если пользователь попытается злоупотребить системой.

Правка 1: Забыл поставить : после case 'en_en' но теперь исправил это.Спасибо, неоново-голубой.
Правка 2: Забыл покормить date() функция с меткой времени.Исправлено!
Правка 3: preg_replace для преобразования штрихов передней панели в тире

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

Вы всегда можете заглянуть в Zend_Date это позволит вам работать с датами в вашем собственном формате.

Другие советы

Изменение

$result = mysql_query($update);

Для

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

И вы должны увидеть, в чем проблема, когда запрос завершается с ошибкой.

Три вещи, на которые я бы обратил внимание:

  1. Привязан ли код к той же базе данных, которую вы просматриваете?(Я потратил на это несколько часов;)

  2. Выполняется ли сразу после этого другой оператор update (или этот), который вернул бы значения обратно?Здесь вам нужно немного протоколировать, чтобы разобраться в этом.

  3. Если вы повторяете sql, что происходит, когда вы запускаете его непосредственно самостоятельно?

Если вы видите, что таблица не изменяет никакого значения, но запрос не показывает вам никакой ошибки, то WHERE id = '$id' попадает не в тот реестр, в который вы намеревались.

Не забудьте упорядочить свои запросы, как вам советуют другие.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top