19. april 2010 - 02:00Der er
9 kommentarer og 1 løsning
fejl i sql
Hejsa jeg har et problem med følgende kode:
$result = mysql_query("SELECT k.*, DATE_FORMAT(k.dato, '%d/%m/%Y') as dag, TIME_FORMAT(k.dato, '%H-%m-%S') as klokken, COUNT(t.id) as antal FROM kalender k LEFT JOIN tilmeldinger t ON k.id = t.kursus_id WHERE k.tilmeldingsfrist > NOW() GROUP BY t.kursus_id"); while ($row = mysql_fetch_array($result)) { IF ($row['antal'] >= $row['hold_antal']) {$link = "kurset er fyldt";} ELSEIF ($row['status'] == "Aflyst") {$link = "";} ELSE {$link = "<a href='vis_kursus.php?id=" . $row['id'] . "'>læs mere</a>";}; echo "<tr> <td>" . $row['dag'] . "</td> <td>" . $row['klokken'] . "</td> <td>" . $row['type'] . "</td> <td>" . $row['status'] . "</td> <td>$link</td> <td>" . $row['antal'] . "/" . $row['hold_antal'] . "</td> </tr>"; }; ?>
problemet er at lige gyldigt hvad vises der kun 1 kursus selvom den burde vise alle der er åbne = tilmeldingsfrist EFTER NU > now(). nogen der kan se hvad jeg kan klokket i? på forhånd tak
Teknologi, AI og forretning er i centrum på Computerworlds Cloud og AI Festival i København d. 18. og 19. september. Se hele programmet for den store konference om strategisk brug af Cloud og AI på: www.cloud-festival.dk
hej Arne ja det er det. problemet er lige der omkring for da jeg vendte > til < viser den fint mine gamle kurser. det virker bare som om den kun viser kurser der har tilmeldte. kan du se hvad det er?
Forstaar jeg korrekt at dit centrale problem er at faa listet alle aabne kurser sammen med antal tilmeldinger til hvert kursus, inklusive nul-antal for de kurser der endnu ingen tilmeldinger har? I saa fald skal du GROUP BY k.id, ikke by t.kursusid. Proev i din mysql_query at aendre GROUP BY t.kursusid til GROUP BY k.id og se om du saa ikke kommer videre.
Desværre. det gjorde ingen forskel men rigtigt forstået. jeg ønsker at vise alle fremtidige kurser og deres tilmeldings-antal/ledige pladser. Det jeg tror er problemer er at flere af kurserne endnu ikke har noget tilmeldte og derfor ikke noget at "group by". så returnerer den 0 og vises derfor ikke. dog hvis kurset INDEN altså med en lavere kursus_id HAR tilmeldte, tages det tomme kursus med. Det virker sgu underligt.... hva?
Det er sikkert bare en slåfejl som det oftest er men jeg har efterhånden haft en del hoveder på denne og ingen har kunnet lure den endnu
Det forstaar jeg ikke. Meningen med LEFT JOIN er jo netop at den skal vise alle raekker i kalender uanset om der er tilsvarende raekker i tilmeldinger.
Du kunne jo proeve at teste selve queryen ved midlertidig at forenkle koden saaledes:
$result = mysql_query("SELECT k.id, COUNT(t.id) FROM kalender k LEFT JOIN tilmeldinger t ON k.id = t.kursus_id GROUP BY k.id") or die(mysql_error()); while ($row = mysql_fetch_array($result)) echo $row['id'] . " " . $row['antal'] . "<br/>";
Den skulle meget gerne give en liste af kursus id'er og antal tilmeldinger til hver, inklusiv 0 for kurser uden tilmelding. Hvis ikke saa maa der vaere noget underligt med tabellerne. Hvis du faar listen med kurser og tilmeldinger, inklusiv nul-tilmeldinger, saa maa problemet ligge et andet sted i queryen - kan der for eksempel alligevel vaere noget med datatypen af tilmeldingsfrist.
$result = mysql_query("SELECT k.id, COUNT(t.id) as antal FROM kalender k LEFT JOIN tilmeldinger t ON k.id = t.kursus_id GROUP BY k.id") or die(mysql_error()); while ($row = mysql_fetch_array($result)) echo $row['id'] . " " . $row['antal'] . "<br/>"; sådan ser ja. der manglede lige noget! :P
Den viser korrekt ja. hvad faaan er det så? jeg prøver lige at kigge i tabellen igen så
for pokker da. du klarede den sgu! problemet var så min group by der, som du gjorde, skulle pege på k.id og ikke t.id som min gjorde. nu virker det vist helt fint. mange tak for hjælpen. jeg er ked af at jeg var for nærig til at give mere end 30 points men jeg ved ikke hvordan jeg forhøjer det? smid mig et svar så får du points (hvis du er interesseret)
Jeg taenkte nok at det kunne ikke fejle. Saa gaa naeste skridt og proev om det er WHERE klausulen der er problemet:
$result = mysql_query("SELECT k.id, COUNT(t.id) as antal FROM kalender k LEFT JOIN tilmeldinger t ON k.id = t.kursus_id WHERE k.tilmeldingsfrist > NOW() GROUP BY k.id") or die(mysql_error()); while ($row = mysql_fetch_array($result)) echo $row['id'] . " " . $row['antal'] . "<br/>";
Hvis der er aabne kurser hvor der ingen tilmeldinger er saa skulle de komme frem som kurser med 0 antal. Hvis ikke, saa ligger problemet i WHERE klausulen og du maa kikke igen paa datatype og vaerdier af tilmeldingsfrist.
Hvis det gaar godt saa indsaetter du "DATE_FORMAT.....dag og ....klokken. Gaar det ogsaa godt saa maa problemet ligge i din php kode. Det kunne for eksempel vaere at navnet paa en af kolonnerne i tabellen ikke svarer til $row['type'] eller $row['status'] eller hvad.
Skridt for skridt kan du snaevre det ind til du finder hvor det gaar galt. Fortael mig hvordan det gaar.
$result = mysql_query("SELECT k.*, DATE_FORMAT(k.dato, '%d/%m/%Y') as dag, TIME_FORMAT(k.dato, '%H-%m-%S') as klokken, COUNT(t.id) as antal FROM kalender k LEFT JOIN tilmeldinger t ON k.id = t.kursus_id WHERE k.tilmeldingsfrist > NOW() GROUP BY k.id $sortby");
Det virker. jeg ændrede faktisk bare k.id i min gamle kode og alt andet fulgte med. jeg kan ikke se flere problemer så tak for det. vil du have points?
Det var godt vi fik det til at virke. Her er mit svar.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.