Avatar billede mpj_86 Nybegynder
04. august 2006 - 12:07 Der er 19 kommentarer og
2 løsninger

Må kun være et tal.

Hej

Hvad er det bedste at bruge, når man kun vil have at $_GET['id']  er et tal?

is_numeric($_GET['id']) eller intval($_GET['id']) eller en helt anden?
Avatar billede miqe Nybegynder
04. august 2006 - 12:27 #1
is_numeric() tester bare om det er et tal.
intval() konverterer.

$id = intval($_GET['id']);
Avatar billede erikjacobsen Ekspert
04. august 2006 - 12:27 #2
Det kommer vel an på hvad du vil definere som et tal. Hvilke af følgende skal accepteres eller forkastes?

  2  -1  2.03  2,02  2e10  2,3e1    2.4e5  1212312312323912371236125371253712365423
Avatar billede miqe Nybegynder
04. august 2006 - 12:29 #3
$id = intval($_GET['id'],16); //For hexadecimal streng
Avatar billede miqe Nybegynder
04. august 2006 - 12:34 #4
Jeg gik ud fra at mpj_86 skulle bruge en integer, da han skal bruge det som ID.
Avatar billede mpj_86 Nybegynder
04. august 2006 - 12:47 #5
Id kommer fra MySQL: `id` int(11) NOT NULL auto_increment,
Avatar billede erikjacobsen Ekspert
04. august 2006 - 12:54 #6
Så vil jeg bruge en

  if (preg_match('/^\d+$/',$_GET['id'])) {
      print "ok";
  } else {
      print "nix";
  }
Avatar billede mpj_86 Nybegynder
04. august 2006 - 13:44 #7
Det virker ikke: $id = preg_match('/^\d+$/',$_GET['id']);

Den viser id 1 selvom at adressen er: index.php?id=2
Avatar billede erikjacobsen Ekspert
04. august 2006 - 13:45 #8
Det er heller ikke det jeg skriver.
Avatar billede mpj_86 Nybegynder
04. august 2006 - 13:48 #9
Jeg skal bruge den på denne måde: http://www.hot-cars.dk/kategori.php?id=1
Avatar billede erikjacobsen Ekspert
04. august 2006 - 13:53 #10
Ja, det er vel klart nok. Og jeg viser dig noget, der kan afgøre om det er et "tal", dvs. et antal cifre, så man ikke kan putte noget snavs ind den vej. Hvad er problemet?
Avatar billede miqe Nybegynder
04. august 2006 - 14:08 #11
Du skal ikke sætte $id=preg_match

Gør f.eks. sådan:
  if (preg_match('/^\d+$/',$_GET['id'],$id_array)) {
      $id = $id_array[0][0];
  } else {
      $id = NULL;
      exit;
  }
Avatar billede erikjacobsen Ekspert
04. august 2006 - 14:12 #12
Det er nu rigelig med

  if (preg_match('/^\d+$/',$_GET['id'])) {
      $id = $_GET['id'];
  } else {
    ....

men spørgeren skal vel lige afgøre hvad der skal ske, hvis der ikke står et "tal".
Avatar billede miqe Nybegynder
04. august 2006 - 14:58 #13
Jeg fornemmede det var der du ville hen Erik.
Helt enig i at det er gangske fornuftigt.
Var dog ikke helt sikker på om preg_match fik strippet noget, så jeg ville bare spille mine kort sikkert ved at pille data ud fra resultatet. ;-)

mpj_86:
Går ud fa dit problem viser sig ved en MySQL fejlmeddelelse!?
Er du sikker på at dit query ikke skriver $id i stedet for indholdet af $id?
$query = mysql_query ("SELECT * FROM forum_kategori WHERE id = '$id'")
vil jeg personligt nok rette til:
$query = mysql_query ("SELECT * FROM forum_kategori WHERE id = '".$id."'")
for at være på den sikre side.
Dermed burde det heller ikke være et større problem om $id er af typen tal eller tekst, da den alligevel bliver konverteret til tekst i dit query.
...med mindre du altså skal bruge $id i andre funktioner, hvor det bliver nødt til at være en integer.
Det er stadigt fornuftigt at køre preg_match for at forhindre at underlige tegn vil lave underlige fejl i dit query (SQL-safe query).

Kort sagt:
Benyt Eriks eksempel med preg_match() og put mit eksempel med intval() ved succes i if-sætningen. Ved error kan du vælge at skrive en besked, lade være med at foretage dig noget eller noget helt tredje.
Avatar billede mpj_86 Nybegynder
04. august 2006 - 16:45 #14
Jeg har lavet om på http://www.hot-cars.dk/kategori.php?id=1, er det lavet på den "rigtige" måde?

miqe: På hvilken måde kan jeg bruge den du lavede med intval()?
Avatar billede miqe Nybegynder
04. august 2006 - 17:23 #15
Eksemplet i dit link ser godt ud nu.
Du kan skrive $id = intval($_GET['id']);
i stedet for $id = $_GET['id'];
vis du skal bruge den som integer.
Avatar billede mpj_86 Nybegynder
04. august 2006 - 17:34 #16
Kan du ikke forklare mig helt præcist hvad intval() gør?

Søger den ikke for at det kun kan indeholde et tal og ikke f.eks q12q
Avatar billede erikjacobsen Ekspert
04. august 2006 - 18:35 #17
Jamen, hvad vil du have der skal ske, hvis den ikke indeholder et tak, men fx. q12q? Der er ingen der kan sørge for at $_GET['id'] ikke indeholder andet en et "tal", så det er helt op til dig hvad der skal ske.
Avatar billede mpj_86 Nybegynder
04. august 2006 - 19:06 #18
Så kunne man vel gøre sådan her?

if (preg_match('/^\d+$/',is_numeric($_GET['id']))) {
    $id = $_GET['id'];
} else {
    echo '<b>ID er ikke angivet eller også er ID ikke et tal!</b>';
    exit;
}
Avatar billede erikjacobsen Ekspert
04. august 2006 - 19:40 #19
Hvis det er det, der skal ske, så er der vel ikke mere i det.
Dine SQL-sætninger var forøvrigt fine nok inden miqes ændringer.
Avatar billede mpj_86 Nybegynder
04. august 2006 - 19:46 #20
Oki, tak for hjælpen smid et svar så kan du og miqe dele..
Avatar billede erikjacobsen Ekspert
04. august 2006 - 20:25 #21
Jeg samler slet ikke på point, tak.
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