ORDER BY in PDO

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Frits van Leeuwen

Frits van Leeuwen

12/10/2017 00:41:23
Quote Anchor link
Hallo allemaal,

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)
PHP script in nieuw venster Selecteer het PHP script
1
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();
?>


en een stuk verder op heb ik dan in het HTML gedeelte:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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>


Ik ben benieuwd wie me hierbij kan helpen.

Alvast bedankt.
Frits van Leeuwen
Gewijzigd op 12/10/2017 00:49:00 door - Ariën -
 
PHP hulp

PHP hulp

19/01/2022 15:31:16
 
Ben van Velzen

Ben van Velzen

12/10/2017 01:08:35
Quote Anchor link
Wat zijn de typen van de kolommen waarop je probeert te sorteren?
 
Thomas van den Heuvel

Thomas van den Heuvel

12/10/2017 04:50:47
Quote Anchor link
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.
 
Rob Doemaarwat

Rob Doemaarwat

12/10/2017 06:46:10
Quote Anchor link
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.
 
Ward van der Put
Moderator

Ward van der Put

12/10/2017 08:09:56
Quote Anchor link
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. ;-)
 
Frits van Leeuwen

Frits van Leeuwen

12/10/2017 08:50:37
Quote Anchor link
Bedankt allemaal voor de reacties.
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.
 
Milo S

Milo S

12/10/2017 09:06:02
Quote Anchor link
Een datum sla je op in een kolom met een DATE als kolom eigenschap, niet een Integer. Anders kun je het niet gebruiken als datum het is dan immers gewoon een getal.

Maar je zou kunnen sorteren op het ID of de datum op de manier zoals je gewend bent

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$sql
= "SELECT field1, field2 FROM table ORDER BY field1 ASC";
?>
Gewijzigd op 12/10/2017 09:06:20 door Milo S
 
Frits van Leeuwen

Frits van Leeuwen

12/10/2017 09:25:30
Quote Anchor link
Dat snap ik, maar als field1 DATE is en fielfd2 INTEGER, dan zou ik toch
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$sql
= "SELECT field1, field2 FROM table ORDER BY field1 ASC, field2 DESC";
?>

moeten kunnen doen?
 
Milo S

Milo S

12/10/2017 09:53:51
Quote Anchor link
Zeker!
 
Frits van Leeuwen

Frits van Leeuwen

12/10/2017 10:19:23
Quote Anchor link
Ik had het al op die manier geprobeerd, maar dat werkte niet. Ik ga het vanavond nog eens proberen.
 
Thomas van den Heuvel

Thomas van den Heuvel

12/10/2017 16:31:17
Quote Anchor link
Zonder een indicatie van de kolomtypen en een sample van data die niet goed gesorteerd zou worden wordt het lastig om de vinger op de zere plek te leggen.

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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
312
58

Sla je dit op in een numerieke kolom en sorteer je deze getallen vervolgens oplopend krijg je het volgende resultaat:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
58
312

Echter, als je deze opslaat in een tekstuele kolom en je sorteert deze getallen vervolgens oplopend krijg je het volgende resultaat:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
312
4
58

Dit komt omdat in het eerstgenoemde geval een numerieke sortering wordt gebruikt en in het tweede geval een alfabetische (of lexicografische) sortering wordt gebruikt.
 
Frits van Leeuwen

Frits van Leeuwen

12/10/2017 18:14:35
Quote Anchor link
Bedankt voor het advies. Ik ga eens kijken wat ik er mee kan.
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.
 
Thomas van den Heuvel

Thomas van den Heuvel

13/10/2017 03:58:46
Quote Anchor link
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.
 
Frits van Leeuwen

Frits van Leeuwen

13/10/2017 22:29:59
Quote Anchor link
Bedankt voor de uitleg. Ik kan me er wel in vinden. Ik ga kijken hoe of dat ik mijn programma om kan bouwen naar MYSQLi. Toch weer een hoop geleerd. Bedankt
Gewijzigd op 13/10/2017 22:30:47 door Frits van Leeuwen
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.