if..elseif..else of preg_match fout in code..?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Marc Blom

Marc Blom

28/07/2008 16:39:00
Quote Anchor link
Hallo,

als ik de preg_match formule in een kleine php file test is de notatie correct, dat wil zeggen dat ik alleen maar gebruikersnamen wil toestaant die bestaan uit letters en cijfers.

Echter wanneer ik deze toepas in mij code (aanmeldpagina) lijkt het alsof de code de controle negeert. Ook gebruikersnamen met bijvoorbeeld een & in de tekst komen er gewoon doorheen.

De hamvraag is waar dit nu aan ligt, waarschijnlijk een foutje in de if routine, maar ik zie hem niet!!!

wie kan me helpen?

alvast bedankt,
groet,
Marc

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
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
<?php
// als het formulier nog niet is ingevuld
if(!isset($_POST['submit'])) {
?>

                    <h3>Aanmeldpagina</h3>
                    <p>&nbsp;</p>
                    <p>U heeft nog geen eigen startpagina, u kunt zich hier registreren.</p>
                    <p>&nbsp;</p>
                    <form action="aanmeld.php" method="post">
                      <table width="500" border="0" cellspacing="0" cellpadding="0">
                        <tr>
                          <td width="200"><p>Gebruikersnaam</p></td>
                          <td width="300"><input type="text" name="naam" size="40" maxlength="20" /></td>
                        </tr>
                        <tr>
                          <td><p>Wachtwoord</p></td>
                          <td><input type="password" name="wacht1" size="40" maxlength="32" /></td>
                        </tr>
                        <tr>
                          <td><p>Wachtwoord opnieuw</p></td>
                          <td><input type="password" name="wacht2" size="40" maxlength="32" /></td>
                        </tr>
                        <tr>
                          <td><p>Voornaam</p></td>
                          <td><input type="text" name="voornaam" size="40" maxlength="20" /></td>
                        </tr>
                        <tr>
                          <td><p>Achternaam</p></td>
                          <td><input type="text" name="achternaam" size="40" maxlength="20" /></td>
                        </tr>
                        <tr>
                          <td><p>Email adres</td>
                          <td><input type="text" name="email" size="40" maxlength="128" /></td>
                        </tr>
                      </table>
                      <br />
                      <input type="submit" name="submit" value="Registreer" />
                    </form>
                    <?php
// formulier gepost, kijk of alle velden ook daadwerkelijk zijn ingevuld
} elseif(trim($_POST['naam']) <> "" && trim($_POST['wacht1']) <> "" && trim($_POST['voornaam']) <> "" && trim($_POST['achternaam']) <> "" && trim($_POST['email']) <> "") {
  // formulier gepost, check op geldige gebruikersnaam
  $naam=$_POST['naam'];
  if(preg_match('/^[a-zA-Z0-9]+$/', $naam)) {
    // formulier ingevuld - kijk eerst of de gebruiker al bestaat
    $naam = $_POST['naam'];
    $vnaam = $_POST['voornaam'];
    $anaam = $_POST['achternaam'];  
    $res = mysql_query("SELECT * FROM users WHERE gebrnaam='".$naam."'") or die(mysql_error());
    if(mysql_num_rows($res) == 0) {
      // geen resultaten - dit is wat we willen
      // kijk of de opgegeven wachtwoorden overeenkomen

      if(!strcmp($_POST['wacht1'], $_POST['wacht2'])) {
        // wachtwoorden komen overeen - sla alle gegevens op in de database
        // naam is al opgehaald uit het formulier

        $wacht = md5($_POST['wacht1']); // versleuteld wachtwoord
        $email = $_POST['email'];
        mysql_query("INSERT INTO users (gebrnaam, wwoord, vnaam, anaam, email) VALUES ('".$naam."','".$wacht."','".$vnaam."','".$anaam."','".$email."')") or die(mysql_error());

        // geef melding weer
?>

                    <h3>Registratie geslaagd!</h3>
                    <p>&nbsp;</p>
                    <p>Bedankt voor uw registratie.</p>
                    <p>&nbsp;</p>
                    <p>
                      <meta http-equiv="refresh" content="10;url=http://<?=$naam?>.blommetje.nl/index" />
                      <a href="http://<?=$naam?>.blommetje.nl/index">Klik hier om naar uw startpagina te gaan.</a></p>
                    <p>&nbsp;</p>
                    <br />
                    <?php
      } else {
        // wachtwoorden komen niet overeen
?>

                    <p>De twee opgegeven wachtwoorden zijn niet hetzelfde.<br />
                      Druk op de "back" knop van je browser en voer twee identieke wachtwoorden in.</p>
                    <br />
                    <?php
     }
    }
else {
      // er bestaat al een gebruiker met deze naam
?>

                    <p>Er bestaat al een gebruiker met deze naam.<br />
                      Druk op de "back" knop van je browser en geef een andere naam op.</p>
                    <br />
                    <?php
     }
    }
else {
      // ongeldige gebruikersnaam
?>

                    <p>Gebruikersnaam is ongeldig.<br />
                      Druk op de "back" knop van je browser en geef een andere naam op.</p>
                    <br />
                    <?php    
    }    
    }
else {
    // sommige velden zijn niet ingevuld
?>

                    <p>Alle velden dienen ingevuld te worden.<br />
                      Druk op de "back" toets en vul in alle velden wat in.</p>
                    <br />
                    <?php
}
?>
Gewijzigd op 01/01/1970 01:00:00 door Marc Blom
 
PHP hulp

PHP hulp

28/11/2024 19:52:05
 
Jacco Engel

Jacco Engel

28/07/2008 16:41:00
Quote Anchor link
code tags
 
Marc Blom

Marc Blom

28/07/2008 16:44:00
Quote Anchor link
sorry zag het ook al, alles staat nu tussen de code tags...
 
- SanThe -

- SanThe -

28/07/2008 16:45:00
Quote Anchor link
Pas je script even aan en gebruik en tags om je code heen. Gebruik je Afbeelding knop om dit te doen.

SanThe.
 
Jacco Engel

Jacco Engel

28/07/2008 17:08:00
Quote Anchor link
Begin maar met code overzichtelijk te maken want hier kan niemand (niemand == ik in dit geval) tabak van maken
 
- SanThe -

- SanThe -

28/07/2008 17:11:00
Quote Anchor link
En lees eens wat over sql-injection en kijk eens bij mysql_real_escape_string.

Edit: En $vars gewoon in een andere $var kopiëren is zinloos en kost alleen maar extra geheugen. Voorbeeld: $naam = $_POST['naam'];
Gewijzigd op 01/01/1970 01:00:00 door - SanThe -
 
Emmanuel Delay

Emmanuel Delay

28/07/2008 17:18:00
Quote Anchor link
Je komt dus nooit in deze blok code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
else
  {
      // ongeldige gebruikersnaam
?>

<p>Gebruikersnaam is ongeldig.<br />
Druk op de "back" knop van je browser en geef een andere naam op.</p>
<br />
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
<?php    
  }


Zelfs als je namen met vreemde tekens gebruikt. Klopt dit?
 
Marc Blom

Marc Blom

28/07/2008 17:30:00
Quote Anchor link
@emmanuel : idd, dat klopt die melding komt niet als er vreemde tekens in staan.

@jacco en santhe: ben een beginner, dus zal er nog eens goed naar kijken met jullie opmerking, dank daarvoor!


groet,
Marc
 
Emmanuel Delay

Emmanuel Delay

28/07/2008 17:44:00
Quote Anchor link
Misschien ben je hier iets mee. In plaats van die preg:
Je kan zelf karakters toevoegen als je wil. Zoals het nu is, krijg je ook een false als je een spatie invult.


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
<?
if ( enkel_letters_of_cijfers($naam)  )
{

///...
}
// ...
function enkel_letters_of_cijfers($string)
{

    $letters = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    $resultaat = '';
    $lengte = strlen($string);
    
    for ($i=0; $i < $lengte ; $i++)
    {

      if ( strrpos($letters, $string{$i}, 0) )
      {

        $resultaat = $resultaat . $string{$i};
      }

      else
        return 0;
    }

  return 1;
}

?>
Gewijzigd op 01/01/1970 01:00:00 door Emmanuel Delay
 
Marc Blom

Marc Blom

29/07/2008 09:21:00
Quote Anchor link
Emmanuel, bedankt voor je script, ga hem zeker proberen. Toch zou ik nog graag willen weten welke fout of denkfout ik maak in de code. Anders plaats ik de nieuwe code en treden dezelfde problemen op. Dus wie kan mij vertellen wat er in de if..else routine niet juist is?

thanks!
Marc
 
Jacco Engel

Jacco Engel

29/07/2008 09:44:00
Quote Anchor link
Srry vroeg en te weinig koffie
Gewijzigd op 01/01/1970 01:00:00 door Jacco Engel
 
Emmanuel Delay

Emmanuel Delay

29/07/2008 20:23:00
Quote Anchor link
Naar mijn smaak (smaken kunnen verschillen) is je code ook niet echt heel leesbaar.

Je if/then/else blokken zijn erg genest, maar je ziet niet goed welke blok bij wat hoort.

Het feit dat je telkens in en uit je php gaat (
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?  ...  ?>
), maakt het lastig.

Ik zet altijd de accolades die bij mekaar passen recht onder mekaar. De meesten doen dat niet (elk zijn smaak), maar ik zal daar nooit van afwijken (voor persoonlijk gebruik).

Het aantal spaties (of tabs) die voor een accolade staan, tonen bij mij onmiddellijk tot welke diepte de blok code genest is.

Zijn er verder eigenlijk nog problemen of werkt het ondertussen?
 
Marc Blom

Marc Blom

29/07/2008 20:38:00
Quote Anchor link
Emmanuel, het werkt nog steeds niet, er moet echt ergens een fout zitten in de lussen, maar zoals je zelf ook al aangeeft is het lastig leesbaar en ik (als beginner in mijn boek php en mysql voor dummies.....) en her en der gekopieerder code aan elkaar geplakte code zie het dan al helemaal niet meer.....

Heb zelf ook al aan een opzet zoals hieronder zitten denken:
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
28
29
30
31
32
33
34
<?php
// form niet ingevuld
if(!isset($_POST['submit']))
{

routine en html aanmeldpagina
}

elseif -- conditie lege velden --
{

$fout="lege velden";
}


elseif -- conditie ongeldige gebruikersnaam --
{

$fout="ongeldige gebruikersnaam";
}


elseif -- conditie bestaande gebruikersnaam --
{

$fout="bestaande gebruikersnaam";
}


elseif -- conditie zelfde wachtwoord --
{

$fout="wachtwoord komt niet overeen";
}


else
{
routine registratie en redirect naar inlogpagina
}

echo $fout;
?>

==========

is zoiets een logischere opbouw of ben ik nu helemaal de weg kwijt en moet ik straks tijdens mijn vakantie eerst het boek voor dummies maar eens uitlezen :-)

ik hoor graag van jullie en wederom dank voor het meedenken en willen helpen!!!

groet,
Marc
Gewijzigd op 01/01/1970 01:00:00 door Marc Blom
 
- SanThe -

- SanThe -

29/07/2008 20:44:00
Quote Anchor link
Pas je script even aan en gebruik en tags om je code heen. Om php code zet je uiteraard dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php en ?>
Gebruik je Afbeelding knop om dit te doen.

SanThe.
Gewijzigd op 01/01/1970 01:00:00 door - SanThe -
 
Marc Blom

Marc Blom

29/07/2008 20:47:00
Quote Anchor link
het was niet echt mijn bedoeling om echte code te plaatsen maar even een "schetsje" van de opzet; voor alle duidelijkheid en om aan alle regels van het forum te voldoen je advies opgevolgt.

groet/marc
 
- SanThe -

- SanThe -

29/07/2008 20:57:00
Quote Anchor link
Ik zou het meer zo doen:
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
28
29
30
31
32
33
<?php
// form ingevuld
if($_SERVER['REQUEST_METHOD'] == 'POST')
{

    $fout = array();
    if -- conditie lege velden --
    {

        $fout[]="lege velden";
    }

    if -- conditie ongeldige gebruikersnaam --
    {

        $fout[]="ongeldige gebruikersnaam";
    }

    if -- conditie bestaande gebruikersnaam --
    {

        $fout[]="bestaande gebruikersnaam";
    }

    if -- conditie zelfde wachtwoord --
    {

        $fout[]="wachtwoord komt niet overeen";
    }

    if(empty($fout))
    {

        // verwerken en header naar waar dan ook
    }
}

foreach($fout as $value)
{

    echo $value . '<br/>';
}

// formulier

?>
 
Marc Blom

Marc Blom

29/07/2008 21:05:00
Quote Anchor link
ok, dankjewel! dit ga ik proberen en zal de code plaatsen als ik het af heb en feedback geven over mijn test...

zal wel morgenochten worden als ik dit af heb, maar meld me zeker weer! mischien doe ik eens gek en gaat het nog lukken vanavond.

bedankt voor je input!
Marc
 
Marc Blom

Marc Blom

30/07/2008 15:32:00
Quote Anchor link
Beste Emmanuel en SanThe,

enorm bedankt voor jullie input en adviezen. Heb de code werkend! De code is redelijk dichtbij de basis gebleven, maar zonder jullie tips en aanwijzingen was het me niet gelukt.

De oplossing zat hem vooral in het netjes weergeven van de code en met name de lussen, zoals ook al door jullie aangegeven (overzichtelijk code maken).

Alle tips hierboven gegeven heb ik uitgeprint en ga ik tijdens mijn vakantie bestuderen zodat ik er van kan leren!

Ik hoop in de toekomst, en dat zal wel nodig zijn, nog eens een beroep op jullie te mogen doen.

De code wil ik jullie niet onthouden, ondanks dat er volgens jullie ongetwijfeld nog verbeteringen kunnen zijn.

Marc.

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
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
110
111
112
                    <?php
// als het formulier nog niet is ingevuld
if(!isset($_POST['submit']))
{

    ?>

                    <h3>Aanmeldpagina</h3>
                    <p>&nbsp;</p>
                    <p>U heeft nog geen eigen startpagina, u kunt zich hier registreren.</p>
                    <p>&nbsp;</p>
                    <form action="aanmeld.php" method="post">
                      <table width="500" border="0" cellspacing="0" cellpadding="0">
                        <tr>
                          <td width="200"><p>Gebruikersnaam</p></td>
                          <td width="300"><input type="text" name="naam" size="40" maxlength="20" /></td>
                        </tr>
                        <tr>
                          <td><p>Wachtwoord</p></td>
                          <td><input type="password" name="wacht1" size="40" maxlength="32" /></td>
                        </tr>
                        <tr>
                          <td><p>Wachtwoord opnieuw</p></td>
                          <td><input type="password" name="wacht2" size="40" maxlength="32" /></td>
                        </tr>
                        <tr>
                          <td><p>Voornaam</p></td>
                          <td><input type="text" name="vnaam" size="40" maxlength="20" /></td>
                        </tr>
                        <tr>
                          <td><p>Achternaam</p></td>
                          <td><input type="text" name="anaam" size="40" maxlength="20" /></td>
                        </tr>
                        <tr>
                          <td><p>Email adres</td>
                          <td><input type="text" name="email" size="40" maxlength="128" /></td>
                        </tr>
                      </table>
                      <br />
                      <input type="submit" name="submit" value="Registreer" />
                    </form>
                    <?php
}
else
{
    // formulier gepost, kijk of alle velden ook daadwerkelijk zijn ingevuld
    if(trim($_POST['naam']) <> "" && trim($_POST['wacht1']) <> "" && trim($_POST['wacht2']) <> "" && trim ($_POST['vnaam']) <> "" && trim ($_POST['anaam']) <> "" && trim($_POST['email']) <> "")
    {

        // formulier ingevuld - controleer op geldige gebruikersnaam
        if(preg_match('/^[a-zA-Z0-9]+$/', $_POST['naam']))
        {

            // formulier ingevuld - kijk eerst of de gebruiker al bestaat
            $res = mysql_query("SELECT * FROM users WHERE gebrnaam='".$_POST['naam']."'") or die(mysql_error());
            if(mysql_num_rows($res) == 0)
            {

                // kijk of de opgegeven wachtwoorden overeenkomen
                if(!strcmp($_POST['wacht1'], $_POST['wacht2']))
                {

                    // wachtwoorden komen overeen - sla alle gegevens op in de database
                    mysql_query("INSERT INTO users (gebrnaam, wwoord, vnaam, anaam, email) VALUES ('".$_POST['naam']."','".md5($_POST['wacht1'])."','".$_POST['vnaam']."','".$_POST['anaam']."','".$_POST['email']."')") or die(mysql_error());
                    // geef melding weer
                    ?>

                    <h3>Registratie geslaagd!</h3>
                    <p>&nbsp;</p>
                    <p>Bedankt voor uw registratie.</p>
                    <p><meta http-equiv="refresh" content="10;url=http://<?=$_POST['naam']?>.blommetje.nl/index" /><a href="http://<?=$_POST['naam']?>.blommetje.nl/index">Klik hier om naar uw startpagina te gaan.</a></p>
                    <p>&nbsp;</p>
                    <?php
                }
                else
                {
                    // wachtwoorden komen niet overeen
                    ?>

                    <h3>Fout</h3>
                    <p>&nbsp;</p>
                    <p>De twee opgegeven wachtwoorden zijn niet hetzelfde.</p>
                    <p>Druk op de "back" knop van je browser en voer twee identieke wachtwoorden in.</p>
                    <?php
                }
            }

            else
            {
                // bestaande gebruiker
                ?>

                <h3>Fout</h3>
                <p>&nbsp;</p>
                <p>Er bestaat al een gebruiker met deze naam.</p>
                <p>Druk op de "back" knop van je browser en geef een andere naam op.</p>
                <?php
            }
        }

        else
        {
            // ongeldige gebruikersnaam
            ?>

            <h3>Fout</h3>
            <p>&nbsp;</p>            
            <p>Er is een ongeldige gebruikersnaam ingevoerd. U kunt alleen letters en cijfers gebruiken.</p>
            <p>Druk op de "back" knop van je browser en geef een geldige naam op.</p>
            <?php
        }
    }

    else
    {
        // sommige velden zijn niet ingevuld
        ?>

        <h3>Fout</h3>
        <p>&nbsp;</p>        
        <p>Alle velden dienen ingevuld te worden.</p>
        <p>Druk op de "back" toets en vul in alle velden wat in.</p>
        <?php
    }
}

?>
Gewijzigd op 01/01/1970 01:00:00 door Marc Blom
 
Gerben Jacobs

Gerben Jacobs

30/07/2008 16:13:00
Quote Anchor link
Nog een tip.

Hoe ik controles altijd doe, is een array aanmaken, dan alle controles doen, en eventuele fouten in de array en dan kijken op het eind.

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
<?php
$errors
= array();
if ($naam == fout || $naam == rare_tekens) {
    $errors[] = "Deze gebruikersnaam wordt niet toegestaan.";
}

if ($email != @-teken) {
    $errors[] = "Dit is een ongeldig e-mailadres";
}


if (count($errors) {
    foreach ($errors as $err) {
        echo $err.'<br/>';
    }
}
else {
    // Doorsturen
}
?>
 
Marc Blom

Marc Blom

30/07/2008 16:19:00
Quote Anchor link
Gerben,

dank voor je aanvulling; volgens mij lijkt deze oplossing op die van SanThe. Kwam daar nog niet helemaal uit mijn html er tussendoor, vandaar dat ik voorlopig daar even op voorborduurde, maar ga er zeker naar kijken.

Marc
 
Gerben Jacobs

Gerben Jacobs

30/07/2008 16:25:00
Quote Anchor link
Oh shxt, ik zie het ja. SanThe heeft precies 't zelfde concept. (Note to self: read entire topics)

Sla dat van mij maar over dan ja ;P
 



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.