[PHP] Vraag mbt navigeren icm sessions

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben een dag of 5 bezig met een website die ik bouw met php & mysql. Mijn ervaring met php is niet super dus ik houd me nog niet 100% bezig met OOP aangezien het project toch niet al te groot is.
Toch heb ik hier en daar wat vraagtekens.

Het komt er op neer dat bepaalde content in bepaalde <div>'s moeten komen. Nu is dit met een include wel op te lossen maar wat als ik bijvoorbeeld een registratieformulier invul en dit na het submitten wil laten verdwijnen en op dezelfde plaats een melding wil hebben zoals: Bedankt!

Op dit moment lukt dit me wel maar volgens mij te omslachtig. Wat ik doe is: na een submit wordt het formulier gekeurd, bij goedkeurig voeg ik een var toe aan mijn session zoals:

code:
1
$_SESSION["goedgekeurd"] = "Voltooid";


Na de submit krijg je dus een refresh waar de code bovenaan de pagina controleert of deze session variabele wel aanwezig is. Als dit zo is unset hij hem en voert de code uit die verantwoordelijk is voor een bericht zoals: Bedankt!

Lang verhaal maar hopelijk duidelijk!

Doe ik dit wel efficient / veilig? Naar mijn idee kan het vele malen sneller want op sommige pagina's heb ik straks wel 4 if -loopjes nodig om sessions uit te lezen

Ik hoor graag wat commentaar en/of links die ik kan bezoeken om een handigere methode te bestuderen.

Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Kan je niet beter na het posten van het formulier je geposte waarden controleren (kan de inhoud ervan wel bij wat jij verwacht?) en als alles goed is, binnen die div een bedankt melding geven? :) Daar heb je echt geen sessie variabele voor nodig. Om spam te voorkomen, kan je dan eventueel een sessie var mee laten lopen om te controleren of diegene niet teveel berichten stuurt. :)

[ Voor 21% gewijzigd door CH4OS op 30-04-2009 00:52 ]


Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 19-09 11:12
Als ik jou was zou ik true / false gebruiken, dat is veel duidelijker. Waarom zou je bijvoorbeeld $_SESSION["goedgekeurd"] een string value meegeven, als ik jou was had ik dan nog altijd $_SESSION["goedgekeurd"] als boolean opgegeven. Trouwens, sessies kan je ook makkelijk zo controleren:
PHP:
1
$a = ($_SESSION["goedgekeurd"] ? "" : false); //Zo controleer je of de sessie true is, als die true is geef hem de waarde "" mee, anders false.


Maar zoals GJtje ook al zegt, waarom per se met sessies werken, je kan even makkelijk je form valideren.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
GJtje schreef op donderdag 30 april 2009 @ 00:50:
Kan je niet beter na het posten van het formulier je geposte waarden controleren (kan de inhoud ervan wel bij wat jij verwacht?) en als alles goed is, binnen die div een bedankt melding geven? :) Daar heb je echt geen sessie variabele voor nodig. Om spam te voorkomen, kan je dan eventueel een sessie var mee laten lopen om te controleren of diegene niet teveel berichten stuurt. :)
Als je validatie bedoelt, dat heb ik op dit moment ook ja. Bij foutieve of lege invoer komt er een melding omhoog. Het gaat meer om het feit dat als je het formulier bijvoorveeld 'juist' hebt ingevult dat het formulier zelf wel moet verdwijnen om plaats te maken voor de melding.

Vandaar dat ik me afvraag hoe dit in het algemeen gedaan word. Het lijkt erop dat ik meer aan de gang moet gaan met querystrings en een switch.

Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Verwijderd schreef op donderdag 30 april 2009 @ 00:56:
Als je validatie bedoelt, dat heb ik op dit moment ook ja. Bij foutieve of lege invoer komt er een melding omhoog. Het gaat meer om het feit dat als je het formulier bijvoorveeld 'juist' hebt ingevult dat het formulier zelf wel moet verdwijnen om plaats te maken voor de melding.
Hoe bedoel je 'verdwijnen'? Je gaat toch een nieuwe pagina krijgen als je het formulier verzend? :) Dan kan je toch je formulier valideren en de output daarvan (succes of error en zo) in dezelfde div zetten? Ik snap je probleem niet.
Vandaar dat ik me afvraag hoe dit in het algemeen gedaan word. Het lijkt erop dat ik meer aan de gang moet gaan met querystrings en een switch.
Hoezo? Zolang je de output van het formulier in dezelfde div zet, is er toch niets aan de hand? :?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
GJtje schreef op donderdag 30 april 2009 @ 01:25:
[...]
Hoe bedoel je 'verdwijnen'? Je gaat toch een nieuwe pagina krijgen als je het formulier verzend? :) Dan kan je toch je formulier valideren en de output daarvan (succes of error en zo) in dezelfde div zetten? Ik snap je probleem niet.
[...]
Hoezo? Zolang je de output van het formulier in dezelfde div zet, is er toch niets aan de hand? :?
Tis alweer laat :)
Het probleem is eerder dat ik een stapje te ver aan het denken was :(. Is vervelend als je ergens te lang naar zit te staren, raak je beetje de draad kwijt
Klopt, er komt idd een nieuwe pagina als ik het formulier gevalideerd heb. De manier zoals jij het bedoelt kan het beste worden gedaan dmv een querystring mee te geven als ik het goed begrijp? Die output moet immers ergens opgevangen worden. Of kan dit toch beter met een $PHP_SELF opdracht.

Acties:
  • 0 Henk 'm!

Verwijderd

Je denkt iets te moeilijk. Probeer het eens in deze richting (dit bedoelen ze hierboven ook) :


indien formulier nog niet gesubmit {

toon formulier

}else{

controleer invoer
indien klopt {

iets doen met de data
output "bedankt!"

}else{

output "fout!" + eventueel formulier weer laten zien

}
}

Dit kan allemaal in 1 pagina. :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op donderdag 30 april 2009 @ 11:29:
Je denkt iets te moeilijk. Probeer het eens in deze richting (dit bedoelen ze hierboven ook) :


..

Dit kan allemaal in 1 pagina. :)
Top.
Zo bedoel ik het inderdaad :). Gelijk gemaakt en werkt prima. Is het overigens verstandiger om je formulier zelf te includen, anders krijg je tweemaal de form in hetzelfde script? Ik zou natuurlijk ook eventuele fouten in een session array kunnen stoppen en die opvragen na het opnieuw tonen van de form.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Heb toch even het 1 en ander gewijzigd.
Heb het nu als volgt:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
if (isset($_SESSION["registratieVoltooid"]))
{
    unset($_SESSION["registratieVoltooid"]);
    registratie_gelukt();
}
else
{
    ?>
    /* toon formulier, met onderaan het formulier een php code die een opsomming onder het formulier neerzet m.b.t. foutieve invoer. Dit komt binnen via een session array.*/
<?php
}
?>


Het formulier wordt gesubmit naar een verwerkingspagina die het volgende doet:
* invoervelden valideren en zo nodig errors naar error[] array schrijven.
* inhoud array tellen. Als deze leeg is wordt er een mailtje verstuurd
* bij het succesvol versturen van deze mail krijgt de session [registratieVoltooid] = true mee.
* fout? dan wordt de errorArray in de session gestopt en dmv een redirect naar het begin van de form is het cirkeltje weer rond.

Op zich werkt dit prima. Als het sneller kan hoor ik het graag. Punt is namelijk dat als je dit op 1 pagina doet, je script ontzettend lang is.

Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Cryte, wat heeft $_SESSION['registratieVoltooid'] voor nut? :) Hij voegt namelijk totaal niets toe, enige is dat iemand dan maar 1x een formulier kan invullen, en daar schiet je ook niets mee op. IMO is dit gewoon om het feit dat je met sessies wilt werken, zonder te denken aan de functionaliteit van het script.

Lees Wriker zijn bericht nog eens, dat wil / bedoelde je, maar vervolgens doe je het weer niet zo? :?
Je zal er wellicht niet al te veel mee opschieten, maar als je ZendOptimizer installeerd, zou eea ook net even wat sneller moeten gaan en je kan encrypted PHP files gebruiken. :)

[ Voor 35% gewijzigd door CH4OS op 30-04-2009 14:08 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
GJtje schreef op donderdag 30 april 2009 @ 14:04:
Cryte, wat heeft $_SESSION['registratieVoltooid'] voor nut? :) Hij voegt namelijk totaal niets toe, enige is dat iemand dan maar 1x een formulier kan invullen, en daar schiet je ook niets mee op. IMO is dit gewoon om het feit dat je met sessies wilt werken, zonder te denken aan de functionaliteit van het script.

Lees Wriker zijn bericht nog eens, dat wil / bedoelde je, maar vervolgens doe je het weer niet zo? :?
Je zal er wellicht niet al te veel mee opschieten, maar als je ZendOptimizer installeerd, zou eea ook net even wat sneller moeten gaan en je kan encrypted PHP files gebruiken. :)
Als ik het op de manier zoals Wriker uitgelegd heeft zou doen betekent dit dat ik het formulier 2 keer in dezelfde file zou moeten stoppen. 1 keer als er geen errors zijn, en vervolgens nog een keer + opsomming van eventuele errors. Heb ontzettend zitten googlen maar keer op keer stuit ik op een formulier dat je na het submitten naar een nieuwe pagina stuurt met daarin een bevestiging.
Daarom probeer ik dmv een session var aan het begin van het script op te vangen of het al succesvol is afgerond, daarna een unset.

Bedenk wel dat het script dat uitgevoerd word na de submit ervoor zorgt dat er data weggeschreven word naar de db. Ik heb geen idee hoe ik dit anders zou kunnen aanpakken.
Het is niet zo dat ik persee met een session wil werken, integendeel. Ik ben echter een Csharper waar ik dat wel veelvuldig gebruikte :|

Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 19:24

Patriot

Fulltime #whatpulsert

Verwijderd schreef op donderdag 30 april 2009 @ 14:42:
[...]


Als ik het op de manier zoals Wriker uitgelegd heeft zou doen betekent dit dat ik het formulier 2 keer in dezelfde file zou moeten stoppen.
Nee hoor. Deel het zo op:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

if (formulier_gesubmit) {
 if (input_valid) {
  // .. hier een redirect naar een 'gelukt!' pagina
  exit;
 } else {
  // .. fouten registreren
 }
}

// formulier laten zien

?>


Je zet het formulier onderaan, de validatie erboven. Als je het formulier wilt laten zien laat je het script daar komen, als dat niet nodig is dan exit je voordat hij er komt.

Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Zoals Wriker het uitlegt, zou je het formulier 2x in het bestand moeten zetten?
Je controleerd toch of er iets gepost is? Die valideer je. Is er niets gepost, moet je dus het formulier laten zien.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if($_POST)
{
    if(valideer($_POST) == true)
    {
        echo 'Bedankt'
    }
    else
    {
        echo 'Er is iets niet goed gegaan bij het versturen';
        foreach($errors as $error)
        {
            echo $error;
        }
    }
}
else
{
    // Print je formulier
}
Duidelijker en simpeler als dit kan je het niet krijgen. En ik mag hopen voor je, dat je eerst de boel valideerd voordat je een en ander wegschrijft in je DB.

Met andere woorden, een formulier verwerk je dus op de volgende wijze:
  1. Controleer of je waardes toegestuurd krijgt, zo nee, laat het formulier zien.
  2. Valideer je formulier en geef foutmeldingen indien nodig terug aan gebruiker, stop dan ook niets in de DB en laat opnieuw formulier zien, met geposte waardes, merk de foutieve stukken in het formulier.
  3. Als toegestuurde waarde valide is, verwerk je het pas in je DB en bedank je de gebruiker

Acties:
  • 0 Henk 'm!

Verwijderd

Zo zou ik het ook doen hoor, maar ik denk ik geef 'm eerst een duwtje in de goede richting. :P

Het formulier maar 1 keer in je code kun je op verschillende manieren oplossen. Zoals hierboven beschreven eerst de post afvangen en valideren, of je zou iets met een template kunnen doen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Heel erg bedankt :) Nu ik de logica er van inzie kan ik weer verder. Het zat me toch niet lekker zoals ik het in elkaar had gezet dus bedankt voor deze uitleg.
Om te beginnen ga ik de 'valideer' function maar eens schrijven. Valt mooi te hergebruiken :). Moet helemaal gaan lukken!

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben flink aan de gang gegaan met de hulp die ik hier ontvangen heb.
Ik ben uiteindelijk tot het volgende gekomen.
Het werkt echter niet: ik krijg geen foutmeldingen onder mijn form en inloggen werkt ook niet. Denk zelf dat dit te maken heeft met de validatie of misschien iets anders?
Het loginscherm zelf is op de hoofdpagina in een apart divje weergegeven en na succesvol inloggen kom je weer terug op de index waar vervolgens aan de hand van een sessioncheck een anders scherm ipv het inlogformulier getoond word met een welkom terug boodschap.

Inloggen werkt, behalve met onjuiste input, dan verdwijnt na submit gewoon het hele formulier (hele div). Geen idee waarom dit gebeurt.

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
<?php

ob_start();

include('config/config.php');
include('config/verbinding.php');

$sendpass = "<a href='#'>Wachtwoord vergeten!</a>";
$registreren = "<a href='index.php?signup'>Registreren</a>";
$errors = array();

if (isset($_POST['Submit']))
{
    /** Valideren
     */
    $username = isset($_POST['user_name']) ? trim($_POST['user_name']) : ' ';
    $password = isset($_POST['pass']) ? trim($_POST['pass']) : ' ';

    if (empty($username))   $errors[] = 'Gebruikersnaam vergeten';
    if (empty($password))   $errors[] = 'Wachtwoord vergeten';

    else
    {
        /** Geen fouten tijdens validatie van de Form
         */

            $tbl_name="users"; // Tabel naam

            
            $myusername= strtolower($password);
            $mypassword= $password;
            $mypassword = md5($mypassword);

            
            $myusername = stripslashes($myusername);
            $mypassword = stripslashes($mypassword);
            $myusername = mysql_real_escape_string($myusername);
            $mypassword = mysql_real_escape_string($mypassword);

                $sql="SELECT * FROM $tbl_name WHERE user_name = '$myusername' AND pass ='$mypassword'";
                $result=mysql_query($sql);

                while ($row = mysql_fetch_array($result))
                {
                    $myuserid = $row['user_id'];
                }

                                    $count=mysql_num_rows($result);
                
                if($count==1){
                /**
                 * Gebruikersnaam en Wachtwoord komen overeen dus redirect naar hoofdpagina
                 * en sla gegevens op in het de Session
                 */
                $_SESSION['userid'] = $myuserid;
                $_SESSION['username'] = $myusername;
                header("location:index.php");
                }
                else
                {
                $errors[] = 'Foute gebruikersnaam of wachtwoord';
                }

    }
}
else
/** Laat form zien inclusief eventuele errors
 */
{
    print "
    <div class='navigation'>
    <p><strong>Inloggen:</strong></p>

    <table border='0' cellpadding='0' cellspacing='1' style='margin-left:10px;'>
    <form name='form1' method='post' action=''>
    <tr>

    <td><p class='login'>Gebruikersnaam:</p></td>
    </tr>
    <tr>

    <td><input type='text' name='user_name' id='user_name' size='15' class='loginbox'></td>
    </tr>

    <tr>
    <td>
    <p class='login'>Wachtwoord:</p>
    <input type='password' name='pass' id='pass' size='15' class='loginbox'></td>
    </tr>
    <tr>
    <td><input type='submit' name='Submit' value='Inloggen!' class='btn' style='margin-top:10px;'></td>
    </tr>
    </form>
    <tr><td>
    <p class='login'>$sendpass</p>
    <p class='login'>$registreren</p></td></tr>
    <tr><td>
    <p class='error'>";
    
    foreach($errors as $error)
    {
        echo "$error<br>";
    }
    print "</p></td></tr></table></div>";
}
    include('config/closedb.php');

ob_end_flush();
?>


Hopelijk kan iemand het knelpunt ontdekken, ik kom er namelijk niet uit :-(. Ik ga onderhand zelf uiteraard intensief verder kijken maar hulp zou zeer welkom zijn :)
Vraag me tevens af of het stukje m.b.t. gebruikersnaam/wachtwoord combo controle daadwerkelijk daar wel goed staat.

ps: de titel van dit topic is niet langer terecht, als een mod dit leest: s.v.p. veranderen in: [php] Problemen bij verwerking van Form.

[ Voor 6% gewijzigd door Verwijderd op 04-05-2009 02:22 ]


Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 19:24

Patriot

Fulltime #whatpulsert

Je if/else constructie omtrent het controleren van fouten / in de database deponeren van de gegevens klopt niet helemaal.

Zet om de controlerende statements ook gewoon eens haakjes, en maak van die tweede if een else if, zodat je zoiets krijgt:

PHP:
1
2
3
4
5
6
7
8
9
10
11
<?php

if (empty($username)) {
 // .. foutje
} else if (empty($password)) {
 // .. ander foutje
} else {
 // .. in de database ermee
}

?>


Verder hoort de location header een absolute uri mee te krijgen, geen relatieve. Van alleen 'location:index.php' moet je dus iets maken als 'location: http://mijn.website.nl/index.php'.

Acties:
  • 0 Henk 'm!

  • YakuzA
  • Registratie: Maart 2001
  • Niet online

YakuzA

Wat denk je nou zelluf hey :X

Verwijderd schreef op maandag 04 mei 2009 @ 01:17:
Ik ben flink aan de gang gegaan met de hulp die ik hier ontvangen heb.
Ik ben uiteindelijk tot het volgende gekomen.
Het werkt echter niet: ik krijg geen foutmeldingen onder mijn form en inloggen werkt ook niet. Denk zelf dat dit te maken heeft met de validatie of misschien iets anders?
Het loginscherm zelf is op de hoofdpagina in een apart divje weergegeven en na succesvol inloggen kom je weer terug op de index waar vervolgens aan de hand van een sessioncheck een anders scherm ipv het inlogformulier getoond word met een welkom terug boodschap.

Inloggen werkt, behalve met onjuiste input, dan verdwijnt na submit gewoon het hele formulier (hele div). Geen idee waarom dit gebeurt.

PHP:
1


Hopelijk kan iemand het knelpunt ontdekken, ik kom er namelijk niet uit :-(. Ik ga onderhand zelf uiteraard intensief verder kijken maar hulp zou zeer welkom zijn :)
Vraag me tevens af of het stukje m.b.t. gebruikersnaam/wachtwoord combo controle daadwerkelijk daar wel goed staat.

ps: de titel van dit topic is niet langer terecht, als een mod dit leest: s.v.p. veranderen in: [php] Problemen bij verwerking van Form.
Ik zal even je If/Else constructie versimpeld weergeven, hopelijk zie je dan ook zelf de fout :)

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
<?php
....
if (isset($_POST['Submit']))
{
    /** Valideren
     */
    if (empty($username))   $errors[] = 'Gebruikersnaam vergeten';
    if (empty($password))   $errors[] = 'Wachtwoord vergeten';

    else
    {
        /** Geen fouten tijdens validatie van de Form
         */
                if($count==1){
                /**
                 * Gebruikersnaam en Wachtwoord komen overeen dus redirect naar hoofdpagina
                 * en sla gegevens op in het de Session
                 */
                }
                else
                {
                   $errors[] = 'Foute gebruikersnaam of wachtwoord';
                }
    }
}
else
/** Laat form zien inclusief eventuele errors
 */
{

}
...
?>


spoiler:
Ik zie al een zwevende Else onder de validatie met shorthand if's zou niet weten of dat helemaal correct werkt, te weinig into PHP.

Verder zal de hoofd If/Else ervoor zorgen dat als er iets gesubmit wordt, dat er helemaal niks wordt geprint.

Death smiles at us all, all a man can do is smile back.
PSN


Acties:
  • 0 Henk 'm!

  • 418O2
  • Registratie: November 2001
  • Laatst online: 20:31
Doe iig verschillende files gebruiken ofzo. Als hier later iets niet in werkt is het een draak om te debuggen. Daarbij; een hele pagina weergeven dmv een print is niet echt prettig en een enorm geklooi met escapes.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Ik denk dat je sowieso eerst een beetje beter jezelf moet inlezen in hoe een en ander werkt:

PHP:
1
2
3
4
5
6
7
8
9
$myusername= strtolower($password);
$mypassword= $password;
$mypassword = md5($mypassword);


$myusername = stripslashes($myusername);
$mypassword = stripslashes($mypassword);
$myusername = mysql_real_escape_string($myusername);
$mypassword = mysql_real_escape_string($mypassword);


een aantal regels slaat echt compleet nergens op, je overschrijft net gedeclareerde variabelen weer over een regel na de declaratie (regel 1 -> 6, regel 2 -> 3). En je kunt functies gewoon 'chainen' :)

PHP:
1
2
$myusername = mysql_real_escape_string(stripslashes(trim($_POST['user_name'])));
$mypassword = mysql_real_escape_string(stripslashes(md5(trim($_POST['pass']))));


zoiets bijvoorbeeld. Of gewoon n functie maken natuurlijk die je variabelen opschoont. Beter nog zou het zijn om PDO of mysqli te gebruiken natuurlijk, maar wellicht is dat nog even te hoog gegrepen.

edit: ook zet je het ingevoerde wachtwoord nu als gebruikersnaam, dat lijkt me sowieso al niet in orde. Maw. : leer debuggen.

[ Voor 6% gewijzigd door Cartman! op 04-05-2009 09:27 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het lijkt nu te zijn opgelost :).
Ik heb het gehele formpje uit de 'else' gehaald en buiten de php code geplaatst, onderaan de file. Verder heb ik de validatieregels aangepast met haakjes erbij zoals het hoort.
Vooral de tip om het als aparte file te debuggen heeft me erg geholpen.

Wat mij betreft ben ik tevreden met het resultaat!

Thanks!.
Pagina: 1