PHP/MYSQL Sortiert ausgeben Problem
lska
- php
0 Encoder0 1UnitedPower0 MudGuard
Ich habe folgenden Code
if (isset($_GET["sort"])) {
switch ($_GET["sort"]){
case "1":
$sort = "topics.datestamp";
case "2":
$sort = "topics.rating";
}}else{$sort = "topics.datestamp";}
$con=mysqli_connect("localhost","root","","data");
$abfrage = "SELECT * FROM topics ORDER BY $sort LIMIT 0, 10";
$res = mysqli_query($con,$abfrage);
while($row = mysqli_fetch_array($res))
{
echo $row["headline"];
echo "<br>";
echo $row["description"];
echo "<br>";
echo "<br>";
echo "<br>";
}
Wenn man die Seite mit "?sort`=1" aufruft, soll aus der datenbank die neuesten 10 einträge erscheinen, bei "?sort=2" die bekanntesten 10 (sortiert nach der Spalte rating [int]). Allerdings funktioniert das nicht. Warum??
Schau dir das SQL an und probier aus was dabei als Antwort kommt. Dann weißt du was die Datenbank da wirklich tut.
Bist du sicher dass 1 und 2 wirklich die gewünschten Spalten sind? Ich würd die Spalten lieber einzeln aufzählen.
Meine Herren!
Ich habe folgenden Code
switch ($_GET["sort"]){
case "1":
$sort = "topics.datestamp";
case "2":
$sort = "topics.rating";
}
> Allerdings funktioniert das nicht. Warum??
Eine bessere Fehlerbeschreibung hätte dich vermutlich schon selbst auf die Ursache stoßen können. Ich meine eine Fehlerbeschreibung à la "Mein Programm verhält sich scheinbar so, als ob immer der zweite Fall der switch-Kontrollstruktur eintritt."
`break;`{:.language-php}
--
“All right, then, I'll go to hell.” – Huck Finn
Hi,
Ich meine eine Fehlerbeschreibung à la "Mein Programm verhält sich scheinbar so, als ob immer der zweite Fall der switch-Kontrollstruktur eintritt."
break;
ist m.E. ein Designfehler vieler Programmiersprachen.
In fast allen Fällen, wenn Code hinter dem Case vorhanden ist, soll der Code des/der nächsten case(s) nicht ausgeführt werden.
Es wäre also wesentlich weniger fehleranfällig gewesen, wenn das Break implizit gesetzt würde, es sei denn, man markiert per fallthrough die Tatsache, daß wirklich der nächste case ausgeführt werden soll.
Ich würde statt
switch(x)
{
case 1:
case 2:
echo "1 oder 2";
break;
case 3:
echo "3";
break;
case 4:
echo "4";
case 5:
echo "4 oder 5";
break;
}
sowas vorziehen:
switch(x)
{
case 1, 2: //für mehrere Fälle der gleiche Code ==> die Fälle kommasepariert auflisten
echo "1 oder 2";
case 3:
echo "3";
case 4:
echo "4";
fallthrough; //hier der Sonderfall, Code des nächsten Case auch ausführen
case 5:
echo "4 oder 5";
}
Aber leider ist diese m.E. wesentlich weniger fehleranfällige Variante in keiner mir bekannten Sprache (und schon gar nicht in den von mir benutzten Sprachen) implementiert.
Statt "fallthrough" könnte auch "next" oder ähnliches verwendet werden ...
cu,
Andreas
Meine Herren!
break;
ist m.E. ein Designfehler vieler Programmiersprachen.
Mit der Meinung stehst du nicht alleine da. Code-Quality-Tools wie JSLint (für JavaScript) können so konfiguriert werden, dass sie switch-Kontrollstrukturen nicht akzeptieren. Häufig ist es auch Konvention, dass Fälle, die ineinander fallen mit einem Kommentar //falls into
gekennzeichnet werden und sonst davon ausgegangen wird, dass es ein Fehler ist.