MySQL / PHP запрос на обновление с датами не обновляется - PullRequest
0 голосов
/ 12 ноября 2009

Немного странной проблемы здесь ...

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

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

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

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

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

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

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

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

Ответы [ 4 ]

3 голосов
/ 12 ноября 2009

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

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

Редактировать 1: Забыл поставить : после case 'en_en', но исправил это сейчас. Спасибо neonblue.
Редактировать 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, который позволит вам работать с датами в собственном формате.

2 голосов
/ 12 ноября 2009

Изменение

$result = mysql_query($update);

до

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

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

1 голос
/ 12 ноября 2009

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

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

1 голос
/ 12 ноября 2009

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

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

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

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

...