【问题标题】:PDO - order by price ascending or descendingPDO - 按价格升序或降序排列
【发布时间】:2012-09-16 23:19:34
【问题描述】:

目前我有一个简单的搜索查询,其工作原理如下:

$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!

对不起,如果这令人困惑,如果您希望我重新解释这一点,请发表评论,非常感谢任何帮助或建议!

【问题讨论】:

  • 这种情况下order by只有两个值,为什么不硬编码呢? <option value="ASC" <?php if($_GET["price"] == "ASC") { echo " selected='selected'"; } ?>>Low to high</option> 或类似的东西。你也可以使用数组和循环来做同样的事情。
  • 完美!正是我需要的!谢谢你
  • 您为什么不准备所有值或至少检查 ASC/DESC?等
  • 您所做的事情不安全,如果您还没有被黑客入侵,那么您将会被黑客入侵!绑定所有值。您已经完成了 90% 的路程。
  • 感谢您的反馈!我将如何绑定其余的值?

标签: php mysql search pdo sql-order-by


【解决方案1】:

与你的值绑定和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);
}
?>

【讨论】:

  • 非常感谢!这非常有帮助,我正在尝试学习如何使用 PDO 进行更好的查询,但我总是对绑定感到困惑,因为有时它不起作用!只是一个简单的问题,为什么价格设置为 '.$price;'而不是 ':price',为什么不需要绑定该值?
  • 刚刚测试了您的代码,现在搜索实际上不起作用,您知道可能是什么问题吗?
  • 启用错误报告然后检查日志还启用 pdo 连接$conn-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 的错误报告并将其包围在 try catch 异常中。看着它应该可以工作,它很可能与查询有关。
猜你喜欢
  • 1970-01-01
  • 2013-08-15
  • 2018-04-25
  • 2011-08-25
  • 2018-03-18
  • 2018-05-03
  • 2013-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多