0

ここでちょっと変わった問題が...

機能していない更新クエリがあり、その理由を一生理解できません。

私のテーブルには、「id」(int、自動インクリメント)、「date」(日付)、「amountraised」(10 進数) の 2 つの 3 つのフィールドがあります。私が開発しているアプリの一部では、慈善書店による毎週の募金総額を計算しています。「日付」フィールドは、計算で日付を使用しているサイトの他の場所と同じように、日付列タイプを使用します。

システム内の他の場所には、問題なく動作している他の更新クエリがありますが、これの問題は、レコードを更新するだけでなく、日付形式も操作しようとしていることにあると思われます (英国の dd-mm-yyyy 形式で日付を入力し、PHP を使用して MySQL に適した yyyy-mm-dd 形式に変換します。

これは奇妙なビットです。サイトの確認ページによると、クエリは問題なく実行され、更新も行われているのですが、データベースを確認しても何も変わっていません。クエリの出力が何であるかを確認できたので、結果をWebページにエコーして、何が得られているかを確認しました。期待値はページに表示されますが、データベースを確認しても何も更新されていません。

これは、日付変換機能を使用した私の更新フォームです。

          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

4 に答える 4

3

ここにいくつかの危険信号が表示されます。フォームから日付を取得し、検証を行わずに MySQL に入力すると、SQL インジェクションが発生する可能性があります

dateconvert機能をより安全なものに変更することから始めます。この関数は、ユーザーがシステムを悪用しようとしても、常に正しい形式の日付を返します。

編集 1:: afterを付けるのを忘れていました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、独自の形式で日付を操作できるようにすることができます。

于 2009-11-12T18:17:11.587 に答える
2

変化する

$result = mysql_query($update);

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

そして、クエリが失敗したときに問題が何であるかを確認する必要があります。

于 2009-11-12T18:03:54.490 に答える
1

テーブルが値を変更していないのにクエリにエラーが表示WHERE id = '$id'されない場合は、意図したレジスタにヒットしていません。

他の人があなたに言っているようにあなたのクエリをサニタイズすることを忘れないでください。

于 2009-11-12T19:55:36.120 に答える
1

私が探す3つのこと:

  1. コードは、あなたが見ているのと同じデータベースに接続されていますか? (私はこれに数時間を費やしました;)

  2. 値を元に戻す別の更新ステートメント (またはこのステートメント) が直後に実行されていますか? ここでは、それを理解するためにいくつかのログが必要です。

  3. SQL をエコーする場合、自分で直接実行するとどうなりますか?

于 2009-11-12T18:22:06.227 に答える