Производительность mySql PHP - выходные дни недели - PullRequest
0 голосов
/ 27 января 2012

Какой самый быстрый способ запустить это, чтобы проверить дни недели, когда бизнес закрыт?

$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 дня, который должен быть закрыт. Я создаю массив из 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";
}

Ответы [ 2 ]

2 голосов
/ 27 января 2012

Теперь я не совсем понимаю, что вы имеете в виду под словом "самый быстрый", поскольку на данном этапе это, вероятно, будут просто микрооптимизации, но вы могли бы организовать это намного лучше с точки зрения логики.

Я бы избавился от всех предложений if-else. Поскольку вас интересует, закрыт ли бизнес в определенный день, вы можете просто проверить этот день.

Тогда код будет выглядеть примерно так:

// 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, а не диапазон дат. Если это предположение верно, то finalDate не подходит для рассматриваемой переменной. Это должно быть названо что-то вроде dateToCheck или аналогичное.

0 голосов
/ 27 января 2012

Возможно, обратите внимание на функцию COUNT в MySQL .Может возвращать количество строк, соответствующее вашему запросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...