2016-11-25 81 views
1

我想添加選項以選擇通過使用下拉列表來排列SELECT語句的內容。我以前工作的SELECT語句將從我的表中選擇數據,並按點排序。現在,我希望能夠通過點或目標,或協助訂購等等等等SELECT語句PDO將一個變量添加到ORDER BY子句

這裏是我以前的工作聲明:

$query = $db->prepare("SELECT player_stats.*, teams.* 
         FROM player_stats 
         LEFT JOIN teams ON player_stats.tid = teams.teamid 
         WHERE season = :season 
         ORDER BY points DESC 
         LIMIT 20"); 
$query->bindParam(':season', $season); 
$query->execute(); 
$result = $query->fetchAll(); 

以前的工作方式:

<form action= "<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="get" id="search"> 
    <select name='statsYear' id='statsYear' class='dropDown' onchange='this.form.submit()'> 
     <option <?php if (($_GET['statsYear'] == '20162017') || !isset($_GET['statsYear'])) { ?>selected="true" <?php }; ?>value="20162017">2016-2017</option> 
     <option <?php if ($_GET['statsYear'] == '20152016') { ?>selected="true" <?php }; ?>value="20152016">2015-2016</option> 
     <option <?php if ($_GET['statsYear'] == '20142015') { ?>selected="true" <?php }; ?>value="20142015">2014-2015</option> 
     <option <?php if ($_GET['statsYear'] == '20132014') { ?>selected="true" <?php }; ?>value="20132014">2013-2014</option> 
     <option <?php if ($_GET['statsYear'] == '20122013') { ?>selected="true" <?php }; ?>value="20122013">2012-2013</option> 
    </select> 
</form> 

這裏是我的新選擇STAGE給出了不正確的輸出。我將分享一個鏈接到不正確輸出以後:

$query = $db->prepare("SELECT player_stats.*, teams.* 
          FROM player_stats 
          LEFT JOIN teams ON player_stats.tid = teams.teamid 
          WHERE season = :season 
          ORDER BY :statstype DESC 
          LIMIT 20"); 
    $query->bindParam(':season', $season); 
    $query->bindParam(':statstype', $statsType); 
    $query->execute(); 
    $result = $query->fetchAll(); 
    echoTable($result); 

上面的查詢不承認新$statsType變量。這是我需要幫助的地方。下面是引用我的新形式和變量聲明:

if (isset($_GET['statsType'])) { 
    $statsType = $_GET['statsType']; 
} else {  
    $statsType = 'points' ; 
} 

<form action= "<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="get" id="search"> 
    <select name='statsYear' id='statsYear' class='dropDown' onchange='this.form.submit()'> 
     <option <?php if (($_GET['statsYear'] == '20162017') || !isset($_GET['statsYear'])) { ?>selected="true" <?php }; ?>value="20162017">2016-2017</option> 
     <option <?php if ($_GET['statsYear'] == '20152016') { ?>selected="true" <?php }; ?>value="20152016">2015-2016</option> 
     <option <?php if ($_GET['statsYear'] == '20142015') { ?>selected="true" <?php }; ?>value="20142015">2014-2015</option> 
     <option <?php if ($_GET['statsYear'] == '20132014') { ?>selected="true" <?php }; ?>value="20132014">2013-2014</option> 
     <option <?php if ($_GET['statsYear'] == '20122013') { ?>selected="true" <?php }; ?>value="20122013">2012-2013</option> 
    </select> 
     <select name="statsType" id="statsType" class="dropDown" onchange='this.form.submit()'> 
     <option <?php if ($_GET['statsType'] == 'points' || !isset($_GET['statsType'])) { ?>selected="true" <?php }; ?> value="points">Points</option> 
     <option <?php if ($_GET['statsType'] == 'goals') { ?>selected="true" <?php }; ?> value="goals">Goals</option> 
     <option <?php if ($_GET['statsType'] == 'assists') { ?>selected="true" <?php }; ?>value="assists">Assists</option> 
     <option <?php if (($_GET['statsType'] == 'pim')) { ?>selected="true" <?php }; ?>value="pim">PIM</option> 
     <option <?php if ($_GET['statsType'] == 'pm') { ?>selected="true" <?php }; ?>value="pm">+/-</option> 
     <option <?php if (($_GET['statsType'] == 'toi')) { ?>selected="true" <?php }; ?>value="toi">TOI</option> 
    </select> 
</form> 

這是查詢應該是什麼樣子,如果我在表單中選擇助攻:
correct output 這是實際的輸出:
http://sjsharktank.com/leaders.php?statsYear=20162017&statsType=assists

回答

1

你不能使用參數列..你應該使用(最終)字符串連接並建立SQL命令dinamically

但要小心的SQL注入

$query = $db->prepare("SELECT player_stats.*, teams.* 
          FROM player_stats 
          LEFT JOIN teams ON player_stats.tid = teams.teamid 
          WHERE season = :season 
          ORDER BY " . $statstype . " DESC 
          LIMIT 20"); 

如果你可以使用雙引號的嵌套報價限制使用送花兒給人同樣的

$query = $db->prepare('SELECT player_stats.*, teams.* 
          FROM player_stats 
          LEFT JOIN teams ON player_stats.tid = teams.teamid 
          WHERE season = :season 
          ORDER BY ' . $statstype . ' DESC 
          LIMIT 20'); 

你也可以用雙引號和PHP魔術行爲工作vars

$query = $db->prepare("SELECT player_stats.*, teams.* 
          FROM player_stats 
          LEFT JOIN teams ON player_stats.tid = teams.teamid 
          WHERE season = :season 
          ORDER BY $statstype DESC 
          LIMIT 20"); 
+0

我不得不添加單引號爲嵌套的原因,但這似乎並沒有改變任何東西。編輯:我刪除了「...」,它的工作原理,但現在我有整個SQL注入認爲你提到的問題。 –

+0

爲什麼你必須添加單引號?你可以肯定你在$ statstype中有一個正確的值。(試試var_dump($ statstype)。並且檢查最後的查詢命令var_dump($ query) – scaisEdge

+0

'ORDER BY $ statstype DESC'正在運行' –