0

現在、次のように機能する簡単な検索クエリがあります。

$username = $_SESSION['username'];
$chosencategory = $_GET['category'];
$price = $_GET['price'];

$search = $_GET['search'];
$terms = explode(" ", $search);

if ($price && $chosencategory){
        $sql = "SELECT * FROM people WHERE MATCH (lname,fname) AGAINST (:search IN BOOLEAN MODE) AND category='$chosencategory' ORDER BY price $price";
    $q   = $conn->prepare($sql) or die("failed!");
    $q->bindValue(':search',"%".$search."%",PDO::PARAM_STR);
    $q->execute();
    }

たとえば、ユーザーが「最低から最高の価格を表示する」を選択すると、送信される値は$_GET['price']= ASCになりますが、これが結果を並べ替える安全な方法かどうかはわかりませんが、もっと良い方法はありますか?

また、ユーザーが「価格の最低から最高への表示」などの並べ替えオプションを選択した場合、ドロップダウンボックスは、「ASC」である$ _GET['price']に送信された値をエコーするため、この方法は最適ではありません。フォームが送信された後、ASCと表示されるドロップダウンボックス!

これが混乱している場合は申し訳ありませんが、これを再説明したい場合はコメントしてください。助けやアドバイスをいただければ幸いです。

4

1 に答える 1

3

値のバインドとSQLインジェクションに関連して、使用する前に値が設定されていることも確認する必要があります。有効error_reporting(E_ALL)にすると、未定義の警告がたくさん表示されます。ここにいくつかのヒント/変更があります:

<?php 
// Check and set username
$username = (isset($_SESSION['username']) ? $_SESSION['username'] : 'guest');

// Check and set category
$category = (!empty($_GET['category']) ? $_GET['category'] : null);

// Check and set search
if(!empty($_GET['search'])){
    $search = $_GET['search'];
    $terms  = explode(" ", $search);
}else{
    $search = null;
    $terms  = null;
}

// Check that $_GET['price'] is ASC if not set to DESC
// as static values its ok to directly put in the query 
if(isset($_GET['price']) && $_GET['price'] == 'ASC'){
    $price = 'ASC';
}else{
    $price = 'DESC';
}

if ($category !== null && $search !== null){

    $sql = "SELECT   *
            FROM     people
            WHERE    MATCH (lname,fname) AGAINST (:search IN BOOLEAN MODE)
            AND      category = :category
            ORDER BY price ".$price;

    $q = $conn->prepare($sql);
    // Bind the params to the placeholders
    $q->bindParam(':search', $search, PDO::PARAM_STR);
    $q->bindParam(':category', $category, PDO::PARAM_STR);
    $q->execute();
    // Get result
    $result = $q->fetchAll(PDO::FETCH_ASSOC);
}
?>
于 2012-09-18T14:30:14.853 に答える