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

get parameters から順序付けオプションを試しています。誰か助けてもらえますか?

@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

variable という名前を付けたからかもしれません$sortが、 bind しようとしています$orderか?

これは、列名を準備済みステートメントにバインドできないためです。これらは、値とともに使用することのみを目的としています。

代わりに、事前に定義された一連のオプションを用意し、それらでソートする必要があります。実際の列名で直接並べ替える選択肢をユーザーに与えるべきではありません。

于 2012-09-25T14:30:34.963 に答える