1

次のコードを機能させることができません。

    // dd/mm/yyyy for dates in SQL queries
    $todayforw = date('d/m/Y');
    $aweekago  = date('d/m/Y', time() - 604800);

    $week_e_check = mysql_query("SELECT * FROM earningslog WHERE user_id = '".$info['id']."' WHERE day >='".$aweekago."' AND day <'".$todayforw."'");

    while ($week_e_info = mysql_fetch_array($week_e_check)) {
        $week_e = $week_e + $week_e_info['user_earnings_amnt'];
    }

クエリはゼロ行を返しますが、条件に一致するデータを返す必要があります。

4

4 に答える 4

1

問題はクエリ構文にあるようです。WHEREを2回記述していますが、1回だけ記述してから、ANDまたはOR演算子を使用してさらに基準を設定する必要があります。また、ステートメントを変数に移動するかdie()、デバッグを支援するために使用することをお勧めします。

 $week_e_check = mysql_query("SELECT * FROM earningslog WHERE user_id = '".$info['id']."' AND day >='".$aweekago."' AND day <'".$todayforw."'") or die(mysql_error()); 

さらに、この拡張機能の使用は推奨されていないため、mysql拡張機能を使用しないでください。代わりに、MySQLiまたはPDO_MySQL拡張機能を使用してください。これらの代替拡張機能の1つを使用すると、SQLインジェクションを防ぐための最初のステップとして役立ちます。*また、使用を避け、代わりに返される列名を指定することをお勧めします。

PDOの使用:

<?php

/* Execute a prepared statement by passing an array of values */
$sth = $dbh->prepare('SELECT * FROM earningslog WHERE user_id = ? AND day >= ? AND day < ?');
$sth->execute(array($info['id'], $aweekago, $todayforw));
$results = $sth->fetchAll();

?>
于 2012-08-21T21:21:29.540 に答える
1

日付形式を確認してください。

する必要があります:

YYYY-mm-dd HH:mm:ss

EG 2012-01-01 00:00:00(2012年1月1日午前0時現地時間)

他の日付形式でも機能する場合がありますが、MySQLが日付を表示するときに使用するのと同じ形式を使用するのが最善の方法です。これが、毎回機能する唯一の方法です。

http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

また、構文が正しくありません。2つの場所があるため、ANDを使用する必要があります。

于 2012-08-21T21:15:05.443 に答える
1

クエリを詳しく見てみましょう。

  SELECT * FROM earningslog WHERE user_id = '".$info['id']."' WHERE day >='".$aweekago."' AND day <'".$todayforw."'"

Where句が2回表示されます。

考慮すべき2つのこと-データを選択するときは、select *に近づかないようにしてください-テーブルが変更されると、予期しない結果が生じる可能性があります。

次に、where句にパラメータを直接挿入するのではなく、パラメータ化されたクエリとしてクエリを作成してみてください。自分の基準を自分のやり方で直接注入することで、SQLインジェクション攻撃にさらされることになります。

これをパラメーター化されたクエリに変換することで、データベースに対して直接クエリをデバッグできるという副次的な利点が得られ、クエリツールからコードにクエリをコピーするために必要な労力が軽減されます。

于 2012-08-21T21:17:26.593 に答える
1

文字列の形式を d/m/Y から Ymd に変更してみてください。

MySQL は年初にそれを期待しているかもしれません。その場合、d/m/Y で間違ったことをしている可能性があります。

また、WHERE 句を 2 回使用しないでください。代わりに、AND を使用して条件を組み合わせます。

WHERE      user_id = '".$info['id']."'
       AND day >='".$aweekago."'
       AND day <'".$todayforw."'

ちなみに、WHERE day BETWEEN ".$aweekago." AND ".$todayforw."($todayforw を前日に変更する限り) と言う構文の方が読みやすいかもしれません。

于 2012-08-21T21:12:39.933 に答える