Реализовать нумерацию страниц как глобальную функцию - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь создать нумерацию страниц в SLIM PHP Framework API.Я заставил что-то работать, но это не совсем завершено.Эта нумерация страниц будет работать только в одном конкретном вызове API.Как бы я ни хотел реализовать это глобально при любом вызове.Есть ли способ связать их глобально?

$app->get('/api/art', function( Request $request, Response $response){
    $page = (isset($_GET['page']) && $_GET['page'] > 0) ? $_GET['page'] : 1;
    $limit = isset($_GET['limit']) ? $_GET['limit'] : 10;
    $offset = (--$page) * $limit; 

    $countsql = "SELECT COUNT(*) as COUNT FROM ART";
    $datasql = "SELECT * FROM ART LIMIT :limit OFFSET :offset";

    try{
      $db = new db();
      $db = $db->connect();
      $countQuery = $db->prepare( $countsql );
      $dataQuery = $db->prepare( $datasql );
      $dataQuery->bindParam(':limit', $limit, \PDO::PARAM_INT);
      $dataQuery->bindParam(':offset', $offset, \PDO::PARAM_INT);

      $dataQuery->execute();
      $countQuery->execute();
      $db = null;
      $count = $countQuery->fetch(PDO::FETCH_ASSOC); 
      $num = $count['COUNT'];
    if($num>0){
        $data_arr=array();
        $data_arr["records"]=array();
        while ($row = $dataQuery->fetch(PDO::FETCH_ASSOC)){
            extract($row);
            array_push($data_arr["records"], $row);
        }
        http_response_code(200);
        echo json_encode($data_arr);
    }

    else{
        http_response_code(404);
        echo json_encode(
            array("message" => "No products found.")
        );
    }
    }catch( PDOException $e ) {
        echo '{"error": {"msg": ' . $e->getMessage() . '}';
    } 
});

Это дает точные данные по мере необходимости, api/art?page=1&limit=100, но как мне реализовать их в другом API, таком как /api/form?page=1&limit=80, не повторяя ту же самую вещь снова иочередной раз.

Также, если есть лучший способ сделать это, пожалуйста, поделитесь.

1 Ответ

0 голосов
/ 25 сентября 2019

Если все вызовы API одинаковы и отличаются только конечной точкой и именем таблицы, вы можете просто получить имя таблицы с помощью параметра url следующим образом:

$app->get('/api/{table}', function( Request $request, Response $response, array $args){
    ...
    $datasql = "SELECT * FROM {$args['table'} LIMIT :limit OFFSET :offset";
    ...

ПРЕДУПРЕЖДЕНИЕ

Поскольку вы не можете передать имя таблицы в качестве параметра в подготовленном запросе, вам необходимо убедиться, что вы включили в белый список возможные имена таблиц, иначе этот подход является серьезной проблемой безопасности!

...