2016-09-05 9 views
0

が、これは特にタイトルに、説明には少し複雑です:論理エラーPHPループ状配列

私は12個のインデックス、毎月のための1とPHPの配列を作ってるんだ - 毎月が表示されます月を取得するために月に記録されたページビュー数、私は現在のUNIX時間を使用して2629743秒(1ヶ月)、ループが周回するたびに2629743秒が追加されます。 Jan(1、4、5、9)1ビュー、2月の4ビューなどの配列を生成します。

ビューがない場合は、null(null、null、9) Jan、2月、3月のいずれのビューも表示されませんが、インデックスは完全に台無しになり、ビューはwroに表示されます注文。

forループコード:

$Month = 1; // Start with January 
$MonthTimestamp = 2629743; // Start with the time of ONE month from current time 
$ArrayTimeStamp = array(); 
while ($Month <= 12): // Go from January to February 

$Value1 = $now - $MonthTimestamp; 
$ViewsThisMonth = mysqli_fetch_object(mysqli_query($db, "SELECT SUM(Views) AS NumberFinalViews FROM BlogViews WHERE TimeRecord >= '$Value1' AND TimeRecord < '$now'")); 
$ArrayTimeStamp[] = $ViewsThisMonth->NumberFinalViews; 
$MonthTimestamp = $MonthTimestamp + 2629743; 
$Month++; 
endwhile; 

繰り返しに、配列は、データベースに格納されているページビューの各月を格納する必要があり、すべてのページビューは、これらのタイムスタンプは、タイムスタンプとともに保存されています12ヶ月間に分けてアレイに入れる必要があります。

2月のビュー数は2番目になければなりません。タイムスタンプは1月のタイムスタンプよりも大きく、3月よりも小さくなります。

すべてのお役に立ちました!

編集: $は現在のUNIX時間(秒)です。

+0

ここで$はどこから来ますか? – rahul

+0

単純に 'while(...){...}'の代わりに秘密の 'endwhile'を使用している理由は何ですか? – tadman

+0

**警告**:mysqliを使用する場合、[パラメータ化されたクエリ](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)と['bind_param']( http://php.net/manual/en/mysqli-stmt.bind-param.php)を使用してクエリにユーザーデータを追加します。 **重大な[SQLインジェクションのバグ](http://bobby-tables.com/)を作成したため、文字列の補間または連結を使用してこれを実行しないでください。 – tadman

答えて

0
  1. あなたは時間に関連するデータを含む、あなたの列がDATETIMETIMESTAMP列であることを確認する必要があります。それは時間ベースのクエリを容易にします。

  2. あなたは、クエリ自体にPHPで実装しようとしているロジックを移動することができます。

    SELECT SUM(Views) AS NumberFinalViews, 
         EXTRACT(YEAR_MONTH FROM TimeRecord) AS YearMonth 
        FROM BlogViews 
        WHERE TimeRecord BETWEEN '$startMonth' AND '$endMonth' 
    GROUP BY YearMonth 
    

    TimeRecordは、UNIXタイムスタンプを表すだけの整数である場合、あなたはそれを変換する必要があります。

    ... 
    EXTRACT(YEAR_MONTH FROM FROM_UNIXTIME(TimeRecord)) AS YearMonth 
    

    YearMonthのフィールドに201609(2016年9月)の値があり、その期間にViewsの数値が既にグループ化されている結果が返されます。照会している期間全体の絶対区切り文字として$startMonth$endMonthを設定するだけで、毎月個別に行う必要はありません。

+0

$ startMonthと$ endMonthは年間の値ですか?だから、$ startMonthは現在の時間 - 年、そして終了時間は現在の時間+ 1年でしょうか?それは私を殺している論理です。 – Mazux2

+0

はい、照会しようとしている年全体になります。たぶん暦年全体に興味があれば、 'WHERE YEAR(FROM_UNIXTIME)= 2016'に単純化することもできます。 – deceze

+0

実行可能なオプションではありません - クエリはサーバの速度を完全に殺しました – Mazux2