2016-05-14 7 views
0

異なるSQLクエリに基づいてJSONを返すためのカスタムエンドポイントを作成しています - 私のアプリケーションから渡す複数のクエリ文字列に基づいてクエリが作成されます。私がやったことは、馬鹿げたことで、以下の結果が得られるのと同じ結果を得る良い方法があるかどうかを知りたがっています:PHPを使用してPDO sqlクエリにクエリ文字列を渡す

以下は、IF /クエリ文字列

if(isset($_GET['pt']) && !isset($_GET['c']) && !isset($_GET['sc']) && isset($_GET['size'])) { 

    $sql = "SELECT * 
    FROM product 
    INNER JOIN product_sizes 
    ON product.product_sku = product_sizes.affiliate_p_id 
    WHERE product_sizes.product_type IN (".$_GET['pt'].") 
    AND product_sizes.product_sizes IN (".$_GET['size'].") 
    GROUP BY product_sizes.affiliate_p_id 
    ORDER BY product.last_updated ASC 
    LIMIT 100"; 


} else { 

    $sql = "SELECT * 
    FROM product 
    INNER JOIN product_sizes 
    ON product.product_sku = product_sizes.affiliate_p_id 
    GROUP BY product_sizes.affiliate_p_id 
    ORDER BY product.last_updated ASC 
    LIMIT 100"; 

} 


$result = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC); 
$return = array(); 
foreach ($result as $row) { 
    $return[] = array( 
     'affiliate_p_id' => $row['affiliate_p_id'], 
     'affiliate_id' => $row['affiliate_id'], 
     'product_colours' => $row['product_colours'], 
     'product_sub_category' => $row['product_sub_category'], 
     'merchant_name' => $row['merchant_name'], 
     'product_type' => $row['product_type'], 
     'product_sizes' => $row['product_sizes'], 
     'product_name' => $row['product_name'], 
     'sale_price' => $row['sale_price'], 
     'rrp_price' => $row['rrp_price'], 
     'product_image' => $row['product_image'], 
     'product_slug' => $row['product_slug']   
    ); 
} 
$dbh = null;  

header('Content-type: application/json'); 
echo json_encode($return); 
+0

のような小さな部分にそれを破ることができますか?それを行うより良い方法があるかどうか議論したいだけですか? –

+0

まあまあです!それははるかに良い方法があるかどうかを知るだろう –

+1

この種の質問は、http://codereview.stackexchange.com/の典型的なものでなければならず、何らかの理由でSO –

答えて

1

あなたは期待どおりにコードが既に実行されている。この

$sql = 'SELECT * 
 
    FROM product 
 
    INNER JOIN product_sizes 
 
    ON product.product_sku = product_sizes.affiliate_p_id '; 
 
if(isset($_GET['pt']) && !isset($_GET['c']) && !isset($_GET['sc']) && isset($_GET['size'])) { 
 
$sql .= 
 
    " WHERE product_sizes.product_type IN :pt AND product_sizes.product_sizes IN = :size '; 
 
} 
 
$sql .= " GROUP BY product_sizes.affiliate_p_id 
 
    ORDER BY product.last_updated ASC 
 
    LIMIT 100"; 
 
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); 
 
if(isset($_GET['pt']) && !isset($_GET['c']) && !isset($_GET['sc']) && isset($_GET['size'])) { 
 
$sth->execute(array(':pt' => $_GET['pt'], ':size' => $_GET['size'])); 
 
} 
 
$result = $sth->fetchAll();

-1

dinamically SQL文字列を構築するために少しリファクタリングすることができます。

// SQL start common to all queries 
$sql = "SELECT * 
     FROM product 
     INNER JOIN product_sizes 
     ON product.product_sku = product_sizes.affiliate_p_id"; 

// Append query depending on conditions 
if(isset($_GET['pt']) && !isset($_GET['c']) && !isset($_GET['sc']) && isset($_GET['size'])) { 
    $sql .= " WHERE product_sizes.product_type IN (".$_GET['pt'].") 
       AND product_sizes.product_sizes IN (".$_GET['size'].")"; 
} 

// SQL end common to all queries 
$sql .= " GROUP BY product_sizes.affiliate_p_id 
      ORDER BY product.last_updated ASC 
      LIMIT 100"; 

このようにして、すべてのクエリに共通するSQL部分を繰り返すことはありません。

+0

ああ、私はこのコンセプトが本当に好きです!私は@Amit RayがSQLインジェクションに関して何を言ったかを調べます - このアプリは初期段階にありますので、私はちょうど概念化しており、これがビルドライブに到達しないことを保証します –

+0

@DanWhiteside間違いなくSQLインジェクションを修正する必要があります。準備されたステートメントはあなたの最善の策です。 – TheDrot

関連する問題