Avatar billede jdjensen Juniormester
26. januar 2012 - 12:57 Der er 24 kommentarer og
1 løsning

Formular skifter url til ../index.php ved submit

Hej,

Jeg har en formular der giver mig lidt problemer i forhold til Google Analytics. Når jeg klikker på submit sender den en email til mig og ændrer derefter URL'en fra domain.dk til domain.dk/index.php hvilket giver mig nogle kunstige sidevisninger. Formularen skal helst fungere så url'en forbliver uændret (altså uden index.php tilføjelsen) og bekræftelsen blot vises på samme side.

Formularen:

<?php
if(!isset($_POST['submit']))
{
?>
   
<form class="form" action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post">
<fieldset>
   
<input type="text" name="fullname" id="name" class="text" value="Navn" title="Navn">
<input type="text" name="phone" id="phone" class="text" value="Tlf. nr." title="Tlf. nr.">
<input type="text" name="emailaddress" id="emailaddress" class="text" value="Email" title="Email">
<input type="text" name="website" id="website" class="text" value="Website" title="Website">
   
<input type="submit" name="submit" class="button" value="Send" />
   
</fieldset>
</form>
   
<?
} else {    

// Emailen sendes her...

?>

<h4>Bekræftelse</h4>
<hr />

<p>Tak for din mail.</p>
   
<!-- GOOGLE ANALYTICS: BEGIN -->
<script type="text/javascript">
_gaq.push(['_trackPageview', '/konvertering/call/']);
</script>
<!-- GOOGLE ANALYTICS: END -->

<?
}
?>
Avatar billede jetobi Juniormester
26. januar 2012 - 13:37 #1
Eftersom du bruger htmlentities($_SERVER['PHP_SELF']); så bruger den din index, fordi index'en er en slags startside :)
Avatar billede webweaver Praktikant
26. januar 2012 - 13:50 #2
Hvorfor har du en htmlentities i din action?
Avatar billede jdjensen Juniormester
26. januar 2012 - 14:14 #3
Ok, men kan jeg så ikke ændre min action til noget andet så jeg undgår url'en ændrer sig? Jeg vil bare gerne have at der hverken forekommer en ændring i url'en eller et redirect når formularen afsendes. Hvad skal der til?

Webweaver: Er det da ikke en god ide for at undgå exploits? Læste om det nederst på denne side: http://www.html-form-guide.com/php-form/php-form-action-self.html
Avatar billede jetobi Juniormester
26. januar 2012 - 14:55 #4
prøv:

<?php
if(!isset($_POST['submit']))
{
?>
   
<form class="form" action="/" method="post">
<fieldset>
   
<input type="text" name="fullname" id="name" class="text" value="Navn" title="Navn">
<input type="text" name="phone" id="phone" class="text" value="Tlf. nr." title="Tlf. nr.">
<input type="text" name="emailaddress" id="emailaddress" class="text" value="Email" title="Email">
<input type="text" name="website" id="website" class="text" value="Website" title="Website">
   
<input type="submit" name="submit" class="button" value="Send" />
   
</fieldset>
</form>
   
<?
} else {   

// Emailen sendes her...

?>

<h4>Bekræftelse</h4>
<hr />

<p>Tak for din mail.</p>
   
<!-- GOOGLE ANALYTICS: BEGIN -->
<script type="text/javascript">
_gaq.push(['_trackPageview', '/konvertering/call/']);
</script>
<!-- GOOGLE ANALYTICS: END -->

<?
}
?>
Avatar billede jdjensen Juniormester
26. januar 2012 - 15:58 #5
jesperkaae95: Tak, den redirectede til roden med "/" i action. Jeg prøvede så at lade action være blank og nu er url'en uforandret ved submit lige meget hvor på sitet formularen er.
Smid gerne et svar for points og tak for hjælpen. :)
Avatar billede webweaver Praktikant
26. januar 2012 - 16:03 #6
#3 Jo, du kan godt bruge den metode blandt andet, hvis du mener du kan risikere at have problemer med exploits.

Hvis du ikke ønsker et reload, når formen submittes, skal du benytte dig af noget AJAX.

Hvis du ikke vil have den til at skrive index.php, kan du benytte dig af noget URL rewrite i din .htaccess fil.
Avatar billede jetobi Juniormester
26. januar 2012 - 16:24 #7
#5 ja, jeg lavede roden om til "/" fordi så burde den ikk gå til nogen sites, :) og så lidt.
SVAR

/jesper
Avatar billede jetobi Juniormester
26. januar 2012 - 16:24 #8
svar*
Avatar billede olebole Juniormester
26. januar 2012 - 17:52 #9
<ole>

@jdjensen: "Når jeg klikker på submit sender den en email til mig og ændrer derefter URL'en fra domain.dk til domain.dk/index.php" >> Det er en misforståelse  =)

Først redirectes en form til det dokument, der står skrevet i dens action attribut. Derefter udfører dette dokument så dets scripts - i dit tilfælde: Sender en mail.

Generelt er det en god idé at sende til et dokument, som udfører den ønskede handling - for derefter at redirecte brugeren til en anden side. Det kan så f.eks. være det dokument, formen ligger i eller f.eks. en takkeside. Det kan du gøre på følgende måde:

<form action="response.php" method="post">
    <div><input type="hidden" name="context" value="sendmail">
        <input type="hidden" name="retpage" value="<?php echo $_SERVER['PHP_SELF'] ?>">
        <input type="text" name="navn"></div>
    <div><textarea name="besked" cols="40" rows="6"></textarea></div>
    <div><input type="submit" value="Send"></div>
</form>

- og dit response.php dokument kunne så se sådan ud:

<?php
// Functions for different tasks
function sendMail() {
    // Send mail here
}

if (!empty($_POST)) {
    if (isset($_POST['context'])) {
        switch ($_POST['context']) {
            case 'sendmail':
                sendMail();
            break;
           
            default:
                // Handle this error in some way
                echo 'Unknown context argument.';
        }
    } else {
        // Handle this error in some way
        echo 'No context argument present.';
    }
}

header('Location: '.(isset($_POST['retpage']) ? $_POST['retpage'] : '/'));
?>

Læg mærke til, at jeg indsætter to hidden fields i formen. Det ene fortæller responsedokumentet, hvad der skal udføres. Det andet fortæller, hvor brugeren efterfølgende skal sendes hen (her sender jeg brugeren tilbage til formularen, men det kunne også være til en fast defineret side). Er variablen retpage af en eller anden grund ikke sat, returneres brugeren til roden af sitet med '/'.

I switch'en kan du tilføje andre cases, så dokumentet kan varetage mange forskellige opgaver. Det kræver naturligvis, du også opretter de tilhørende funktioner.

Fordelen ved denne metode er bl.a., at formen ikke vil sende endnu en mail, hvis siden reloades. Det vil ellers ske, hvis e-mail-scriptet lægges (eller inkluderes) i det dokument, som indeholder formen.

Metoden, jeg her viser, er i øvrigt den samme som Eksperten bruger, når jeg skriver dette indlæg. Det er en metode, de fleste professionelle udviklere anvender.

Til sidst: Brug aldrig navnet submit til en knap eller noget somhelst andet. Brug i det hele taget aldrig ord, der bruges til andet, når du navngiver elementer. Det kan meget let skabe irriterende problemer.

/mvh
</bole>
Avatar billede jdjensen Juniormester
31. januar 2012 - 13:13 #10
Hej olebole,

Jeg prøver at tilpasse det så jeg sender til response.php filen istedet. Jeg har dog lidt problemer med at få selve bekræftelsessiden vist efter mailen er sendt afsted of den returnerer til siden med formularen da jeg vil bruge samme side til bekræftelsesside.

I min markup har jeg følgende:

<?php
if(!isset($_POST['retpage']))
{
?>

<form class="form" action="response.php" method="post">
<fieldset>
   
<div class="errors" style="display:none"></div>

<input type="hidden" name="context" value="sendmail">
<input type="hidden" name="retpage" value="<?php echo $_SERVER['PHP_SELF'] ?>">

<input type="text" name="fullname" id="name" class="text" value="Navn" title="Navn">
<input type="text" name="emailaddress" id="emailaddress" class="text" value="Email" title="Email">

<select name="subject" id="subject" class="select">
<option value="">Vælg... </option>
<option value="Emne1">Emne1</option>
</select>
   
<input type="submit" name="submit" class="button" value="Send">
   
</fieldset>
</form>
   
</div>
   
<?
} else {
?>

<h4>Bekræftelsesside</h4>
<hr />

<div id="sidebar-contact">
<div class="confirm">Tak for din mail.</div> 
</div>

<script type="text/javascript">
_gaq.push(['_trackEvent', 'Form', 'Send', fetchURL(), 30, true]);
</script>

<?
}
?>

I min response.php fil:

<?php
// Functions for different tasks
function sendMail()

if (!empty($_POST)) {
    if (isset($_POST['context'])) {
        switch ($_POST['context']) {
            case 'sendmail':
                sendMail();
            break;
           
            default:
                // Handle this error in some way
                echo 'Unknown context argument.';
        }
    } else {
        // Handle this error in some way
        echo 'No context argument present.';
    }
}

header('Location: '.(isset($_POST['retpage']) ? $_POST['retpage'] : '/'));
?>

---

Når den returnerer til siden viser den bare formularfelterne som de var før jeg trykkede send. Jeg vil gerne have den viser det der ligger i betingelsen under else {} når den kommer tilbage?
Avatar billede olebole Juniormester
31. januar 2012 - 13:47 #11
header('Location: '.(isset($_POST['retpage']) ? $_POST['retpage'].'?mailsent=true' : '/'));

Så kan du spørge på $_GET['mailsent'] i dokumentet med formen.

Du ville også kunne sende en evt. fejl med i URL'en, så den kan aflæses ved formen
Avatar billede jdjensen Juniormester
31. januar 2012 - 14:55 #12
Ah tak olebole, nu bliver bekræftelsen vist med den tilrettet if-sætning:

if(!isset($_GET['mailsent'])) {

Og det løser problemet med en ekstra mail hvis man opdater siden efterfølgende!

Url'en ændres så til domain.dk/index.php?mailsent=true. Kan man eventuelt med nogle tilpasninger til htaccess filen undlade index.php i mine url'er? Eller vil bekræftelsessiden så ikke blive kørt ved mine formularer? Hvis url'en f.eks. blot kunne være domain.dk?mailsent=true eller domain.dk/bibliotek?mailsent=true alt efter hvor formularen findes på sitet. Htaccess er iøvrigt noget jeg kæmper med her: http://www.eksperten.dk/spm/956436 :-)
Avatar billede olebole Juniormester
31. januar 2012 - 15:14 #13
Ja, du kan altid lave en mod_rewrite regel, der sender brugeren et andet sted hen - eller viser noget specielt i adresselinjen
Avatar billede jdjensen Juniormester
31. januar 2012 - 17:04 #14
Tak igen!

Bruger nu dette:

# Redirect index.php Requests
# ------------------------------
RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
RewriteCond %{THE_REQUEST} !/system/.*
RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,L]

# Standard ExpressionEngine Rewrite
# ------------------------------
RewriteCond $1 !\.(css|js|gif|jpe?g|png) [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]

Nu giver den mig altid domain.dk/?mailsent=true eller domain.dk/bibliotek/?mailsent=true.
Skråstregen (/) burde nok fjernes når der kommer en parametre på (?) hvis det skulle være helt korrekt, men det er der nok ik noget at gøre ved. ;-)
Avatar billede olebole Juniormester
31. januar 2012 - 17:45 #15
Hvis den skal ramme index-filen det pågældende sted, kan det ikke være mere korrekt  =)
Avatar billede jdjensen Juniormester
15. februar 2012 - 18:27 #16
Hej ole (såfremt du stadig læser denne tråd),

Jeg har lidt problemer med process.php scriptet.

Hvis jeg f.eks. har min kontakt-formular liggende på www.domain.dk/kontakt/ så ved submit ville den sende en mail og returnere til afsendersiden med parametren www.domain.dk/kontakt/?mailsent=true.

Nu efter min side kører på WordPress CMS så vender den aldrig tilbage til afsendersiden efter den har kørt process.php, den går altid til forsiden: www.domain.dk?mailsent=true :S

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

if (!empty($_POST)) {
    if (isset($_POST['context'])) {
        switch ($_POST['context']) {
            case 'sendmail':
                sendMail();
            break;
           
            default:
                // Handle this error in some way
                echo 'Unknown context argument.';
        }
    } else {
        // Handle this error in some way
        echo 'No context argument present.';
    }
}

header('Location: '.(isset($_POST['retpage']) ? $_POST['retpage'].'?mailsent=true' : '/'));
?>
Avatar billede olebole Juniormester
15. februar 2012 - 18:35 #17
Det har ikke noget med PHP at gøre. Det må skyldes WP.

Hvad står der i kildekoden, når du ser på formen via View Source i din browser? Er det skjulte felt tilstede - og indeholder den det forventede?
Avatar billede jdjensen Juniormester
15. februar 2012 - 19:00 #18
Ah ja, jeg tror der er noget galt..

Den laver f.eks. denne linie:
<input type="hidden" name="retpage" value="<?php echo $_SERVER['PHP_SELF'] ?>">

Om til:
<input type="hidden" name="retpage" value="/index.php">

Det må næsten være årsagen?
Avatar billede olebole Juniormester
15. februar 2012 - 19:18 #19
Velkommen til mod_rewrite  =)

index.php er jo den side, der håndterer det hele. Det ved PHP godt og opfører sig derefter
Avatar billede jdjensen Juniormester
15. februar 2012 - 19:59 #20
Tak ole :-)
Men for at løse problemet med at den redirecter til forsiden efter formularen har kørt process.php, vil jeg så ikke skulle tilføje noget til min .htaccess som gør at <?php echo $_SERVER['PHP_SELF'] ?> bliver omskrevet?
Avatar billede olebole Juniormester
15. februar 2012 - 20:44 #21
Jo, måske. Spørgsmålet er blot, hvad der ellers vil opstå af ting, der skal lappes. Pæne URL'er er pæne - men pænt er jo i udgangspunktet bare ... pænt  =)
Avatar billede jdjensen Juniormester
15. februar 2012 - 21:18 #22
Ja det rigtig. Jeg ville bare gerne finde ud af hvorfor den helt præcis tager mig til forsiden/roden frem for at sende mig tilbage til kontaktsiden som den så pænt gjorde før jeg fik Wordpress som CMS. :-)
Det er ikke rigtig til at hitte ud af hvad der skal laves om i min htacess for at det vil virke.

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ http://www.domain.dk/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

Jeg har kun googlet efter en løsning hele dagen men der er jo også hele natten. ;-)
Avatar billede jdjensen Juniormester
15. februar 2012 - 21:41 #23
Ok det ser faktisk ud til jeg har løst det nu blot ved at erstatte:

<input type="hidden" name="retpage" value="<?php echo $_SERVER['PHP_SELF'] ?>">

Med:
<input type="hidden" name="retpage" value="/kontakt/">

Nu bliver jeg sendt tilbage til kontakt-siden (istedet for forsiden) hvor bekræftelsen bliver vist. :-))
Avatar billede jdjensen Juniormester
15. februar 2012 - 21:48 #24
Eneste minus er at jeg er nød til at låse mig fast til én bestemt side. Hvis jeg feks. har formularen liggende på side A, B og C så bliver der altid redirected til side D (kontaktsiden) istedet for at bekræftelsessiden bliver vist på den side hvor formularen oprindelig lå på. Nåh ja, det kan jeg vel godt leve med hvis det er.
Avatar billede olebole Juniormester
16. februar 2012 - 15:28 #25
Jamen, årsagen er sådan set ganske logisk. Der findes ikke en kontaktside.

Din kontaktside er jo index.php - ligesom alle de andre sider. Det skjules for brugeren med mod_rewrite, men PHP 'ved' godt, der er tale om indekssiden. Derfor indeholder $_SERVER['PHP_SELF'] stien til index.php. Simple as that!  =)
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