1

この問題に関する投稿をいくつか見ましたが、正しく機能していません。最初に文字列として POST する PHP 変数があります。1 週間の日付範囲を処理できるようにするために、strToTime を使用してこれを日時形式に変換しています (たとえば、2013 年 7 月 22 日は 1374476400 としてエコーします)。

私のテーブルには、日付が Ymd 形式のテキストとして保存されています (たとえば、2013 年 7 月 22 日は 2013-07-22 として保存されます)。これら 2 つの値を比較してクエリを実行し、1 週間の範囲内の日付を見つける必要があるため、比較のためにそのテキストを日時形式に変換しようとしています。

私が使用しているSQLは次のとおりです。

$wk_begin = $_POST['wk_begin'];
$wk_begin = strToTime($wk_begin);
$wk_end = $wk_begin + 8;
$sql = "SELECT * FROM myTable WHERE (DATE(date)>=$wk_begin AND DATE(date)<$wk_end)";

エラーは発生していませんが、テーブルに 7 つの一致するレコードがあることがわかっているにもかかわらず、クエリでレコードが取得されません。だから私は2つの質問があります:

1)これについてもっと良い方法はありますか?2)私が正しい軌道に乗っている場合、正しく比較できるように、テキストベースの日付を大きな整数に変換するSQLステートメントを取得するにはどうすればよいですか。

どんな助けでも大歓迎です。ありがとう!

編集:すべての提案をありがとう。日付が「日付」形式で保存されるようにテーブルを変更しました(文字列はもうありません)。これが更新されたコードです。まだ値を取得していません:

$wk_begin = $_POST['wk_date'];
$wk_end = $wk_begin + 7;
$sql = "SELECT * FROM Workouts WHERE 'date' BETWEEN '$wk_begin' AND '$wk_end'";
4

2 に答える 2

3

datemysql の予約語です。フィールド名として使用するには、バッククォートで囲みます。

また、変数の挿入はアポストロフィで囲む必要があります

SELECT * FROM myTable WHERE (DATE(`date`)>='$wk_begin' AND DATE(`date`)<'$wk_end'

(日付フィールドをフィールドにすることに加えて) より良い解決策はdate、SQL ステートメントを作成するときに db ライブラリのエスケープおよび引用メカニズムを使用することです。

また、日付を Ymd 形式で保存しているため、この方法でフォーマットされた日付の文字列比較は文字列と同じに評価されるため、日付へのキャストは不要です。そう

$sql = "SELECT * from myTable WHERE `date` >= ".$db->quoteAndEscape($wk_begin)." and `date` < ".$db->quoteAndEscape($wk_end);

アップデート

この日付に基づいて、引用符で囲まれていないフィールド名として使用できます。

于 2013-07-24T20:28:33.060 に答える
0
<?php
$wkbegin = $_POST['wk_begin'];
$wk_begin = strToTime($wkbegin);
$d=date('j', $wk_begin)+8;
$m=date('n', $wk_begin);
$y=date('Y', $wk_begin);
$wk_end = date('Y-m-d', mktime(0,0,0, $m, $d, $y));
$wkbegin = date('Y-m-d', $wk_begin);
$sql = "SELECT * FROM `myTable` WHERE `date`>='".$wkbegin."' AND `date`<'".$wk_end."'";
?>
于 2013-07-24T20:46:38.823 に答える