2012-09-16 42 views
0

目前我有一個簡單的搜索查詢,其工作原理如下:PDO - 按價格升序或降序

$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,但我不確定這是否是安全排序結果的方式,有沒有人有更好的方法?

此方法不是最好的,因爲當用戶選擇排序選項時,例如「顯示價格從最低到最高」,下拉框會迴應已發送到$ _GET ['price']的值,即「 ASC「,所以在下拉框中它會在表單發送後讀取ASC!

對不起,如果這是混亂請評論如果你想我重新解釋這一點,任何幫助或建議非常感謝!

+2

在這種情況下,只有兩個值的順序,做爲什麼不硬編碼他們? (選項值=「ASC」<?php if($ _ GET [「price」] ==「ASC」){echo「selected ='selected'」; }?>>從低到高'或者沿着這些線。你可以使用數組和循環來做同樣的事情。 –

+0

完美!正是我需要的! thankyou – neeko

+0

爲什麼你沒有準備好所有的價值觀,或者至少在那裏檢查ASC/DESC? ect –

回答

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); 
} 
?> 
+0

謝謝你!這是非常有用的,即時通訊嘗試學習如何使用PDO製作更好的查詢,但我總是對綁定感到困惑,因爲有時它不起作用!只是一個簡單的問題,爲什麼價格被設定爲'。$ price'而不是':價格'以及這個價值怎麼不需要被束縛? – neeko

+0

只是測試了你的代碼,搜索實際上現在不工作,你知道可能是什麼問題嗎? – neeko

+1

啓用錯誤報告,然後檢查日誌也使錯誤的PDO連接'$ conn->的setAttribute的報告(PDO :: ATTR_ERRMODE,PDO :: ERRMODE_EXCEPTION);'和圍繞着它在try catch異常。看着它應該可以工作,它最有可能與查詢有關。 –