Vriendelijke urls met PHP probleem
Ik ben sindskort begonnen met het gebruiken van vriendelijke urls wat ik mijzelf heb aangeleerd via een tutorial via phphulp.nl. Alleen nu is het probleem bij een script van mij dat hij bepaalde waardes die via de url meegestuurd worden niet worden opgepakt via $_GET[''].
Dit is het script
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
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
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// Get the needed data
if(isset($_GET['id']) && isset($_GET['id'])){
// Check Db for existance
$check_sql = 'SELECT * FROM companion WHERE id="'. $_GET['id'] . '" AND serial="'. $_GET['serial'] .'"';
$check_result = $mysqli -> query($check_sql);
$row_cnt = $check_result->num_rows;
if($row_cnt==true){
$sql = 'UPDATE companion SET active="1" WHERE id="'. $_GET['id'] .'"';
$result = $mysqli -> query($sql);
print('Uw account is geactiveerd');
} else {
print ('Verkeerde activatie gegevens, controleer de url in uw activatie mail.');
}
} else {
print('Er is iets niet goed gegaan neem contact op met de webmaster');
}
?>
error_reporting(E_ALL);
ini_set('display_errors', 1);
// Get the needed data
if(isset($_GET['id']) && isset($_GET['id'])){
// Check Db for existance
$check_sql = 'SELECT * FROM companion WHERE id="'. $_GET['id'] . '" AND serial="'. $_GET['serial'] .'"';
$check_result = $mysqli -> query($check_sql);
$row_cnt = $check_result->num_rows;
if($row_cnt==true){
$sql = 'UPDATE companion SET active="1" WHERE id="'. $_GET['id'] .'"';
$result = $mysqli -> query($sql);
print('Uw account is geactiveerd');
} else {
print ('Verkeerde activatie gegevens, controleer de url in uw activatie mail.');
}
} else {
print('Er is iets niet goed gegaan neem contact op met de webmaster');
}
?>
en zo ziet mijn .htaccess bestand eruit.
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]
RewriteEngine On
RewriteBase /
RewriteRule ^(.*)/(.*)/(.*)/$ main.php?page=$1&id=2&serial=3
RewriteRule ^(.*)/(.*)/$ main.php?page=$1&id=2
RewriteRule ^(.*)/$ main.php?page=$1
Ik heb diverse mogelijkheden al geprobeerd waaronder ook de eerste twee rewrite regels weghalen waardoor de link er als volgt uitkomt te zien.
http://www.domein.nl/page/?id&serial
alleen het script blijft aangeven "Er is iets niet goed gegaan neem contact op met de webmaster". Ook geeft hij geen fout reporting aan terwijl dat wel aanstaat.
Iemand een optie of een idee
Greetz
Peter
Peter Overdam op 10/11/2012 14:25:05:
Dit lijkt erop of je twee keer hetzelfde controleert? :s
Staat er wel wat in $_GET['id']?
Gewijzigd op 10/11/2012 15:11:44 door Obelix Idefix
Het isset probleem heb ik inmiddels veranderd de tweede isset moest serial worden thanx voor je oplettendheid maar hij blijft "Er is iets niet goed gegaan neem contact op met de webmaster" aangeven.
Als ik de URL als hieronder gebruik en ik bijvoorbeeld bij id 54 heb staand dan pakt de $_GET[''] hem niet
http://www.domein.nl/page/?id&serial
Als ik mijn .htaccess bestand van de server verwijder en ik gebruik de originele URL zoals hieronder:
http://www.domein.nl/main.php?page=home&id=54&serial=9876543
dan doet het script wel netjes zijn werk.
Heb de isset even verwijderd omdat ik van alles aan het proberen ben en nu geeft hij wel een fout aan alleen daar heb ik niet veel aan.
Notice: Undefined index: id in
Gewijzigd op 10/11/2012 15:33:50 door Peter Overdam
krijg de volgende output
Array
(
[page] => account-activeren
)
Er is iets niet goed gegaan neem contact op met de webmaster
En mijn url gebruik ik dan tijdelijk als volgt
http://www.domein.nl/account-activeren/?id=72&serial=9aIp14Ddbc2mgCJ5jEF06if3lNGeOnAMoP7LK8HhkB
De oplossing zit dus in je htaccess!
Helaas ben ik daar niet kundig genoeg in om dit even te fixen voor je.
Ik zelf ben ook geen held met .htaccess heb stappen op deze site gevolgd om het aan de praat te krijgen maar wordt er niet wijzer van. In ieder geval bedankt voor je hulp.
?domain=1' OR 1 = '1; DELETE FROM companion&iets=anders
Dit zet alles eerst actief en verwijderd alles....
Ik ben momenteel bezig om mezelf aan te leren om met veilige code te werken alleen hier en daar lukt het mij niet helemaal ik weet dat je mysql_real_escape_string moet gebruiken maar dat is weer verouderd omdat het nu op de mysqli methode moet en dat schijnt weer anders te wezen en ben daar nog niet helemaal uit hoe dat het beste en makkelijkste moet.
Greetz
Peter
Maar ik ben ook geen echte prof natuurlijk.
Trouwens: dit is handig:
Scheelt typewerk.
Regel: alles wat de gebruiker kan invoeren (zeg maar: alles...) moet je altijd even controleren.
Getallen (zonder decimaal) altijd met intval(), de rest (strings dus) met mres().
Gewijzigd op 10/11/2012 17:26:13 door Koen Vlaswinkel
Zo te zien doet hij dat wel goed, maar 't is het proberen waard.
http://www.domein.nl/page/?id&serial=9876543 door Apache wordt vertaald naar http://www.domein.nl/main.php?page=home?id=54&serial=9876543 waarin dus twee keer ? staat.
Ik bedoel eigenlijk dat de query params al beginnen in de .htaccess, wat betekent dat de url Gewijzigd op 10/11/2012 18:18:49 door Koen Vlaswinkel
Oké dat wist ik dus niet ik dacht namelijk dat je alles in mysqli moest schrijven als je het gebruikte. In ieder geval bedabkt voor de tips en het voorbeeld. Ik zal het vanavond gaan toepasen.
@Koen
Jou voorstel zal ik vanavond als ik thuis ben even proberen ik hou jullie op de hoogte maar ben bang dat het toch iets is in het .htaccess bestand.
Want als ik de volledige vriendelijke url zou gebruiken zonder de url met ? En & dan laad hij ook niet de pagina waar het script in staat en krijg ik mijn 404 pagina wat raar is want de page= wordt wel meegegestuurd in de url.
Toevoeging op 10/11/2012 18:27:46:
Koen Vlaswinkel op 10/11/2012 18:18:12:
Ik bedoel eigenlijk dat de query params al beginnen in de .htaccess, wat betekent dat de url http://www.domein.nl/page/?id&serial=9876543 door Apache wordt vertaald naar http://www.domein.nl/main.php?page=home?id=54&serial=9876543 waarin dus twee keer ? staat.
Daar heb je inderdaad gelijk in zal het vanavond thuis meteen uitproberen.
.httacces is niet zo mijn sterkte kan maar ik kan me zo voorstellen dat het:
RewriteRule ^(.*)/(.*)/(.*)/$ main.php?page=$1&id=$2&serial=$3
moet zijn. Met extra dollartekens bij de variabelen
ik kwam dit tegen op google
http://wettone.com/code/clean-urls
Ik heb het inmiddels geprobeerd door ? te vervangen met & en dit geeft helaas een 404 error dus dat is ook niet de oplossing.
@Bart van der Veen.
Ik heb de Rewrite Rule aangepast en helaas werkt dit ook niet.
Ik snap niet waar de fout zit zonder .htaccess werkt het script vlekkeloos en zodra ik die vriendelijke urls activeer dan werkt hij niet meer.
Ik zou om te beginnen de RewritEngine hellemaal bovenaan aan zetten. Je geeft immers al conditites op voordat hij aanstaat.
Ik zou de laatste slash bij elke rule weghalen. Deze slash zorgt ervoor dat je achter de url telkens / moet zetten. En er moeten bij de variable ook telkens een $ tekens bij.
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]
RewriteBase /
RewriteRule ^(.*)/(.*)/(.*)$ main.php?page=$1&id=$2&serial=$3
RewriteRule ^(.*)/(.*)$ main.php?page=$1&id=$2
RewriteRule ^(.*)$ main.php?page=$1
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]
RewriteBase /
RewriteRule ^(.*)/(.*)/(.*)$ main.php?page=$1&id=$2&serial=$3
RewriteRule ^(.*)/(.*)$ main.php?page=$1&id=$2
RewriteRule ^(.*)$ main.php?page=$1
Als het dan nog niet werkt, zou ik de RewriteBase / weghalen. Mijn htaccess code werkte niet toen dit er tussen stond. (Maar dat kon ook aan iets anders liggen)
Heb je zelf een server gemaakt? bv. met Linux, dan moet je htaccess nog toelaten op je directory's. Dit doe je in het configuratie bestand van je Apache. (Als je met Apache werkt) Vergeet ook niet de rewrite module nog laden. (sudo a2enmod rewrite) En kijk dan ook eens in de logs. Die vind je in /var/log/ en dan zoeken nar httpd of apache2.
Waarom zet je eigenlijk niet alle variablen met /'en achter de url? Dus zo: /page/id/serial. Lijkt me makkelijker en duidelijker.
Achter alle 3 je condities moet [L] komen te staan. Als ik mij niet vergis betekent dit Last, en stopt hij dus met matchen als de regel voldoet. Nu gaat hij dus door tot de laatste, ze matchen immers allemaal. Andere oplossing is de drie regels andersom zetten. De kortste eerst, langste laatst.
Heb de .htaccess aangepast en heb ook de [L] achter elke conditie geplaatst en hij doet het :-)
Kreeg de volgende melding.
Array
(
[page] => account-activeren
[id] => 84
[serial] => 01jgOMa4LPl5fh3DE2HnAbcC67eoIKpBdikFG8NJ9m
)
Uw account is geactiveerd
Allemaal heel erg bedankt voor alle hulp wat moeten we toch zonder phphulp.nl
Thanx
Peter