AllDecay
@AllDecay
Вечно отдыхающий.

Как сократить код?

Есть обработчик, который делает репосты ВК по запросу с сайта. Куча условий: Количество участников, проверка ссылок и т.д и т.п. Так вот, есть кусок кода, который должен проверить в бд наличие записи с id группы. Если записи нет - делаем репост, если есть - проверяем дату репоста (должна быть на 7 дней раньше, чем выполняется запрос. т.е репост одного паблика делаем раз в неделю).
<?
    $res = $dbh->query("SELECT COUNT(*) FROM `reposts` WHERE `id` = " . $postinfo[0]);
    if ($res->fetchColumn() == 0) {
        $wall = file_get_contents("https://api.vk.com/method/wall.repost?v=4.102&object=wall-" . $postinfo[0] . "_" . $postinfo[1] . "&group_id=100562658&access_token=" . $token);
        $wall = json_decode($wall);
        $response = $wall->response;
        $error = $wall->error;
            if ($response->success !== 1) {
                $stmt = $dbh->prepare("INSERT IGNORE INTO `reposts` (id, url, repost, date) VALUES (:id, :url, :repost, :date)");
                $stmt->bindParam(':id', $postinfo[0]);
                $stmt->bindParam(':url', $_POST["url"]);
                $stmt->bindParam(':repost', $_POST["post"]);
                $stmt->bindParam(':date', $currentTime->getTimestamp());
                $stmt->execute();
                $dbh = null;
                $link = "https://vk.com/wall" . $gid . "_" . $response->post_id;
                echo '<div class="alert alert-success" role="alert">Репост сделан! Проверить его наличие Вы можете по этой ссылке: <a href="' . $link . '" target="_blank">' . $link . '</a></div>';
            } else {
                echo '<div class="alert alert-danger" role="alert">Ошибка! Сервер ВКонтакте вернул ответ с кодом ошибки: ' . $error->error_code . '</div>';
                }
    } elseif ($res->fetchColumn() !== 0) {
        $qwe = $dbh->query("SELECT * FROM `reposts` WHERE `id` = " . $postinfo[0]);
        $row = $qwe->fetch();
        $repostTime = new DateTime(date('Y-m-d H:i:s', $row['date']));
        $interval = $currentTime->diff($repostTime);
            if ($interval->d >= 7) {
                $wall = file_get_contents("https://api.vk.com/method/wall.repost?v=4.102&object=wall-" . $postinfo[0] . "_" . $postinfo[1] . "&group_id=100562658&access_token=" . $token);
                $wall = json_decode($wall);
                $response = $wall->response;
                $error = $wall->error;
                    if ($response->success == 1) {
                        $stmt = $dbh->prepare("INSERT IGNORE INTO `reposts` (id, url, repost, date) VALUES (:id, :url, :repost, :date)");
                        $stmt->bindParam(':id', $postinfo[0]);
                        $stmt->bindParam(':url', $_POST["url"]);
                        $stmt->bindParam(':repost', $_POST["post"]);
                        $stmt->bindParam(':date', $currentTime->getTimestamp());
                        $stmt->execute();
                        $dbh = null;
                        $link = "https://vk.com/wall" . $gid . "_" . $response->post_id;
                        echo '<div class="alert alert-success" role="alert">Репост сделан! Проверить его наличие Вы можете по этой ссылке: <a href="' . $link . '" target="_blank">' . $link . '</a></div>';
                    } else {
                        echo '<div class="alert alert-danger" role="alert">Ошибка! Сервер ВКонтакте вернул ответ с кодом ошибки: ' . $error->error_code . '</div>';
                    }
            } else {
                $diff = date('d.m.Y H:i:s', $row['date'] + 604800);
                echo '<div class="alert alert-danger" role="alert">Сожалеем, но мы уже делали с Вами репост на этой неделе. Следующий репост будет возможен: ' . $diff . '</div>';
                }
    }
?>

Вопрос: как сократить эти действия и привести к минимальному количеству условий?
  • Вопрос задан
  • 250 просмотров
Решения вопроса 1
@seriogja
Здравствуйте.

Не совсем понятно зачем вы столько наворотили. Можно же вот так все организовать: все разбито по функциям. Никаких лишних телодвижений :)
Псевдокод:
public function addPost(...параметры...) {
    // добавляем запись о репосте в бд
}

public function post(...параметры...) {
    //постим запись
}

public function run(...параметры...) {
    // в условии сразу смотрите на дату последнего репоста
    $result = $dbh->prepare("SELECT COUNT(*) FROM `reposts` WHERE `id` = :id AND SELECT DATEDIFF (`date`, CURDATE()) > 7");
    $result->execute([
        ':id' => $id
    ]);
    $result = $result->fetchAll();

    //если записей нет - постим
    if (!count($result)) {
        $response = $this->post(...параметры...);
        if ($response->success !== 1) {
            $link = "https://vk.com/wall" . $gid . "_" . $response->post_id;
            $this->addPost(...параметры...);
            echo '<div class="alert alert-success" role="alert">Репост сделан! Проверить его наличие Вы можете по этой ссылке: <a href="' . $link . '" target="_blank">' . $link . '</a></div>';
        } else {
            echo '<div class="alert alert-danger" role="alert">Ошибка! Сервер ВКонтакте вернул ответ с кодом ошибки: ' . $response->error->error_code . '</div>';
        }
    } else {
        echo '<div class="alert alert-danger" role="alert">Сожалеем, но мы уже делали с Вами репост на этой неделе.</div>';
    }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы