2013-03-13 3 views
1

Когда я нажимаю ссылку «Имя» ниже, это не сортировка, и я не знаю, почему.Столбец PDO Сортировка не сортируется

if(isset($_GET['field'])) { 

    $orderby = $_GET['field']; 
$orderby2 = $_GET['sort']; 

}else{ 
$orderby = "id"; 
$orderby2 = "ASC"; 
} if($_GET['sort'] == "ASC") { 
    $sortby = "DESC"; 
}else{ 
    $sortby = "ASC"; 

} 

Ссылка рода:

<th style="text-align: center;padding:10px;white-space: nowrap;" width="auto" class="rounded-company" scope="col"><a href="dash.php?field=user_name&sort=<?php echo $sortby;?>">Username</a></th> 

if(isset($_REQUEST['txtKey'])) { 

    $con = "%".$_REQUEST['txtKey']."%"; 
} 

    $result = $db->dbh->prepare("SELECT * FROM ruj_users WHERE user_name like :textKey ORDER BY :order :order2"); 
    $result->bindValue(":textKey", isset($con) ? $con : null, PDO::PARAM_STR); 
    $result->bindParam(":order", $orderby, PDO::PARAM_STR); 
    $result->bindParam(":order2", $orderby2, PDO::PARAM_STR); 
    $result->execute(); 
    $result = $result->fetchAll(PDO::FETCH_ASSOC); 

    $result2 = $db->dbh->prepare("SELECT * FROM ruj_users WHERE user_name like :textKey ORDER BY :order :order2"); 
    $result->bindValue(":textKey", isset($con) ? $con : null, PDO::PARAM_STR); 
    $result->bindParam(":order", $orderby, PDO::PARAM_STR); 
    $result->bindParam(":order2", $orderby2, PDO::PARAM_STR); 
    $result2->execute(); 
    $resultCount = $result2->rowCount(); 

    if(isset($_REQUEST['txtKey']))$str='&field='.$_GET['field'].'&sort='.$_GET['sort']."&txtKey=".$_REQUEST['txtKey']; 

Пожалуйста, дайте мне знать, что я делаю или если я что-то отсутствует.

+1

имена столбцов (в том числе в ORDER BY пунктов) и имена таблиц не могут быть связаны –

+0

@MarkBaker вы можете привести пример, пожалуйста, –

+0

Вы можете только использовать '? 'Подставить значения, а не имена столбцов. Для этого вам нужно использовать интерполяцию строк или конкатенацию. – Barmar

ответ

2

Вы не можете использовать bindParam() для замены имен столбцов, только значений выражения. Таким образом, вы должны использовать интерполяцию строки:

$result = $db->dbh->prepare("SELECT * FROM ruj_users WHERE user_name like :textKey ORDER BY $orderby $orderby2); 

К сожалению, это открывает вам до SQL инъекций, так что вы должны проверить входы, прежде чем делать это. Например.

if (preg_match('/[^a-z0-1_]/i', $orderby)) { 
    // report invalid sort field 
} 
if (!preg_match('/^(asc|desc)$/i', $orderby2)) { 
    // report invalid sort direction 
} 
+0

Можете ли вы предоставить мне как это сделать? Я все еще участвую, и я не уверен, что вы имеете в виду. –

+0

См. Код проверки, добавленный в ответ. – Barmar

+0

sprint() - более чистый способ построения строки выбора; и предложение orderby все равно должно быть проверено против белого списка опций. –