2
// url: http://localhost/asdf/?sort=credits


if(isset($_GET['sort'])){
    $sort = $_GET['sort'];
}

$statement = $db->prepare("SELECT * FROM myTable ORDER BY :sort");
$statement->bindParam(':sort', $sort, PDO::PARAM_STR, 8);

var_dump($statement);
//object(PDOStatement)[2] public 'queryString' => string 'SELECT * FROM table1 ORDER BY :sort' (length=36)

$statement->execute();

我正在尝试从获取参数中选择排序选项,有人可以帮我吗?

按照@Uchiha Madara 的建议进行更新,我创建了一些预定义的排序字符串

if(isset($_GET['sort'])){
    switch ($_GET['sort']){
        case 'val1':
            $sortName = 'val1';
            break;
        case 'val2':
            $sortName = 'val2';
            break;

        default:
            $sortName = false;
            break;
    }
}

if($sortname != false){
    // then prepare query
    $statement = $db->prepare("SELECT * FROM table1 ORDER BY ?");
    $statement->execute(array($sortName));
}

但结果仍然相同,订购选择被忽略

最后更新!

$sort = 'val1';

$orderList = array(
    'val1',
    'val2'
);

// then prepare query
$statement = $db->prepare("SELECT * FROM myTable ORDER BY $sort");
$statement->execute();

感谢@Madara Uchiha 和@Ray!

4

2 回答 2

3

见马德拉的回答

您不能绑定列。使用有效列的白名单数组进行排序(比较 $_GET 值)并将其替换到查询中:

$valid_cols = array('name', 'age');
$sort = 'default_sort_field';
if(isset($_GET['sort']) && in_array($_GET['sort'], $valid_cols)){
    $sort = $_GET['sort'];
}

$statement = $db->prepare("SELECT * FROM myTable ORDER BY $sort");
于 2012-09-25T14:29:56.537 回答
2

也许是因为您命名了变量$sort,但您正在尝试绑定$order

那是因为您不能将列名与准备好的语句绑定。它们仅用于与值一起使用。

相反,您应该做的是拥有一组预定义的选项,并按这些选项排序。您不应该让用户选择按真实列名直接排序。

于 2012-09-25T14:30:34.963 回答