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.
Kód: [Vybrat]
    <?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>";
?>
 
« Poslední změna: 02. 05. 2016, 22:23:28 od Petr Krčmář »


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
Kód: [Vybrat]
<?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 »
... nebo použít PDO::quote

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