$_GET['id'] controleren
Via een $_GET['id'] wil ik een waarde ophalen uit me database, dit werkt wel. Nu is alleen het probleem dat als ik een id invul die niet bestaat in de database krijg ik een lege pagina. Graag zou ik dan een 404 pagina willen laten zien. Hoe kan ik de voor elkaar krijgen.
Onderstaande script gebruik ik nu.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
if(isset($_GET['id']) && is_numeric($_GET['id']))
{
$sql='
SELECT
*
FROM
news
WHERE
id = '.$_GET['id'].'
';
if (!($temp = mysql_query($sql, $connection)))
showerror();
while ($news= mysql_fetch_array($temp))
{
}
} else {
}
?>
if(isset($_GET['id']) && is_numeric($_GET['id']))
{
$sql='
SELECT
*
FROM
news
WHERE
id = '.$_GET['id'].'
';
if (!($temp = mysql_query($sql, $connection)))
showerror();
while ($news= mysql_fetch_array($temp))
{
}
} else {
}
?>
mysql_num_rows gebruiken of
Kijk ook eens hier: http://www.phphulp.nl/php/forum/topic/if-else-query-leeg-is/89181/last/
edit:
Frank zijn oplossing is beter, sorry! Maar mijn oplossing zou ik ook gebruiken omdat als een id wel een getal is maar in je database niet de record ervan bestaat je ook niet erg veel te zien krijgt.
Net zoals bij 'Bas D L': Lees misschien nog eens een MySQL tutorial door.. Je kan ook Kijk ook eens hier: http://www.phphulp.nl/php/forum/topic/if-else-query-leeg-is/89181/last/
edit:
Frank zijn oplossing is beter, sorry! Maar mijn oplossing zou ik ook gebruiken omdat als een id wel een getal is maar in je database niet de record ervan bestaat je ook niet erg veel te zien krijgt.
Gewijzigd op 10/02/2013 15:19:38 door Mebus Hackintosh
voor header() mag geen enkele output plaatsvinden anders krijg je een foutmelding.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
$id = 0;
if(isset($_GET['id']))
$id = intval($_GET['id']);
if($id > 0)
{
$sql='
SELECT
*
FROM
news
WHERE
id = '.$_GET['id'].'
';
if (!($temp = mysql_query($sql, $connection)))
showerror();
if(mysql_num_rows($temp) == 0)
header("HTTP/1.0 404 Not Found");
while ($news= mysql_fetch_array($temp))
{
}
} else {
header("HTTP/1.0 404 Not Found");
}
?>
$id = 0;
if(isset($_GET['id']))
$id = intval($_GET['id']);
if($id > 0)
{
$sql='
SELECT
*
FROM
news
WHERE
id = '.$_GET['id'].'
';
if (!($temp = mysql_query($sql, $connection)))
showerror();
if(mysql_num_rows($temp) == 0)
header("HTTP/1.0 404 Not Found");
while ($news= mysql_fetch_array($temp))
{
}
} else {
header("HTTP/1.0 404 Not Found");
}
?>
Gewijzigd op 10/02/2013 15:28:10 door Frank Nietbelangrijk
[url=http://www.homepage-maken.nl/htaccess/error-pages.php}KLIK[/url]
Ik zou het zo doen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php
function error($nummer)
{
if($nummer == 404)
{
header("Status: 404 Not Found");
}
}
if(isset($_GET['id']) AND is_int($_GET['id']))
{
$id = $_GET['id'];
$sql = '
SELECT
kolom, kolom, kolom
FROM
news
WHERE
id = ' . $_GET['id'] . ' ';
if( !($temp = mysql_query($sql, $connection)))
{
showerror();
}
$error = true;
while($news = mysql_fetch_array($temp))
{
// je eigen dingen
$error = false;
}
if($error == true)
{
error(404);
}
}
else
{
error(404);
}
?>
function error($nummer)
{
if($nummer == 404)
{
header("Status: 404 Not Found");
}
}
if(isset($_GET['id']) AND is_int($_GET['id']))
{
$id = $_GET['id'];
$sql = '
SELECT
kolom, kolom, kolom
FROM
news
WHERE
id = ' . $_GET['id'] . ' ';
if( !($temp = mysql_query($sql, $connection)))
{
showerror();
}
$error = true;
while($news = mysql_fetch_array($temp))
{
// je eigen dingen
$error = false;
}
if($error == true)
{
error(404);
}
}
else
{
error(404);
}
?>
Uiteraard zou je ook de andere nummers in kunnen zetten (500 etc).
Thanks voor alle tips! Hier kan ik wel wat mee :D
Toevoeging op 10/02/2013 15:31:21:
Michael, belangrijk is wel om intval te gebruiken omwille van de beveiliging
Eddy E op 10/02/2013 15:27:16:
Frank NietBelangrijk: en als je id=38245845345363442463523425264 invoert gaat hij toch gewoon lekker in de database op zoek en kom je dus niet bij de 404 uit.
Ik zou het zo doen:
Uiteraard zou je ook de andere nummers in kunnen zetten (500 etc).
Ik zou het zo doen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php
function error($nummer)
{
if($nummer == 404)
{
header("Status: 404 Not Found");
}
}
if(isset($_GET['id']) AND is_int($_GET['id']))
{
$id = $_GET['id'];
$sql = '
SELECT
kolom, kolom, kolom
FROM
news
WHERE
id = ' . $_GET['id'] . ' ';
if( !($temp = mysql_query($sql, $connection)))
{
showerror();
}
$error = true;
while($news = mysql_fetch_array($temp))
{
// je eigen dingen
$error = false;
}
if($error == true)
{
error(404);
}
}
else
{
error(404);
}
?>
function error($nummer)
{
if($nummer == 404)
{
header("Status: 404 Not Found");
}
}
if(isset($_GET['id']) AND is_int($_GET['id']))
{
$id = $_GET['id'];
$sql = '
SELECT
kolom, kolom, kolom
FROM
news
WHERE
id = ' . $_GET['id'] . ' ';
if( !($temp = mysql_query($sql, $connection)))
{
showerror();
}
$error = true;
while($news = mysql_fetch_array($temp))
{
// je eigen dingen
$error = false;
}
if($error == true)
{
error(404);
}
}
else
{
error(404);
}
?>
Uiteraard zou je ook de andere nummers in kunnen zetten (500 etc).
Gaat
wel werken? Want een $_GET is een string en niet een integer (heb zelf weleens problemen gehad met is_int omdat een variabele dus nog een string was en nog niet een integer).. Kan het ook fout hebben natuurijk.
En waarom weer een extra onnodige variabele gebruiken als je net zo goed mysql_num_rows kan gebruiken of
edit:
dit staat er op php.net/is_int
Quote:
Find whether the type of a variable is integer
edit:
Als iemand dit voor mij zou willen testen, dankje! Maar ik geloof dat een _GET variabele altijd automatisch een string is en niet een integer waardoor is_int dus zegt dat het geen integer is ondanks dat er een cijfer word meegestuurd..
Gewijzigd op 10/02/2013 15:37:15 door Mebus Hackintosh
een id is doorgaans (hoeft natuurlijk niet) numeriek. door intval te gebruiken of is_int voorkom je dat gebruikers een niet-numerieke waarde gaan ingeven. Het gevaar als je dit niet doet is sql-injection.
Mebus Hackintosh op 10/02/2013 15:32:10:
Nee, dat gaat inderdaad niet werken. Dan moet je is_numeric gebruiken. Die functie test of een string een numerieke waarde is (wat overigens ook floats etc kan zijn, maar dat is in dit geval niet belangrijk).
Frank Nietbelangrijk op 10/02/2013 15:38:45:
een id is doorgaans (hoeft natuurlijk niet) numeriek. door intval te gebruiken of is_int voorkom je dat gebruikers een niet-numerieke waarde gaan ingeven. Het gevaar als je dit niet doet is sql-injection.
Ja, zoek eens op google naar 'typecasten'... Een $_GET variabele is geloof ik altijd een string.. Dus om van die string een integer te maken moet je er (int) voorzetten.
En anders kan je ook nog altijd mysql_real_escape_string gebruiken. Dubbele controle is nooit erg!
edit:
voer andes eens dit stukje code uit:
Code (php)
Gewijzigd op 10/02/2013 15:45:24 door Mebus Hackintosh
Mebus, met intval() bereik je hetzelfde.
Frank Nietbelangrijk op 10/02/2013 15:44:53:
Mebus, met intval() bereik je hetzelfde.
Maar met is_int bereik je in dit geval dus helemaal niets....
Frank Nietbelangrijk op 10/02/2013 15:44:53:
Mebus, met intval() bereik je hetzelfde.
Ik heb het niet over jou intval maar over de functie is_int en hoe je die dus moet gebruiken. intval kon ik nog niet en zal vast en zeker wel werken..
Gewijzigd op 10/02/2013 15:47:08 door Mebus Hackintosh
Frank Nietbelangrijk op 10/02/2013 15:48:35:
Ja leuk.. Maar zoals sommige andere hier doen kijken ze op de documentatie website van php.net :-) Alsnog bedankt! Maar ik had hem al door hoor..