0

JQueryのフルカレンダーイベントを使用しています。これまでのところ、制限によってイベントをロードするオプションがないことを知っています。

月表示では、1日に100のイベントがあると、テーブルセルが非常に大きくなります。1日10イベントに制限したいと思います。

私がやろうと思ったのは、PHPを使用してサーバー側でそれを行うことでした。日付範囲を指定してPHPを使用してすべてのイベントをロードしているので、毎日ロードし、1日あたり10イベントに制限すると思いました。

これは私がPHP側に持っているものです:

   if ($currView == 'month') //curr view is the current view of the calendar
    {
        $start = $_GET['start']; //gets from the calendar usually start of month
        $end = $_GET['end']; //gets from calendar usually end of month
        //some array to store all events before using json_encode
        $limitEvents = array();
        $limit = 10;
        //loop through from start till end by 1 day incremental
        for ($i = $start; $i < $end; $i+=strtotime($i, "+1 day"))
        {
            //make the end of day to be the current day but 23:59:59
            $endOfDay = date('m/d/Y', $start);
            $endOfDay = strtotime($endOfDay . ' 23:59:59');
            //load the events from DB using date range which is 1 day and limit of events
            $loaded = $this->loadDataFromDB($start, $endofDay, $limit);
            //merge the arrays
            array_merge($limitTasks, $loaded);
        }
    }

このコードの問題は、実行しようとすると最適ではないことです。毎日ループし、1日ごとにクエリを実行し、非常に長い時間がかかり、タイムアウトすることさえあります。

私の質問は、MySQL側でこれをどのように行うのですか?月の初めから月末までの日付範囲を指定します。PHP側で毎日ループしてデータをロードする代わりに、MySQL側でそれを行います。たとえば、クエリは次のようになります。

  SELECT *
  FROM Events_Table
  WHERE Ev_Date BETWEEN :startMonth AND :endMonth 
  (have extra query to load by days within given start and end month
   and have LIMIT 10 per day)

上記のクエリを完了できない場合、括弧内のテキストは有効なクエリで転送する必要があります。これにより、1日あたり10のイベントが選択され、31日あるため、約310のイベントが選択されます。

誰かがより良い解決策を持っているなら、助けてください。

4

1 に答える 1

1

1 か月あたり最大 10 個にしたい場合は、以下のように変更して、日をループするときに制限を減らします...

$currView == 'month') //curr view is the current view of the calendar
    {
        $start = $_GET['start']; //gets from the calendar usually start of month
        $end = $_GET['end']; //gets from calendar usually end of month
        //some array to store all events before using json_encode
        $limitEvents = array();
        $limit = 10;
        //loop through from start till end by 1 day incremental
        for ($i = $start; $i < $end; $i+=strtotime($i, "+1 day"))
        {
            //make the end of day to be the current day but 23:59:59
            $endOfDay = date('m/d/Y', $start);
            $endOfDay = strtotime($endOfDay . ' 23:59:59');
            //load the events from DB using date range which is 
            //1 day and limit of events
            if ($limit>0){ //if you want to have 10 in total add this
              $loaded = $this->loadDataFromDB($start, $endofDay, $limit);
              $limit -= count($loaded); //and this
            } //and this
            //merge the arrays
            array_merge($limitTasks, $loaded);
        }

そして、mysqlクエリが実際に取得する量を制限するために

SELECT *
  FROM Events_Table
  WHERE Ev_Date BETWEEN :startMonth AND :endMonth 
  LIMIT 10

それでもまだ遅い場合は、データベースをチェックして、フィールドの適切なインデックスを確認してください。where句で開始月と終了月を使用している場合、それぞれにインデックスを追加すると、クエリがはるかに高速になります

また、クエリの実行に何を使用しているかはわかりませんが、プレースホルダーを一重引用符で囲んでください。そうしないと、mysql インジェクションが発生する可能性があります。変数をエスケープするだけでは十分ではありません

于 2013-01-09T23:54:12.983 に答える