2017-02-07 4 views
1

私はMySQLとPHPの初心者です。forloopのMySQLでデータベースからデータを取得

日付範囲(1日目から2日目、2日目から3日目など)にデータを取得するコードは次のとおりです。

function getData($query) { 
    global $connect; 
    $result = mysqli_query($connect, $query); 
    if (!$result) { 
     echo 'MySQL Error: '.mysqli_error($connect); 
     die(); 
    } 
    return mysqli_fetch_assoc($result); 
} 

$dayZero = date_create('2017-01-21'); 
$dayToday = date_create('Y-m-d'); 
$diff = date_diff($dayZero, $dayToday)->format('%a'); 

for ($i = 0; $i < $diff; ++$i) { 
    $start[$i] = date('Y-m-d', date_format($dayZero, 'U') + (24*60*60)*($i)); 
    $end[$i] = date('Y-m-d', date_format($dayZero, 'U') + (24*60*60)*($i+1)); 
    $days[$i] = getData('SELECT count(*) AS "b" FROM `table_name` WHERE `timestamp` BETWEEN "'.$start[$i].'" AND "'.$end[$i].'"')['b']; 
} 

コードは期待通りに機能しますが、動作は非常に遅いです。私の推測は、ループするたびにデータベースをチェックする必要があるからです。

もっと速く走らせる方法はありますか?または私は作ることができる最適化はありますか?

+3

タイムスタンプの計算をスキップして、 'timestamp BETWEEN '2017-01-21' AND '2017-01-22' '(単なる例)を使用することができます。また、クエリを再確認してください。有効に見えません。 – Raptor

+0

指定した期間内に行数を取得しようとしていますか? –

+0

@ Marc-AntoineParent私は2017-01-21から始まる毎日の行の数を取得しようとしています。 –

答えて

1

はい!素晴らしい質問。以前のようにクエリを実行することができますが、より良い選択肢はプリペアドステートメントを使用することです。これは、プリペアドステートメントにクエリを分離し、それの変数は、ここを参照してください:

http://www.w3schools.com/php/php_mysql_prepared_statements.asp

実際の文またはクエリをサーバ1時間に送信されます。この後、サーバーは変数の入力を待機します。

これは、サーバーがパフォーマンスを大幅に向上させるためにキャッシュを利用できるパフォーマンスアプリケーション(自分のものなど)に最適です。これは、サーバが注入攻撃から保護されている安全なアプリケーションにとっても好ましい方法です。

最後に、SQLクエリを最適化する方法がたくさんありますが、これは単なる1つの方法です。あなたは本当にいつも準備されたステートメントを使用するべきです。

関連する問題