Avatar billede hcthorsen Praktikant
02. januar 2011 - 15:42 Der er 22 kommentarer og
1 løsning

Hjælp til søgning

Jeg har tidligere fået god hjælp til nedenstående søgning i http://www.eksperten.dk/spm/895200:

$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))

Er der nogen med et godt forslag?
02. januar 2011 - 17:04 #1
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);

Men maaske har jeg misforstaaet problemet.
Avatar billede johny Nybegynder
02. januar 2011 - 19:23 #2
Og så skal du også lige huske
$sslq .= " GROUP BY x";
i ovenstående løsning.
02. januar 2011 - 19:34 #3
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?
Avatar billede johny Nybegynder
02. januar 2011 - 20:51 #4
@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.
Avatar billede hcthorsen Praktikant
03. januar 2011 - 09:55 #5
Tak til begge. Havde nu godt luret at jeg skulle smække en "GROUP BY x" på:-) Tjah, det burde kunne virke. Prøver det lige af...
04. januar 2011 - 10:40 #6
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.
Avatar billede hcthorsen Praktikant
04. januar 2011 - 13:12 #7
Det virker ikke umiddelbart, men jeg har ikke haft så meget tid til at fifle med det, og får det heller ikke de næste dage. Vender stærkt tilbage:-)
Avatar billede arne_v Ekspert
06. januar 2011 - 15:54 #8
Proev denne soeslange af et udtryk:

IF(alder IS NULL OR $alder IS NULL,IF($alder IS NULL,true,false),alder<$alder)
07. januar 2011 - 10:42 #9
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

og her er test-koden:

<?
[connect til database og tabel]

if($_POST['submit'])
{
  $alder = $_POST['alder'];
  $sSql = "SELECT x, COUNT(x) AS antal FROM hcthorsen ";
  if(is_numeric($alder)) $sSql .= "WHERE alder < $alder ";
  $sSql .= "GROUP BY x";
  $result = mysql_query($sSql);
  while($row = mysql_fetch_array($result))
  {
    $x = $row['x'];
    $antal = $row['antal'];
    echo "$x = $antal <br>";
  }
}

echo "<form action='' method='post'>";
echo "<input type='text' name='alder'>";
echo "<input type='submit' name='submit'>";
echo "</form>";

mysql_close($link);
?>
07. januar 2011 - 10:48 #10
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.
Avatar billede hcthorsen Praktikant
07. januar 2011 - 16:26 #11
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.
07. januar 2011 - 18:54 #12
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.
07. januar 2011 - 18:54 #13
Jeg glemte at inkludere testtabellen:

x  alder 
      a NULL
      a 26
      a 27
      a 28
      b 28
      c NULL
      c 26
      c 27
      c 28
      c 29
      c 30
Avatar billede arne_v Ekspert
08. januar 2011 - 02:17 #14
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.
08. januar 2011 - 06:14 #15
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.
Avatar billede hcthorsen Praktikant
08. januar 2011 - 15:12 #16
Hej Christian_Belgien!

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:

if($_POST[alder]== ''){
  $alder = 'NULL';
}
else{
  $alder = "'".mysql_real_escape_string($_POST[alder])."'";
}


Jeg ved godt, at det sikkert er en grinagtig måde at gøre det på, men det er det eneste jeg har kunnet få til at virke.

Jeg kunne forestille mig at det er derfor din kode ikke virker hos mig?
08. januar 2011 - 17:14 #17
Jeg kikker, men det bliver nok foerst senere i aften eller maaske i morgen tidligt.
08. januar 2011 - 21:05 #18
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:

<form action='minFil.php' action='POST'>
<input type='text' name='alder'>
<input type='submit' name='submit'>
</form>

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

if($_POST[alder]== ''){
  $alder = 'NULL';
}
else{
  $alder = "'".mysql_real_escape_string($_POST[alder])."'";
}

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.
10. januar 2011 - 20:24 #19
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?
Avatar billede hcthorsen Praktikant
14. januar 2011 - 08:27 #20
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:-)
15. januar 2011 - 05:26 #21
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.
Avatar billede hcthorsen Praktikant
15. januar 2011 - 16:40 #22
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.

arne_v, sender du et svar?
Avatar billede arne_v Ekspert
16. januar 2011 - 03:07 #23
ok
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester