Avatar billede dennism Nybegynder
31. juli 2003 - 14:12 Der er 15 kommentarer og
1 løsning

MySQL: Query - find alder

Jeg har via et andet spørgsmål her på eksperten fået denne kode, men jeg kan ikke få den til at virke! Den skulle gerne finde "users" fra tabellen hvor birthdate er imellem 15 og 17. Birthdate indeholder f.eks. "1987-01-23".

$_POST[agefrom] = 15;
$_POST[ageto] = 17;

$mysql = mysql_query("SELECT *, DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(birthdate, '%Y') - 
(DATE_FORMAT(CURDATE(), '%m-%d') > DATE_FORMAT(birthdate, '%m-%d')) AS age FROM users WHERE age BETWEEN $_POST[agefrom] AND $_POST[ageto]");

Jeg får følgende fejl:

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in search.php on line 498

Hvis der er problemer med min sætning, hvad gør jeg så for at udføre det jeg ønsker?
Avatar billede erikjacobsen Ekspert
31. juli 2003 - 14:54 #1
Prøv først selv:

$mysql = mysql_query("SELECT *, DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(birthdate, '%Y') -
(DATE_FORMAT(CURDATE(), '%m-%d') > DATE_FORMAT(birthdate, '%m-%d')) AS age FROM users WHERE age BETWEEN $_POST[agefrom] AND $_POST[ageto]") or die(mysql_error();
Avatar billede erikjacobsen Ekspert
31. juli 2003 - 14:55 #2
.... or die(mysql_error());

Jeg glemte lige en parentes
Avatar billede dennism Nybegynder
31. juli 2003 - 15:07 #3
Hmm.. Har nu fået en fejl lidt før i min kode! Der står der:

$num_mysql = mysql_num_rows(mysql_query("SELECT username, DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(birthdate, '%Y') - (DATE_FORMAT(CURDATE(), '%m-%d') > DATE_FORMAT(birthdate, '%m-%d')) AS age FROM users $search") or die(mysql_error());

Jeg får følgende besked:
Parse error: parse error, unexpected ';' in search.php on line 498

Hvorfor det?
Avatar billede erikjacobsen Ekspert
31. juli 2003 - 15:10 #4
Nå, ja, du gør 2 ting på een gang... prøv;

$num_mysql = mysql_num_rows(mysql_query("SELECT username, DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(birthdate, '%Y') - (DATE_FORMAT(CURDATE(), '%m-%d') > DATE_FORMAT(birthdate, '%m-%d')) AS age FROM users $search")  or die(mysql_error()));

Men ellers: lav de 2 ting på 2 linier.
Avatar billede dennism Nybegynder
31. juli 2003 - 15:13 #5
Hvad mener du med at lave dem på 2 linier?
Avatar billede dennism Nybegynder
31. juli 2003 - 15:14 #6
Oki.. Men whatever! Jeg får denne besked:
Unknown column 'age' in 'where clause'

Altså er age en ukendt "ting" i WHERE!
Avatar billede erikjacobsen Ekspert
31. juli 2003 - 15:15 #7
Prøv at udskifte ordet WHERE med HAVING ... og hvis ikke det virker: hvilken
mysql version bruger du?
Avatar billede erikjacobsen Ekspert
31. juli 2003 - 15:18 #8
2 linier:

  $mysql = mysql_query("....") or die(mysql_error());
  $num_mysql=mysql_num_rows($mysql);

Det er mere overskueligt end at prøve at skrive det på een linie
Avatar billede dennism Nybegynder
31. juli 2003 - 15:22 #9
Jeg prøver nu:

$num_mysql2 = mysql_num_rows(mysql_query("SELECT DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(birthdate, '%Y') - (DATE_FORMAT(CURDATE(), '%m-%d') > DATE_FORMAT(birthdate, '%m-%d')) AS age FROM users HAVING age BETWEEN 15 AND 17") or die(mysql_error()));

Det giver:

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in search.php on line 498

Jeg har: mysql-4.0.13-win
Avatar billede erikjacobsen Ekspert
31. juli 2003 - 15:28 #10
Øh, men det kan jo ikke lade sig gøre.... så ville den have udført die(...).
Hvad med de 2 linier? Synes du ikke det er bedre?
Avatar billede dennism Nybegynder
31. juli 2003 - 16:44 #11
Nu ser det ud til at virke, men der er stadig et problem!

Jeg har tre brugere i min database som alle er 16 år! 1987-01-23...

"HAVING age BETWEEN 16 AND 16" (alder fra 16 til 16) giver 0 brugere.
"HAVING age BETWEEN 15 AND 16" (alder fra 15 til 16) giver 3 brugere.

Hvad er fejlen?
Avatar billede dennism Nybegynder
31. juli 2003 - 19:13 #12
Hvis jeg printer age, får jeg alderen til at være 15, hvis fødselsdagsdatoen er 1987-01-23. Jeg har fødselsdag på den dato, og jeg er altså 16! Hvor i koden ligger fejlen?
Avatar billede erikjacobsen Ekspert
31. juli 2003 - 23:15 #13
Du skal muligvis erstattet > med >=
Avatar billede dennism Nybegynder
01. august 2003 - 10:00 #14
Jeg valgte at gøre sådan her istedet:
HAVING age >= $_POST[agefrom] AND age <= $_POST[ageto]

Iøvrigt har jeg i selectboxen, hvor man kan vælge alder fra, og alder til, følgende værdier:

Tekst:< 05 Værdi: 04
Tekst:05 Værdi: 05
Tekst:06 Værdi: 06
Tekst:07 Værdi: 07
Osv. op til:
Tekst:70 Værdi: 70
Tekst:70 < Værdi: 71

Sådan ser både min "agefrom" og "ageto" selectbox ud.

Før jeg så laver min query kører jeg dettte:

if ($_POST[agefrom] == 04) {
$_POST[agefrom] == "-1000000";
} elseif ($_POST[agefrom] == 71) {
$_POST[agefrom] == "1000000";
} elseif ($_POST[ageto] == 04) {
$_POST[ageto] == "-1000000";
} elseif ($_POST[ageto] == 71) {
$_POST[ageto] == "1000000";
}
$search = "$search HAVING age >= $_POST[agefrom] AND age <= $_POST[ageto]";

Kan det laves på en smartere måde?
Avatar billede erikjacobsen Ekspert
01. august 2003 - 10:03 #15
Du skulle jo nok
  $_POST[agefrom] = "-1000000";

Men hvad betyder dine sjove tal? Hvorfor ikke have de rigtige tal i
din select-box, så du ikke skal lave om på dem?
Avatar billede dennism Nybegynder
01. august 2003 - 10:04 #16
Dooh.. Den mulighed havde jeg slet ikke overvejet ;)
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
Computerworld tilbyder specialiserede kurser i database-management

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