Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Otakar 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>";
?>
-
Proč v tom dotazu máš '.
-
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í.
-
- 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);
}
-
... nebo použít PDO::quote
PDO::quote() bohužel výsledek zabalí do apostrofů, takže se pro tento účel nedá použít.