문제

여기에 약간의 이상한 문제가 있습니다 ...

작동하지 않는 업데이트 쿼리가 있고, 내 인생에서는 이유를 해결할 수 없습니다!

내 테이블에는 'ID'(int, 자동 증분), '날짜'(날짜) 및 '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-intections로 이어질 수 있습니다.

변경하여 시작하십시오 dateconvert 더 안전한 것으로 기능합니다. 이 기능은 항상 올바른 형성 날짜를 반환합니다, 사용자가 시스템을 남용하려고하더라도.

편집 1 : 넣는 것을 잊었습니다 : ~ 후에 case 'en_en' 그러나 지금 고쳐졌습니다. 감사합니다 Neonblue.
편집 2 : 먹이를 잊어 버렸습니다 date() 타임 스탬프로 기능합니다. 결정된!
편집 3 : Frontslashes를 대시로 변환하는 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. 다른 업데이트 명령문 (또는이 문장)이 즉시 실행되어 값이 다시 변경 될 수 있습니까? 여기에 알아 내려면 로깅이 필요합니다.

  3. SQL을 반향한다면 직접 실행하면 어떻게됩니까?

테이블이 값이 변경되지 않지만 쿼리에 오류가 표시되지 않으면 오류가 표시되지 않습니다. WHERE id = '$id' 의도 한 레지스터에 부딪치지 않습니다.

다른 사람들이 말하는 것처럼 쿼리를 소독하는 것을 잊지 마십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top