$sSql = "SELECT x, COUNT(x) AS antal FROM erfaring AND IFNULL(alder,0) <= IFNULL($alder,IFNULL(alder,0)) GROUP BY x"; $query = mysqli_query ($conn,$sSql);
$alder kommer fra en select-box ($_POST[alder]). Det fungerer altså på den måde, at hvis man ikke vælger en alder i select-boxen, så sættes der ikke nogen begrænsning på alder i søgningen. Det virker perfekt.
Problemet er nu, at jeg af praktiske grunde ikke skal finde dem der har alder <= $alder, men kun <$alder. Problemet er, at jeg jo ikke bare kan ændre til
AND IFNULL(alder,0) < IFNULL($alder,IFNULL(alder,0))
Du vil altsaa have alt fra mysql tabellen 'erfaring' undtagen hvis $alder indeholder et tal i hvilket tilfaelde du vil have alt hvor alderen er mindre end $alder.
Hvis det er korrekt, saa synes det mig simplere at klare betingelsen i php inden du gaar ind i mysql. Jeg kunne taenke mig kode som foelger:
$ssql = "SELECT x, COUNT(x) AS antal FROM erfaring"; if(is_numeric($alder)) $ssql .= " WHERE alder < '$alder'"; $query = mysqli_query($ssql);
johny, ja - men hovedsagen er et php alternativ til det temmelig indviklede mysql udtryk (som hcthorsen i en anden traad kalder 'langhaaret.') Hvad mener du om php loesningen versus mysql loesningen?
@Christian: Det var også bare hvis OP (Original Poster) ikke fangede at det manglede, så ville han skulle bruge tid på at finde fejlen ved først at skrive her, og så få det påpeget efterfølgende. :)
Men ja, helt sikkert, vil da mene den løsning er noget pænere.
hcthorsen, naaede du at faa kikket paa det? Jeg er spaendt paa din reaktion. Mit indlaeg tog en anden retning end den maade spoergsmaalet lagde op til. Jeg er spaendt paa om det var til hjaelp eller om det fejlede.
Jeg er altid ivrig efter at laere, saa nu 'genbruger' jeg denne traad til selv at stille et spoergsmaal: arne_v, hvad er formaalet med soeslangen (og med soeslangerne i det oprindelige spoergsmaal og det tidligere spoergsmaal der er henvist til?) Hvis maalet er, ved hjaelp af php og mysql, at faa altal x hvis ingen alder er givet og ellers at faa antal x under den givne alder saa ser det for mig ud som om mit forslag ikke alene er tilstraekkelig men ogsaa det simpleste. Har jeg misforstaaet problemet? Eller er det et maal i sig selv at at koere queryen i mysql uden brug af php?
hcthorsen, du kan ikke umiddelbart faa det til at virke. Jeg testede lige ved at lave en test tabel 'hcthorsen' som jeg viser nedenstaaende og at skrive en test hjemmeside http://christianjorgensen.be/hcthorsen.php som du er velkommen til at afproeve og som, hvis $alder indeholder en alder, traekker data ud under denne alder og ellers traekker alle data ud. Hvis du ikke kan faa det til at virke i dit system saa fortael mere.
Her er test tabellen:
x alder a 25 a 26 a 27 a 28 b 28 c 25 c 26 c 27 c 28 c 29 c 30
Mit operativsystem er paa hollandsk - jeg ser nu at jeg ikke fik givet submit knappen en value, saa knappen fik en hollandsk tekst. Men den virker paa dansk.
Sagen er den, at de hits for hvem alder er NULL skal tages med hvis $alder er NULL, men ikke hvis $alder har en værdi. Meningen er den, at hvis man ikke vælger en alder via select-boxen, så ses der bort fra alder i søgningen (dem hvor alder ikke er tastet ind kommer også med). Når man derimod vælger en alder, så gider jeg ikke have dem med hvor alderen ikke er tastet ind. Det tager din kode ikke højde for. Det er også forsøgt efterspurgt i den gamle tråd.
arne_v, din kode virker perfekt. Sender du et svar:-) Tusind tak for hjælpen.
Du har ret i at jeg ikke taenkte paa at inkludere NULL vaerdier for alder i min test tabel. Det har jeg nu. Jaevnfoer tabellen nedenfor, hvis $alder ikke er et tal (uanset om det er NULL eller tomt eller en tekststreng) saa soeges for alle x. Resultatet skal vaere 4 a, 1 b, og 6 c. Hvis $alder er, for eksempel, 28, saa skal resultatet vaere 2 a (26 aar og 27 aar) ingen b, og to c (26 aar og 27 aar.) NULL aldre inkluderes naar $alder ikke er et tal og ignoreres naar $alder er et tal. Var det hvad du vil opnaa? I saafald giver min foreslaaede kode det korrekte resultat uden 'soeslange.' Gider du proeve det af paa http://christianjorgensen.be/hcthorsen.php ?
Jeg accepterer at du aabenbart foretraekker loesninger med 'soeslange' og det er da i orden, men jeg er, for min egen laereproces, nysgerrig med hensyn til hvad fordelen ved saadanne loesninger er.
Jeg kan heller ikke se nogen forskel i hvad der sker.
Jeg fokuserede udelukkende på betingelse ikke om man kunne undlade en betingelse.
Fordi det var problemet i det forrige spørgsmål.
Og jeg kom ind via dette, da poster sendte mig en PM.
Så der er ikke nogen speciel genial grund til at jeg valgte en lang betingelse fremfor ingen betingelse.
Konstruktionen med lange betingelser og brug af NULL for værdier der ikke skal testes på fremfor dynamisk at tilføje betingelser bruges faktisk en del i den virkelige verden.
Fordi hvis man skal bruge parameters (for at undgå at være sårbar overfor SQL injection), så er det faktisk nemmere på den måde.
Arne_v, ja, jeg focuserede paa problemet at teste for alder hvis en alder er opgivet og ellers ikke teste for alder, ikke paa metoden hvor spoergeren saa aabenbart foretraekker at holde det hele inde i queryen selv snarere end en test i php.
Et hovedformaal for mig med at deltage i spoergsmaal paa Eksperten er at udvide min viden og erfaring, og det har jeg saa gjort her. Der er elementer af din 'soeslange' som jeg ikke har moedt foer.
Jeg kan godt se at din løsning virker på dit egen hjemmeside, men det virker altså ikke når jeg sætter det ind hos mig. "alder" bliver bare ignoreret i søgningen. Jeg er bare en halvbelæst røver der i bund og grund ikke ved ret meget om programmering, men har fået noget til at virke ved at låne og læse lidt hist og pist (og med god hjælp fra jer flinke folk på www.eksperten.dk). Derfor kan jeg ikke gennemskue hvad der går galt med din kode i mit set-up, og jeg kan slet ikke beskrive problemet med fagtermer. Jeg ved bare at Arnes søslange virker perfekt.
Jeg bruger søgningen på en side hvor jeg laver nogle grafer og lagkagediagrammer ud fra min database. Man kan så sætte nogle begrænsninger på hvilke data der skal med, heraf er alder den ene. Man vælger disse begrænsninger via nogle select-boxe. Disse select-boxe bliver lavet ud fra en søgning i databasen (søgningen er vist i en forenklet form, hvor nogle søgepræmisser er udeladt):
$sSql = "SELECT funktion, COUNT(funktion) AS antal FROM x WHERE user = '$_SESSION[user]' AND funktion != '' AND IF(alder IS NULL OR $alder IS NULL,IF($alder IS NULL,true,false),alder<$alder) GROUP BY funktion"; $query = mysqli_query ($conn,$sSql); echo "Funktion: "; echo "<select name=funktion onchange='this.form.submit()'>"; echo "<option value=''>Alle</option>"; while($nt=mysqli_fetch_array($query)){ $sel = $nt['funktion']==$_POST['funktion'] ? ' selected="selected"' : ''; echo "<option value=$nt[funktion]".$sel.">$nt[funktion] ($nt[antal])</option>"; }
Siden bliver altså "genindlæst" når man vælger noget i en box, og de forskellige diagrammer bliver skabt ud fra de data man har valgt. For at det virker har jeg fundet ud af, at jeg må ha' følgende med (tilsvarende for hver selectbox) i starten af koden:
hcthorsen, saa er jeg med paa traaden igen, men hvad angaar din kode er jeg mere paa den end med paa den.
Foerst et spoergsmaal: hvad er nu meningen med dit indlaeg #16? Hvis du foretraekker loesninger med de lange betingelser og du har en loesning der virker perfekt saa er den vel hjemme. Eller er det saaledes at du ogsaa er interesseret i at kikke paa loesninger der, for at sige det ligeud, er simple nok til at jeg kan forstaa dem? I saa fald vil jeg godt vaere med, men saa maa jeg nok have lidt flere oplysninger for at kunne bidrage.
Lad mig foerst beskrive hvad jeg forstaar. Saa sige hvis jeg har misforstaaet. Jeg kan se tre faser i det du beskriver:
(1) Du har et eller andet sted, ikke vist i traaden, en html formular med, blandt andet, kode saa som:
Naar der klikkes paa submit knappen kaldes siden med den kode du viser i #16 og som jeg her kalder 'minFil.php'.
(2) Naar 'minFil.php' er kaldt saa dannes der en mysql_query som sendes til databasen. Resultatet gemmes i $query. Det er det der sker i de foerste fem linier af koden, altsaa fra "$sSql= "SELECT..... til og med $query = mysqli_query($conn, $sSql)".
(3) Resultatet i $query viser du saa paa siden, koden echo "Function:"... til }"
Det er i fase 2 min foreslaaede kode fejler, ikke sandt? Du proever at bruger inputtet fra fase 1 i min foreslaaede kode, men saa faar du ikke noget meningsfuldt resultat fra queryen. Og saa giver det ikke mening at at kikke paa fase 3 foer fase 2 er loest.
Sig mig, hvad er datatypen for `alder` i tabellen x. Hvis `alder` er en talvaerdi forstaar jeg ikke nytten af din kode
Det skulle vel vaere tilstraekkelig med "if(is_numeric($alder).." Hvis $alder er et tal, saa brug den i queryen, ellers ignorer $alder, uanset om $alder er tom, NULL, "klodshans" eller en musikfil. Men det er maaske noget som mere erfarne medlemmer kunne kommentere om.
Jeg foreslaar at du viser os databasetabellen, for eksempel create-scriptet og et par raekker data deri. Maaske ogsaa koden for den formular der sender $data til 'minFil.php' og koden i filen der staar forud for det du viser. Saa kan vi kikke videre.
hcthorsen, dit indlaeg #16 for to dage siden var rettet direkte til mig, saa jeg gik ud fra at du efterlyste min reaktion. Den fik du senere samme dag. Nu er jeg spaendt paa om du fik mit indlaeg og i saa fald om det var til nytte eller om jeg har misforstaaet det hele. Hvis det i mellemtiden er lige meget saa afslut og luk traaden. Hvis du lige for tiden har for travlt saa fortael fortael at du har det og hvornaar jeg cirka kan forvente din reaktion. Gider du?
Du må undskylde jeg ikke har svaret, men jeg har ikke gået nogen mail om at du havde svaret - der må være kuk i ekspertens mail-server. Jeg har ikke lige tid til at kigge på det nu, men vender tilbage. Du har ret i, at jeg har fundet en løsning der fungerer, så jeg har egentlig bare skrevet det seneste indlæg for at du måske ku' blive klogere på hvorfor det ikke virker hos mig. Som du skriver, så bruger du eksperten til selv at blive klogere. Jeg tænkte at det var det mindste jeg ku' gøre når nu du har brugt tid på at svare på mit indlæg:-)
Hvis #16 ikke var ment som et spoergsmaal saa skulle jeg ikke have lavet #18. Hvis du har en loesning du er tilfreds med, kan jeg saa bede dig faa traaden lukket? Jeg haaber du mener at "det mindste du kan goere" (naar vi nu er inde paa det) er ikke at lade mig blive haengende i et aabent spoergsmaal. Du bad i #11 et andet medlem om svar. Det kom ikke. Saa maa du jo selv oprette et svar og acceptere det.
Jeg prøvede egentlig at lukke den ned i #11, hvor jeg gav udtryk for at jeg havde fået det svar jeg søgte. Jeg er ked af hvis du har opfattet på anden vis.
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.