Filter v PHP nezobrazuje data

Otakar

Filter v PHP nezobrazuje data
« kdy: 02. 05. 2016, 13:49:36 »
Zdarec.

Chcel by som filtrovat/zoradit data v tabulke ale bohuzial neviem kde je chyba pretoze mi to nechce zoradovat tak ako chcem. Prve zoradenie je v pohode ale ak chcem napriklad podla ID alebo description nikdy mi to nezoraduje ako ma.
Pointa je jednoducha odoslam formular a podla toho co som vybral upravujem select.
    <?php
if (isset(
$_GET['sortby'])) {
if (($_GET['sortby']) == "ASC" ){
     
$sortbys = "ASC";
    }
else{
     
$sortbys = "DESC";
};
    }
else{
 $sortbys = "ASC";


};
if (isset($_GET['orderby'])) {
   
$orderbys = htmlspecialchars($_GET['orderby']);
 
try{
$query = $dbh->prepare("SELECT * FROM code ORDER BY '.$orderbys.' '.$sortbys.' ");
   
$query->execute();
   
$result = $query->fetchAll();
    }
catch(PDOException $e)
   {
   echo
$dbh . "<br>" . $e->getMessage();
   }
$dbh = null;
}
else
    {
try{
$query = $dbh->prepare("SELECT * FROM code ORDER BY id '.$sortbys.'");
   
$query->execute();
   
$result = $query->fetchAll();
 }
catch(PDOException $e)
   {
   echo
$dbh . "<br>" . $e->getMessage();
   }
$dbh = null;
   }


  echo
   
"<table class='table table-responsive'>
   <tr>
   <th>ID</th>
   <th>Title</th>
   <th>Description</th>
   <th>Name</th>
   <th>Code</th>
   
   </tr>"
   
;

   foreach(
$result as $row)
   {
 echo
"<tr>";
 echo
"<td>" . $row['id'] . "</td>";
 echo
"<td>" . $row['title'] . "</td>";
 echo
"<td>" . $row['description'] . "</td>";
 echo
"<td>" . $row['name'] . "</td>";  
 echo
"<td>" . $row['code'] . "</td>";

}

 echo
"</tr>";
 echo
"</table>";
?> 


Mirek

Re:Filter v PHP nezobrazuje data
« Odpověď #1 kdy: 03. 05. 2016, 09:16:00 »
Proč v tom dotazu máš '.

Kit

Re:Filter v PHP nezobrazuje data
« Odpověď #2 kdy: 03. 05. 2016, 09:59:47 »
Je to tím, že název sloupce máš mezi apostrofy a tečkami. Databáze tomu nerozumí.

Ta funkce htmlspecialchars() je tam chybně. Před SQL injection neochrání.

Ronon Dex

Re:Filter v PHP nezobrazuje data
« Odpověď #3 kdy: 03. 05. 2016, 13:40:45 »

  • mix uvozovek a apostrofu => chyba v SQL dotazu; začal jsi uvozovkami a pak uvnitř použil tečku a apostrofy
  • nevystavuj názvy sloupců na veřejnosti, htmlspecialchars tě neochrání před SQL injection; pokud nelze použít "?" (a to pro ORDER BY nelze), tak se můžeš chránit mapováním hodnoty v parametru na skutečný název sloupce nebo použít PDO::quote
<?php
// Don't expose the table fields to public but map parameter value to field name
$sortingOn = array('aaa' => 'field_aaa', 'zzz' => 'field_zzz');

// Default direction is ascending
$direction = (isset($_GET['sortby']) && $_GET['sortby'] == 'DESC') ? 'DESC' : 'ASC';

// Map parameter to field, sort by id if not specified the valid one
$sortParam = isset($_GET['orderby']) ? $_GET['orderby'] : null;
$sortField = isset($sortingOn[$sortParam]) ? $sortingOn[$sortParam] : 'id';

try {
 
// $query = $dbh->prepare("SELECT * FROM code ORDER BY $sortField $direction");
 // ... or ...
 
$query = $dbh->prepare('SELECT * FROM code ORDER BY ' . $sortField . '  ' . $direction);
}

Kit

Re:Filter v PHP nezobrazuje data
« Odpověď #4 kdy: 03. 05. 2016, 14:10:11 »
Citace od: Ronon Dex kdy 03. 05. 2016, 13:40:45
... nebo použít PDO::quote

PDO::quote() bohužel výsledek zabalí do apostrofů, takže se pro tento účel nedá použít.