日付が更新されない MySQL/PHP 更新クエリ
-
19-09-2019 - |
質問
ここで少し奇妙な問題が発生します...
更新クエリが機能していませんが、その理由は一生わかりません。
私のテーブルには、「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 </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 </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());
そして、クエリが失敗したときに何が問題であるかを確認する必要があります。
私が探しているものは 3 つあります。
コードは、見ているのと同じデータベースに接続されていますか?(これに数時間費やしました ;)
値を元に戻す別の更新ステートメント (またはこのステートメント) が直後に実行されていますか?ここで、それを理解するにはログが必要です。
SQL をエコーした場合、自分で直接実行するとどうなるでしょうか?
テーブルの値が変更されていないのに、クエリでエラーが表示されない場合は、 WHERE id = '$id'
意図したレジスターにヒットしていません。
他の人が言っているように、クエリをサニタイズすることを忘れないでください。