2012-01-27 9 views
-1

ビジネスが終了した曜日をチェックするためにこれを実行する最も速い方法は何ですか?ここでパフォーマンスmySql PHP - 週の休業日

$closingDaysCheck = mysql_query("SELECT * FROM businessClosingDays WHERE Bid='$Bid' LIMIT 1", $con); 

if($closingDaysCheck) { 
    if(mysql_num_rows($closingDaysCheck) >0) { 
     while ($closed = mysql_fetch_assoc($closingDaysCheck)) { 
      if((date("w", $finalDate) == 0) && ($closed[0] != 0)) { // SUNDAY 
       $active = 'inactive'; 
      } else if((date("w", $finalDate) == 6) && ($closed[6] != 0)) { // SATURDAY 
       $active = 'inactive'; 
      } else if((date("w", $finalDate) == 5) && ($closed[5] != 0)) { // FRIDAY 
       $active = 'inactive'; 
      } else if((date("w", $finalDate) == 4) && ($closed[4] != 0)) { // THRUSDAY 
       $active = 'inactive'; 
      } else if((date("w", $finalDate) == 3) && ($closed[3] != 0)) { // WEDNESDAY 
       $active = 'inactive'; 
      } else if((date("w", $finalDate) == 2) && ($closed[2] != 0)) { // TUESDAY 
       $active = 'inactive'; 
      } else if((date("w", $finalDate) == 1) && ($closed[1] != 0)) { // MONDAY 
       $active = 'inactive'; 
      } else { 
       $active = 'active'; 
      } 
     } 
    } 
} 

は、データベース、最終日は日曜日で、それが閉じています:

CREATE TABLE `businessClosingDays` (
    `Bid` varchar(40) NOT NULL, 
    `1` tinyint(1) NOT NULL, 
    `2` tinyint(1) NOT NULL, 
    `3` tinyint(1) NOT NULL, 
    `4` tinyint(1) NOT NULL, 
    `5` tinyint(1) NOT NULL, 
    `6` tinyint(1) NOT NULL, 
    `0` tinyint(1) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `businessClosingDays` VALUES('9', 0, 0, 0, 0, 0, 0, 1); 

パトリック、私はあなたのアドバイス、次のそれをテストしてきました。 最終的には、1ヶ月のすべての日をチェックする必要があります。 私は1日でテストしましたが、これは終了する必要があります。 私はmysqlから配列を作成します。 そして、その日付の曜日が配列内にあるかどうかをチェックします。何らかの理由で動作しません。 私は何が間違っていますか?

$dateToCheck = 1327791600; // timestamp 

$result = mysql_query("SELECT * FROM businessClosingDays WHERE Bid = '9'"); 
while ($closedDays = mysql_fetch_array($result, MYSQL_NUM)) { 
echo $closedDays[0], $closedDays[1], $closedDays[2], $closedDays[3], $closedDays[4], $closedDays[5], $closedDays[6]; 
} 

if (in_array(date("w", $dateToCheck), $closedDays)) { 
echo "in it"; 
} else { 
echo "not"; 
} 
+0

変数$ finalDateの内容を教えてください。 – zaf

+0

こんにちはザフ、申し訳ありませんが、$ finaldateは毎月の日です。基本的に、このスクリプトはjavascript PopUp Calendarを構築します。そして、毎月の日が月曜日か火曜日かどうかを確認するために、例のように日曜日が閉じられると仮定します(したがって、データベースの1)。 PopUpの毎日は「非アクティブ」になります。 @zaf – Sebastian

+0

-1理由なしで「最速の方法」を求めるため –

答えて

0

多分、MySQLのCOUNT functionを見てください。クエリに一致する行数を返すことができます。

+0

ありがとうOrolin、私はちょうど上記の2つの説明をしました、実際には、何日が非アクティブであるかを知る必要はありませんが、それ以来、私はポップアップカレンダーベース結果にこのようにうまく動作しますが、うまくいきません; o)@Orolin – Sebastian

2

ここでは、おそらくちょうどマイクロオプティマイゼーションになるので、「最速」とは何を意味するのか分かりませんが、論理的にはそれをもっと整理することができます。

私はすべてのif-else節を取り除きます。あなたはその日にビジネスが閉鎖されているかどうかに関心があるので、その日だけチェックすることができます。

その後コードは次のようになります:つまり、私たちは店が指定した日に開かれているかどうかにのみ関心があることを前提としてい$finalDateのない範囲:

// Remember to escape your queries to prevent SQL-injection! 
$query = sprintf (
    'SELECT * 
    FROM businessClosingDays 
    WHERE Bid='%s' 
    LIMIT 1' 
    mysql_real_escape_string($Bid, $con) 
); 
$closingDaysCheck = mysql_query($query, $con); 
if($closingDaysCheck) { 
    // We only need to calculate this once, not in multiple if-else clauses 
    $finalWeekday = date("w", $finalDate); 

    // Default is that the store is open, right? And a value of 1 
    //means it's closed: 
    $active = 'active'; 

    // Try to fetch the result. Since we use LIMIT 1, we can have 
    // at most 1 row, so get rid of the while-loop. 
    $closedAt = mysql_fetch_assoc($closingDaysCheck); 

    // Now, see if we have any information of when the store is closed 
    // and if we do and the store is closed on this day, change the 
    // value to 'inactive' 
    if(!empty($closedAt) && $closedAt[$finalWeekday] == 1) { 
     $active = 'inactive'; 
    } 
} 

仮定日付。この仮定が当てはまる場合は、finalDateは問題の変数の適切な名前ではありません。それはdateToCheckまたは類似の行に沿って何かに命名されるべきです。

+0

ありがとう、Patrick、申し訳ありませんが、私は実際には月全体に行っています。トップ上のZafへの説明を参照してください。o)@PatrikAkerstrand – Sebastian

+0

また、ビジネスが1日以上で終了する可能性がありますので、しばらく時間がかかるか、週末のすべての配列でforeachを作成してください。 – Sebastian

+0

私は1つの日付でテストしましたが、最終的には1か月に渡る必要がありました。私は配列を作成し、日付が配列内にあるかどうかをチェックします。しかし、動作していないようです。私は間違って何をしていますか? – Sebastian

関連する問題