2

パラメータの動的セットによってクエリできるリソースを扱う RESTful API を構築する場合、データベースへのクエリを構築する最良の方法は何ですか?

リソースが本で、可能なパラメーターは次のとおりです。

author, year, publisher, pages, rating

また、次のような任意の数のパラメーターと任意の組み合わせを使用してクエリを作成できます。

/books?rating=2

また

/books?author=james&year=2001&rating=4

また

/books?year=2010&publisher=greatbooks&pages=100&rating=5

この動的なパラメータ セットをデータベース クエリに変換する良い方法は何ですか?

次のような if else ステートメントを大量に作成します。

if( isset($_GET['rating'] && isset($_GET['author']) ) {

    //Do query based on these parameters here...

}

また

if( isset($_GET['author'] && isset($_GET['year']) && isset($_GET['publisher']) ) {

    //Do query based on these parameters here...

}

等等等…

または、すべての変数を設定してから、次のようにクエリで「=」の代わりに LIKE を使用します。

if(!empty($_GET['author'])) {
    $author = $_GET['author'];
} else {
    $author = '%';
}

その後

SELECT * FROM books WHERE author LIKE $author ... and so on

または、これを処理する他の方法はありますか?

4

1 に答える 1

3

フィルタの可能な組み合わせごとに個別のクエリを作成するのではなく、単一のクエリを動的に作成してみてください。クエリ文字列で何かが要求されていない場合は、それについて心配する必要はありません。

たとえば(私はこれを自分で実行していませんが、少なくともあなたにアイデアを与えるはずです):

$sql = 'SELECT * FROM books';

// build an array of WHERE clauses depending on what is in the query string
$clauses = array();
$filters = array('author', 'year', 'publisher', 'pages', 'rating');
foreach ($filters as $filter) {
  if (array_key_exists($filter, $_GET) {
    $clauses[] = sprintf("%s = '%s'", $filter, mysqli_real_escape_string($_GET[$filter]);
  }
}

// if there are clauses, add them to the query
if (!empty($clauses)) {
  $sql .= sprintf(' WHERE %s', implode(' AND ', $clauses));
}

// Run the query....
于 2013-02-26T15:42:51.973 に答える