Placido
Наблюдаю
Есть текстовый онлайн-редактор с поддержкой замены текста по регулярному выражению. Выражения оформляются правилами, у каждого из правил есть своя группа, у группы правил есть своя категория. Применить можно как одно правило (=регулярное выражение), так и группу правил сразу. Обычно используется второй вариант (применение группы правил). Возникла необходимость подсчитать, сколько раз было применено то или иное правило (все случаи замены) и когда это было в последний раз, а потом занести эти данные в таблицу с полями `id`, ...(здесь много других полей)..., `used_at`, `times_used`. Можно, конечно, заносить в базу информацию после применения каждого отдельного правила, но если совпадений будет несколько сотен (вполне реальный случай), то будет и несколько сотен запросов (а также и несколько сотен обращений к базе) вида
Для этого при применении группы правил создается массив, в который заносится номер правила и количество применений. Массив выглядит следующим образом:
где 1, 2, 5 и 17 - номера правил (id правила в БД), 10, 13, 123 и 43 - количество совпадений этого правила (регулярного выражения).
Создал метод saveCount, в котором создается запрос вида
Все работает, но хотел бы услышать критику, может, можно сделать это проще или "правильнее". Заранее спасибо за комментарии.
Хотелось бы сделать это одним запросом после применения всех правил.'UPDATE `rules` SET `used_at` = NOW(), `times_used` = `times_used` + 1 WHERE `id` = номер правила;
Для этого при применении группы правил создается массив, в который заносится номер правила и количество применений. Массив выглядит следующим образом:
PHP:
$count = array(1 => 10, 2 =>13, 5 => 123, 17 => 43 и т.д.)
Создал метод saveCount, в котором создается запрос вида
Вот его код:'UPDATE `rules`
SET `used_at` = NOW(), `times_used` = `times_used` + CASE `id`
WHEN 1 THEN 10
WHEN 2 THEN 13
WHEN 5 THEN 123
WHEN 17 THEN 43
и т.д.
END
WHERE id IN(1, 2, 5, 17)
PHP:
public static function saveCount($count)
{
$length = count($count);
$case_thens = str_repeat("WHEN ? THEN ? ", $length);//формируется строка WHEN ? THEN ?
// ...
// WHEN ? THEN ?
$questionmarks = str_repeat("?,", $length - 1) . "?";//это вопросителные знаки - IN(?, ?, ?, ?)
$conn = Connection::getInstance();
$stmt = $conn->prepare(
'UPDATE `rules`
SET `used_at` = NOW(), `times_used` = `times_used` + CASE `id`
' . $case_thens . ' END
WHERE id IN(' . $questionmarks. ')');
$i = 1;
//Подставление значений в WHEN ? THEN ?
foreach ($count as $rule_id => $rule_count) {
$stmt->bindValue($i, $rule_id, PDO::PARAM_INT);
$i++;
$stmt->bindValue($i, $rule_count, PDO::PARAM_INT);
$i++;
}
//Подставление значений в IN(?, ?, ?, ?)
foreach ($count as $rule_id => $rule_count) {
$stmt->bindValue($i, $rule_id, PDO::PARAM_INT);
$i++;
}
$stmt->execute();
}