从$ _get绑定PDO mysql参数不起作用

时间:2012-09-25 14:28:31

标签: php binding get pdo parameter-passing

// 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();

我尝试从get参数中获取订购选项,任何人都可以帮助我吗?

更新 根据@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!

2 个答案:

答案 0 :(得分:3)

参见Madra的answer

您无法绑定列。使用有效列的白名单数组进行排序(将$ _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");

答案 1 :(得分:2)

也许是因为你将变量$sort命名为,但是你正试图绑定$order

那是因为您无法使用预准备语句绑定列名。它们只是用于价值观。

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