Vriendelijke urls met PHP probleem

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Peter Overdam

Peter Overdam

10/11/2012 14:25:05
Quote Anchor link
Beste mensen,

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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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');
 }


?>


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
 
PHP hulp

PHP hulp

21/11/2024 22:07:36
 
Obelix Idefix

Obelix Idefix

10/11/2012 15:10:19
Quote Anchor link
Peter Overdam op 10/11/2012 14:25:05:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
 // Get the needed data
 if(isset($_GET['id']) && isset($_GET['id'])){
    
?>

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
 
Peter Overdam

Peter Overdam

10/11/2012 15:25:51
Quote Anchor link
@Obelix en 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
 
Eddy E

Eddy E

10/11/2012 15:37:26
Quote Anchor link
Zet eens bovenaan je pagina:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo '<pre>'.print_r($_GET, true).'<pre>';
?>
 
Peter Overdam

Peter Overdam

10/11/2012 15:44:20
Quote Anchor link
@Eddy Erkelens,

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
 
Eddy E

Eddy E

10/11/2012 15:48:41
Quote Anchor link
Er komt dus wel iets door, namelijk ?page=account-activeren
De oplossing zit dus in je htaccess!

Helaas ben ik daar niet kundig genoeg in om dit even te fixen voor je.
 
Peter Overdam

Peter Overdam

10/11/2012 15:50:27
Quote Anchor link
@Eddy,

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.
 
Eddy E

Eddy E

10/11/2012 15:53:52
Quote Anchor link
Let wel: mocht het werken: je SQL is zo lek als een mandje:

?domain=1' OR 1 = '1; DELETE FROM companion&iets=anders

Dit zet alles eerst actief en verwijderd alles....
 
Peter Overdam

Peter Overdam

10/11/2012 15:58:43
Quote Anchor link
@Eddy,

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
 
Eddy E

Eddy E

10/11/2012 16:56:20
Quote Anchor link
Met mysqli_* kan je ook gewoon mysql_real_escape_string() doen hoor. Dat hoeft niet met prepared statements. Ik zie daar voor dit soort dingen ook echt geen voordeel van in.
Maar ik ben ook geen echte prof natuurlijk.

Trouwens: dit is handig:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
function mres($string)
 {

 return mysql_real_escape_string($string);
 }

?>


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().
 
Koen Vlaswinkel

Koen Vlaswinkel

10/11/2012 17:24:49
Quote Anchor link
Ik heb dit probleem ook gehad met mijn .htaccess (gister nog) en het bleek dat als je de url aanriep met &id= ipv ?id= dat hij het dan wel doet. (ik heb de oplossing nog niet gevonden)
Gewijzigd op 10/11/2012 17:26:13 door Koen Vlaswinkel
 
Eddy E

Eddy E

10/11/2012 18:15:23
Quote Anchor link
De eerste moet altijd een ? zijn, daarna &.
Zo te zien doet hij dat wel goed, maar 't is het proberen waard.
 
Koen Vlaswinkel

Koen Vlaswinkel

10/11/2012 18:18:12
Quote Anchor link
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.
Gewijzigd op 10/11/2012 18:18:49 door Koen Vlaswinkel
 
Peter Overdam

Peter Overdam

10/11/2012 18:25:28
Quote Anchor link
@Eddy
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.
 
Bart van der Veen

Bart van der Veen

10/11/2012 19:59:56
Quote Anchor link
RewriteRule ^(.*)/(.*)/(.*)/$ main.php?page=$1&id=2&serial=3

.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
 
Peter Overdam

Peter Overdam

10/11/2012 20:27:04
Quote Anchor link
@Koen Vlaswinkel,
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.
 
LEDfan nvt

LEDfan nvt

11/11/2012 10:58:32
Quote Anchor link
Ik heb ook een tijdje zitten knoeien met .htaccess. Ik ken niet al de mogelijkheden, maar weet wel ongeveer waardoor het bij mij niet werkte.

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)
PHP script in nieuw venster Selecteer het PHP script
1
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


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.
 
Jurgen B

Jurgen B

11/11/2012 11:05:51
Quote Anchor link
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.
 
Peter Overdam

Peter Overdam

11/11/2012 12:22:37
Quote Anchor link
@LEDFan & Jurgen B,
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
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.