ORDER BY in PDO
Ik wil een ORDER BY in mijn PHP PDO code plaatsen.
Maar ik lees eigenlijk her en der op internet dat dat niet zomaar kan.
Ik zou het met fetch() of fetchall() moeten doen, maar wat ik ook doe, ik hou een vreemde volgorde.
Ik wil ordenen op datum en dan op nummer.
maar binnen 1 datum zie ik het nummer aftellen van 11 naar 1 en dan van 12 optellen naar 20. Dit moet natuurlijk van 1 naar 20 of anders om zijn.
om mijn regels te tonen, heb ik de volgende code:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$sql_journaalposten = "SELECT * FROM tabel_journaalposten WHERE journaalposten_administratie=:journaalposten_administratie AND journaalposten_datum=:journaalposten_datum1";
$stmt_journaalposten = $dbh->prepare($sql_journaalposten);
$stmt_journaalposten->bindParam(':journaalposten_datum1',$datum1);
$stmt_journaalposten->bindParam(':journaalposten_administratie',$adm_id);
$stmt_journaalposten->execute();
?>
$sql_journaalposten = "SELECT * FROM tabel_journaalposten WHERE journaalposten_administratie=:journaalposten_administratie AND journaalposten_datum=:journaalposten_datum1";
$stmt_journaalposten = $dbh->prepare($sql_journaalposten);
$stmt_journaalposten->bindParam(':journaalposten_datum1',$datum1);
$stmt_journaalposten->bindParam(':journaalposten_administratie',$adm_id);
$stmt_journaalposten->execute();
?>
en een stuk verder op heb ik dan in het HTML gedeelte:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<table align="left" class="hovertabel">
<th>datum</th>
<th>nr.</th>
<th>inkomsten</th><th>uitgaven</th>
<?php
// de volgende regel geeft geen 1e record.
foreach($stmt_journaalposten->fetchall(PDO::FETCH_BOTH) as $record_journaalposten){
//$link="index.php?id=" . $record_journaalposten['journaalposten_administratie'];
echo "<tr><td>";
echo substr($record_journaalposten['journaalposten_datum'],8,2)."-".substr($record_journaalposten['journaalposten_datum'],5,2)."-".substr($record_journaalposten['journaalposten_datum'],0,4)."</td><td>";
echo $record_journaalposten['journaalposten_nummer']."\n</td><td>";
if ($record_journaalposten['journaalposten_inkomsten']) {
$journaalpostbedrag_debet = $record_journaalposten['journaalposten_bedrag'];
$journaalpostbedrag_credit = "";
} else {
$journaalpostbedrag_debet = "";
$journaalpostbedrag_credit = $record_journaalposten['journaalposten_bedrag'];
}
echo $journaalpostbedrag_debet."</td><td>";
echo $journaalpostbedrag_credit."</td><td>";
echo "</td></tr>";
}
?>
</table>
<th>datum</th>
<th>nr.</th>
<th>inkomsten</th><th>uitgaven</th>
<?php
// de volgende regel geeft geen 1e record.
foreach($stmt_journaalposten->fetchall(PDO::FETCH_BOTH) as $record_journaalposten){
//$link="index.php?id=" . $record_journaalposten['journaalposten_administratie'];
echo "<tr><td>";
echo substr($record_journaalposten['journaalposten_datum'],8,2)."-".substr($record_journaalposten['journaalposten_datum'],5,2)."-".substr($record_journaalposten['journaalposten_datum'],0,4)."</td><td>";
echo $record_journaalposten['journaalposten_nummer']."\n</td><td>";
if ($record_journaalposten['journaalposten_inkomsten']) {
$journaalpostbedrag_debet = $record_journaalposten['journaalposten_bedrag'];
$journaalpostbedrag_credit = "";
} else {
$journaalpostbedrag_debet = "";
$journaalpostbedrag_credit = $record_journaalposten['journaalposten_bedrag'];
}
echo $journaalpostbedrag_debet."</td><td>";
echo $journaalpostbedrag_credit."</td><td>";
echo "</td></tr>";
}
?>
</table>
Ik ben benieuwd wie me hierbij kan helpen.
Alvast bedankt.
Frits van Leeuwen
Gewijzigd op 12/10/2017 00:49:00 door - Ariën -
Wat zijn de typen van de kolommen waarop je probeert te sorteren?
Frits van Leeuwen op 12/10/2017 00:41:23:
Maar ik lees eigenlijk her en der op internet dat dat niet zomaar kan.
Er is geen enkele reden waarom dat niet zou kunnen.
Behalve als het kolomtype en/of de data daarin zich niet leent voor sortering.
Als je *datum* van het type DATETIME is moet je bij de ORDER BY date(*datum*) zetten, anders kijkt ie ook naar de tijd, en zal je sortering op "nummer" niet veel meer doen.
Als zo'n "nummer" een primaire sleutel met een AUTO_INCREMENT is, dan moet je niet sorteren op de datum en al helemaal niet met een datumfunctie, maar gewoon op de primaire sleutel zelf. ;-)
Ik doe het nu even uit mijn hoofd omdat ik niet thuis ben. En thuis heb ik alles bij de hand.
Het type is DATE(zonder de tijd er in) en INT. Daar naast heb ik ook een id die automatisch genummerd wordt, maar daar wil ik nu niets mee doen. Dit geldt ook voor een datestamp.
Mij is het niet duidelijk wanneer een kolom wel of niet geschikt zou zijn voor sortering. Ik dacht dat ik op alle kolommen kon sorteren. Alleen of dat dan vervolgens nuttig is, dat is een ander verhaal.
Maar je zou kunnen sorteren op het ID of de datum op de manier zoals je gewend bent
Gewijzigd op 12/10/2017 09:06:20 door Milo S
moeten kunnen doen?
Zeker!
Ik had het al op die manier geprobeerd, maar dat werkte niet. Ik ga het vanavond nog eens proberen.
Wel twee kanttekeningen:
#1
PDO zou moeite kunnen hebben met het opvragen van de grootte van de resultaatset, alsmede het "scrollen" door de records van deze resultaatset. Wat je je moet realiseren is dat PDO niet op voorhand geschikt / geconfigureerd is voor gebruik van een specifieke database. Dit doe je door het instellen van database-specifieke opties of attributen. Het is zeer aan te bevelen om zoveel mogelijk, zo niet alle, relevante opties expliciet in te stellen om op die manier wat meer zekerheid te hebben dat je database op een voorspelbare manier werkt. De leercurve van PDO zit niet zozeer in het handjevol classes dat je gebruikt, maar in de configuratie en werking van de database-specifieke drivers. Indien je enkel gebruik maakt van een MySQL-database zou ik gewoon MySQLi gebruiken omdat deze geschreven en geoptimaliseerd is voor gebruik van deze database.
#2
Beschouw de volgende getallen:
Sla je dit op in een numerieke kolom en sorteer je deze getallen vervolgens oplopend krijg je het volgende resultaat:
Echter, als je deze opslaat in een tekstuele kolom en je sorteert deze getallen vervolgens oplopend krijg je het volgende resultaat:
Dit komt omdat in het eerstgenoemde geval een numerieke sortering wordt gebruikt en in het tweede geval een alfabetische (of lexicografische) sortering wordt gebruikt.
Ik had voor PDO gekozen omdat ik ergens gelezen had dat mysql uit PHP7 zou wegvallen. En dat PDO meer zou kunnen dan mysqli. Ook het deel dat je eventueel een Access database kan aansturen sprak mij aan.
Het verschil tussen tekst en numeriek is mij bekend. Maar ik heb nu geen logica. Zie mijn eerste bericht.
Ik ga nu eerst nog eens de aanwijzing van Milo S proberen en laat dan weer van me horen. Misschien dat het me toch lukt.
Toevoeging op 12/10/2017 21:33:04:
In phpmyadmin lees ik dat ik date heb gekozen voor de journaalposten_datum en int(3) voor journaalposten_nummer
Waarom het eerder niet werkte weet ik niet, want nu doet hij het wel goed.
Bedankt voor het meedenken en de uitleg. ik heb er toch weer veel van geleerd.
Frits van Leeuwen op 12/10/2017 18:14:35:
Ik had voor PDO gekozen omdat ik ergens gelezen had dat mysql uit PHP7 zou wegvallen.
Dat klopt, de standaard MySQL driver (de verzameling mysql_* functies) is niet meer beschikbaar in PHP 7. Deze waren ook al ~10+ jaar verouderd ten opzichte van MySQLi. Dus hoog tijd dat dat oud grut niet meer meegeleverd wordt.
Frits van Leeuwen op 12/10/2017 18:14:35:
En dat PDO meer zou kunnen dan mysqli. Ook het deel dat je eventueel een Access database kan aansturen sprak mij aan.
PDO voorziet alleen in standaardisering van het praten met een database, de SQL-taal zelf die gesproken wordt is echter (redelijk) database-specifiek, verschillende dialecten per database-type moet je maar denken. Daarom is alles wat je in PDO doet niet standaard uitwisselbaar tussen verschillende database-typen (nog even los van alle data die daarin zit, die verhuist niet automagisch mee als je van database schakelt).
Daarnaast lijkt mij het willekeurig schakelen tussen databases niet iets wat je uit oogpunt van applicatie-design zou willen.
Dit argument ("ondersteunt" meerdere databases) is dus een non-argument dat geen praktische meerwaarde heeft.
Wederom, de leercurve zit in de database-specifieke drivers. Hier zul je je echt goed in moeten verdiepen voordat je met enige database aan de slag kunt. PDO zelf is simpel, dit is een verzameling van eenvoudige klasses. Het "venijn" zit em in de staart (de drivers).
Als je dan toch enkel van een MySQL-database gebruik maakt is er geen reden om niet van MySQLi gebruik te maken. Het vergt misschien wat meer discipline, maar werkt een stuk intuïtiever dan PDO in combinatie met de MySQL-driver voor PDO.
Gewijzigd op 13/10/2017 22:30:47 door Frits van Leeuwen