[PHP] Meerdere formchecks voor 1 form lelijk of niet ?

Pagina: 1
Acties:
  • 266 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik probeer op een duidelijke manier een fomulier in te laten vullen. Dit lukt best alleen wil ik natuurlijk iemand laten weten wat hij fout doet.

Ik ben eerder bezig geweest met javascript, dit werkt alleen niet altijd met het hiden van bepaalde formfields, dus wil ik een PHP formcheck gebruiken.

Omdat mijn form uit meerdere formfields bestaat zal ik dus achter ieder formfield een regel willen printen als er iets niet klopt.

Om dit voor mijzelf in de code makkelijker te doen had ik het idee om voor ieder formfield een formcheck te maken en deze achter het desbetreffende formfield te plakken. Uiteraard gaat PHP iedere check afzonderlijk af, maar deze zal dat vast ook zo doen als je een grote check doet en alle resultaten achter elkaar op 1 pagina print.

In andere woorden, is dit "not done" of de meest overzichtelijke manier voor jezelf als "programmeur" ?

Acties:
  • 0 Henk 'm!

  • Skit3000
  • Registratie: Mei 2005
  • Laatst online: 18-09 12:59
Je kan zoiets doen om het enigzins overzichtelijk te houden:

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
function formulier1()
{
    $error = array();

    if ($_SERVER["REQUEST_METHOD"] == "POST")
    {
      // For gesubmit, check individuele waarden.
      if (!$_POST["naam"])
      {
        $error["naam"] = "Vul je naam in.";
      }
      if (!$_POST["woonplaats"])
      {
        $error["woonplaats"] = "Woon je nergens ofzo? Geloof er niets van.";
      }
      // Algemene check, als bovenstaande if's correct doorlopen zijn zal de $error array dus leeg zijn.
      if (empty($error))
      {
        echo "Data correct binnen, verdere verwerking hier.";
        // Roep hier eventueel een volgende functie aan voordat deze wordt gestopt.
        return;
      }
    }

    echo "<form method=\"post\">";
    // Output mogelijke foutmeldingen.
    echo "<b>Naam:</b> " . $error["naam"] . "<br />";
    echo "<input type=\"text\" name=\"naam\" value=\"" . $_POST["naam"] . "\" /><br />";
    // Output mogelijke foutmeldingen.
    echo "<b>Woonplaats:</b> " . $error["woonplaats"] . "<br />";
    echo "<input type=\"text\" name=\"woonplaats\" value=\"" . $_POST["woonplaats"] . "\" />";
    echo "</form>";
}

echo "hier de kopttekst van je pagina enzo";
// Schrijf formulier.
formulier1();
echo "en hier de voettekst";


Als je een functie van het formulier maakt kan je als je formulier meerdere pagina's bevat steeds de volgende functie aanroepen zodra de voorgaande geslaagd is.

Acties:
  • 0 Henk 'm!

  • disjfa
  • Registratie: April 2001
  • Laatst online: 03-07 14:47

disjfa

be

Je moet sowiso een php check doen. Javascript kan je uitzetten en heeft zodoende geen enkel nut :) Hoe je het doet ligt aan hoe je programeert. Ik programeer graag php en maak dan een template dus is het gemakkelijker eerst door het formulier te lopen en in de template de errors tonen. Als je php en html doorelkaar baggert bagger je het er lekker tussen. Ik zou alleen wel eerst je formulier checken in je php zodat je nog headers kan meegeven zodat de f5 knop niet dubbelen kan maken.

disjfa - disj·fa (meneer)
disjfa.nl


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Skit3000, jouw manier is hier prima voor moet ik zeggen.

Nu moet ik alleen even het preg_match stukje hier aan toevoegen, ik wilde het namelijk eerst zo doen

PHP:
1
2
3
4
5
6
7
8
function check_field1($field_name_1)
{
  if(!preg_match("/[^a-zA-Z0-9\.\-\Ä\ä\Ö\ö\Ü\ü\
   ]+$/s",$field_name_1))
    return TRUE;
  else
    return FALSE;
}

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
Waarom wil je alleen gewone letters en cijfers toestaan in velden als ik vragen mag? Als beveiliging tegen bijvoorbeeld SQL injectie stelt het niet veel voor en als je alleen normale leestekens wilt toestaan ben je simpeler af met preg_match("/[^\w]", $field_name_1) :)

Verder: wat disjfa zei ;)

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

Verwijderd

als je je wil beveiligen tegen SQL Injection dan kan je beter iets van mysql_real_escape_string() of add_slashes() oid gebruiken.

Verder nog een kleine opmerking over de code van Skit3000. if(!$var) is not done eigenlijk. Als je wil checken of een variabele bestaat of niet gebruik je daar isset() of empty() voor. Als je variabele nu bestaat en de waarde FALSE heeft, dan krijg je ook een foutmelding. Zit je niet echt op te wachten.

Acties:
  • 0 Henk 'm!

  • remcotolsma
  • Registratie: December 2005
  • Laatst online: 08-09 11:11
Persoonlijk vind ik het nooit handig om hele formulieren e.d. te echo'en. Ik vind deze manier wat overzichtelijker:

PHP:
1
2
3
4
5
6
7
8
9
10
11
$errors = array();

if(isset($_POST['submit'])) {
  if(empty($_POST['naam'])) {
    $errors['naam'] = 'Vul je naam in.';
  } 

  if(empty($_POST['woonplaats'])) {
    $errors['woonplaats'] = 'Woon je nergens ofzo? Geloof er niets van.';
  } 
}

HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<form method="post" action="#">
  <div>
    <label>
      <strong>Naam:</strong>
      <input type="text" name="naam" />
      <?= isset($errors['name']) ? $errors['name'] : '' ?>
    </label>
  </div>
  <div>
    <label>
      <strong>Woonplaats:</strong>
      <input type="text" name="naam" />
      <?= isset($errors['name']) ? $errors['name'] : '' ?>
    </label>
  </div>
</form>
Verwijderd schreef op woensdag 18 juli 2007 @ 01:59:
PHP:
1
2
3
4
5
6
7
8
function check_field1($field_name_1)
{
  if(!preg_match("/[^a-zA-Z0-9\.\-\Ä\ä\Ö\ö\Ü\ü\
   ]+$/s",$field_name_1))
    return TRUE;
  else
    return FALSE;
}
Waarom controleer je eerst of het resultaat van preg_match true of false is en return je daarna hetzelfde? :+

PHP:
1
2
3
4
5
function check_field1($field_name_1)
{
  return !preg_match("/[^a-zA-Z0-9\.\-\Ä\ä\Ö\ö\Ü\ü\
   ]+$/s",$field_name_1);
}

Acties:
  • 0 Henk 'm!

  • RRX
  • Registratie: Mei 2000
  • Laatst online: 29-05 15:34

RRX

@life-

Skit3000 schreef op woensdag 18 juli 2007 @ 01:16:
Je kan zoiets doen om het enigzins overzichtelijk te houden:

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
function formulier1()
{
    $error = array();

    if ($_SERVER["REQUEST_METHOD"] == "POST")
    {
      // For gesubmit, check individuele waarden.
      if (!$_POST["naam"])
      {
        $error["naam"] = "Vul je naam in.";
      }
      if (!$_POST["woonplaats"])
      {
        $error["woonplaats"] = "Woon je nergens ofzo? Geloof er niets van.";
      }
      // Algemene check, als bovenstaande if's correct doorlopen zijn zal de $error array dus leeg zijn.
      if (empty($error))
      {
        echo "Data correct binnen, verdere verwerking hier.";
        // Roep hier eventueel een volgende functie aan voordat deze wordt gestopt.
        return;
      }
    }

    echo "<form method=\"post\">";
    // Output mogelijke foutmeldingen.
    echo "<b>Naam:</b> " . $error["naam"] . "<br />";
    echo "<input type=\"text\" name=\"naam\" value=\"" . $_POST["naam"] . "\" /><br />";
    // Output mogelijke foutmeldingen.
    echo "<b>Woonplaats:</b> " . $error["woonplaats"] . "<br />";
    echo "<input type=\"text\" name=\"woonplaats\" value=\"" . $_POST["woonplaats"] . "\" />";
    echo "</form>";
}

echo "hier de kopttekst van je pagina enzo";
// Schrijf formulier.
formulier1();
echo "en hier de voettekst";


Als je een functie van het formulier maakt kan je als je formulier meerdere pagina's bevat steeds de volgende functie aanroepen zodra de voorgaande geslaagd is.
je kan ook een array maken met alle velden en de meldingen die je bij welk veld wil geven en daar doorheen loopen. is nog netter ;)

mijn T.net systeemspecspagina


Acties:
  • 0 Henk 'm!

Verwijderd

Dit soort dingen kun je imho dan weer beter object georiënteerd benaderen. Voor elk form element heb je gewoon een object, en dat object moet op de hoogte zijn van de regels die voor het veld gelden. Dus als je alle form elementen langsloopt in een loopje, roep je voor elk van de objecten een of andere validate method aan. Je zou kunnen vastleggen dat deze method true/false teruggeeft, of dat deze een array teruggeeft met de problemen voor dat veld. Op deze manier kun je zelfs meerdere dingen tegelijk detecteren. Een naam is misschien te kort, en bevat tegelijkertijd ongeldige tekens.

En functienamen als check_field1 zijn natuurlijk uit den boze. Heb je functies die bij bepaalde ander e dingen horen, en bij niets anders? Gebruik dan objecten en maak er methods van.

Acties:
  • 0 Henk 'm!

  • storeman
  • Registratie: April 2004
  • Laatst online: 12:59
Ik gebruik zelf wforms validation. Werkt makkelijk en is goed te customizen. Okee, javascript kun je uitzetten, maar als het om gebruiksvriendelijkheid gaat, dan is het verschil tussen die twee niet relevant.

Met betrekking tot veiligheid kun je natuurlijk het beste php gebruiken (addslashes()).

"Chaos kan niet uit de hand lopen"


Acties:
  • 0 Henk 'm!

  • st0p
  • Registratie: April 2004
  • Laatst online: 19-07-2024
storeman schreef op woensdag 18 juli 2007 @ 17:43:
Ik gebruik zelf wforms validation. Werkt makkelijk en is goed te customizen. Okee, javascript kun je uitzetten, maar als het om gebruiksvriendelijkheid gaat, dan is het verschil tussen die twee niet relevant.

Met betrekking tot veiligheid kun je natuurlijk het beste php gebruiken (addslashes()).
no offence, maar ik ben het absoluut niet met je eens...
1) als je alleen javascript gebruikt om gebruikersinput te checken, maak dan ook je site zo dat javascript vereist is voor het gebruik van je site (ik snap dat mensen anno 2007 verwachten dat je browser javascript ondersteund maar er zijn genoeg mensen die het uit hebben staan...) en als je SQL query eruitklapt omdat je javascript uit hebt staan, dan komt dat als nog niet gebruiks vriendelijk over.

2) dat je voor veiligheid het beter PHP dan javascript kan gebruiken ben ik met je eens, maar gebruik in godsnaam mysql_real_escape_string in plaats van addslashes.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
OK, allen dank... ik heb een lange functie gemaakt en check uiteindelijk of de error leeg is:

PHP:
1
2
3
4
5
6
7
8
// Algemene check, als bovenstaande if's correct doorlopen zijn zal de $error array dus leeg zijn.
      if (empty($error))
      {
        echo "Data correct binnen, verdere verwerking hier.";
        // Roep hier eventueel een volgende functie aan voordat deze wordt gestopt.
        return;
      }
    }


Ik moet alleen een mogelijkheid zien te vinden om hier het formulier te verzenden. Ik zit er over te denken om hier het begin van de form neer te zetten dat alles naar een volgende pagina verzendt en het begin van het eigenlijke form dat naar zichzelf stuurt om te checken met een if() uit te schakelen wanneer de error leeg is en het formulier gepost.

Of is dit erg dirty ?

[ Voor 5% gewijzigd door Verwijderd op 19-07-2007 00:46 ]


Acties:
  • 0 Henk 'm!

  • disjfa
  • Registratie: April 2001
  • Laatst online: 03-07 14:47

disjfa

be

Je zet een paar regels code neer en zegt erna dat dat je je afvraagt of het dirty is. Is dat niet een keuze voor jezelf. Wij weten niet wat je if statement is, wij weten niet wat jij aan het maken bent. Denk jij dat je normaal met je code om kan gaan als je het in werkelijkheid gaat gebruiken. Dan is het niet dirty. Mischien over een paar maanden. Maar nu niet. En jij bent de enige die je code moet begrijpen.

Dus maak vooral wat je zelf wilt en zelf makkelijk begrijpbaar vind :) Kunnen wij weinig over zeggen.

disjfa - disj·fa (meneer)
disjfa.nl


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
disjfa schreef op donderdag 19 juli 2007 @ 00:49:
[...]

Je zet een paar regels code neer en zegt erna dat dat je je afvraagt of het dirty is. Is dat niet een keuze voor jezelf. Wij weten niet wat je if statement is, wij weten niet wat jij aan het maken bent. Denk jij dat je normaal met je code om kan gaan als je het in werkelijkheid gaat gebruiken. Dan is het niet dirty. Mischien over een paar maanden. Maar nu niet. En jij bent de enige die je code moet begrijpen.

Dus maak vooral wat je zelf wilt en zelf makkelijk begrijpbaar vind :) Kunnen wij weinig over zeggen.
Dit klinkt hoopvol, waarom ?

Nou simpel omdat iemand zegt dat het om het uiteindelijke doel gaat... finetuning kan altijd.

Ik ga mijn idee gewoon eerst gebruiken, dat werkt namelijk zeker.

Acties:
  • 0 Henk 'm!

Verwijderd

remcotolsma schreef op woensdag 18 juli 2007 @ 10:41:
Persoonlijk vind ik het nooit handig om hele formulieren e.d. te echo'en. Ik vind deze manier wat overzichtelijker:

HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<form method="post" action="#">
  <div>
    <label>
      <strong>Naam:</strong>
      <input type="text" name="naam" />
      <?= isset($errors['name']) ? $errors['name'] : '' ?>
    </label>
  </div>
  <div>
    <label>
      <strong>Woonplaats:</strong>
      <input type="text" name="naam" />
      <?= isset($errors['name']) ? $errors['name'] : '' ?>
    </label>
  </div>
</form>
Dan geef ik persoonlijk de voorkeur voor:

PHP:
1
<?php if ( isset($errors['name']) ) echo $errors['name'] ?>


Al is het maar omdat dit "leesbaar" is, je leest als persoon exact wat het script gaat doen. Persoonlijk dus :)

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
Als je toch over leesbaarheid gaat zeuren, waarom laat je dan wel die zo goed als nutteloze check erin staan?
PHP:
1
<?= $errors['name'] ?>

Dit zal qua uitvoer altijd hetzelfde resultaat weergeven als die isset controle. Ga maar na: de waarde kan NULL, true, false of een string zijn (waarbij ik types als int's ook tot strings reken qua uitvoer). Voor NULL zal die isset wel true opleveren maar is de echo nog steeds leeg, voor true zal de uitvoer 1 zijn in beide gevallen en voor false zal de uitvoer leeg zijn. Dat er voor een string geen verschil is is evident.

Instinctief vind ik het ook netter, maar als je geen andere actie aan een waarde hangt dan het uitvoeren van die waarde is die hele check effectief overbodig.

Overigens zou ik persoonlijk het nog anders aanpakken:
HTML:
1
2
3
4
5
    <label> 
      <strong>Naam:</strong> 
      <input type="text" name="naam" /> 
      {$errors.name}
    </label>


En dan fijn m'n template parser een errors array meegeven :Y)

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

Verwijderd

FragFrog schreef op donderdag 19 juli 2007 @ 03:18:
Als je toch over leesbaarheid gaat zeuren, waarom laat je dan wel die zo goed als nutteloze check erin staan?
PHP:
1
<?= $errors['name'] ?>

Dit zal qua uitvoer altijd hetzelfde resultaat weergeven als die isset controle. Ga maar na: de waarde kan NULL, true, false of een string zijn (waarbij ik types als int's ook tot strings reken qua uitvoer). Voor NULL zal die isset wel true opleveren maar is de echo nog steeds leeg, voor true zal de uitvoer 1 zijn in beide gevallen en voor false zal de uitvoer leeg zijn. Dat er voor een string geen verschil is is evident.

Instinctief vind ik het ook netter, maar als je geen andere actie aan een waarde hangt dan het uitvoeren van die waarde is die hele check effectief overbodig.
Ik had het over leesbaarheid: dat je duidelijk ziet wat het programma doet, niet het zo compact als mogelijk maken. In jouw voorbeeld lijkt het alsof hij altijd de error neerzet, in mijn voorbeeld is duidelijk te zien dat hij dat enkel doet als hij ingesteld is, en dat dit de hele bedoeling er van is. Dus: Een error laten zien als een error ingesteld is.

Dat het resultaat van de PHP parser hetzelfde is, is een bijzaak. Die .0001 seconde snellere runtime gaat weer verloren als een programmeur door onduidelijkheid in de code een kwartier kwijt is ($$$).


Besides, ik haal niet graag een waarde uit een assoc. array, als de key die ik opvraag niet bestaat. Al is het maar omdat ik met E_ALL develop. :)

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
Verwijderd schreef op donderdag 19 juli 2007 @ 03:32:
Ik had het over leesbaarheid: dat je duidelijk ziet wat het programma doet, niet het zo compact als mogelijk maken. In jouw voorbeeld lijkt het alsof hij altijd de error neerzet, in mijn voorbeeld is duidelijk te zien dat hij dat enkel doet als hij ingesteld is, en dat dit de hele bedoeling er van is. Dus: Een error laten zien als een error ingesteld is.
Ongetwijfeld een kwestie van smaak, maar ik vind minder code doorgaans beter leesbaar. Al was het alleen maar omdat je minder stappen in je hoofd hoeft te doen alvorens je weet wat iets doet. Snelheid is natuurlijk irrelevant, extra code neerplempen daarentegen niet. Al was het alleen maar omdat je op deze manier business en output logic aan het mengen bent.

Je hebt wel een punt dat het een notice oplevert, maar zoals gezegd, ik werk met een templateparser (Smarty doorgaans) en dan geldt dat bezwaar niet :)

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • Salteh
  • Registratie: Januari 2003
  • Laatst online: 18-09 18:54
Gebruik zelf ook een array met daar de errors in, smarty die dit uitleest en er wat meldingen aan de gebruikers over geeft.

Verder zijn de formulieren zo opgebouwd:
HTML:
1
<div class="label {if in_array('username', $error)} error {/if}">Username</div>

Met daarna dus het invoerveld zelf.

Het label van een invoerveld wat verkeerd, of helemaal niet, ingevuld is krijgt dus de div class "label error", wat ervoor zorgt dat het label rood gekleurd is.

BetterShifting.com | Strava


Acties:
  • 0 Henk 'm!

Verwijderd

Een mooi voorbeeld van hoe het niet moet. Het is niet handig om alle namen van velden die errors hebben in een array bij te houden. Je kunt dan beter een object hebben dat een veld vertegenwoordigt, en daarin de errors voor dat veld bijhouden.

Vervolgens geef je dat object een method die de template variabelen teruggeeft, waaronder misschien wat classNames. Zo zal een veld voor een postcode misschien wel een andere className hebben dan een veld voor een e-mail adres. Houd dingen die bij elkaar horen bij elkaar.

Je kunt best array's gebruiken, maar ga die niet aan de templates geven als daar nog weer in gezocht moet gaan worden. Dat moet helemaal niet nodig zijn. Een template moet simpel.

[edit]
<div class="label">... is natuurlijk ook wel een beetje om te huilen.

[ Voor 5% gewijzigd door Verwijderd op 20-07-2007 01:37 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Als ik op deze manier meerdere error messages genereer:

PHP:
1
$errors['naam'] = 'Vul je naam in.';


Kan ik dan op een of andere manier een if statement maken dat als er een willekeurige error voorkomt dat ik iets van " er is een fout opgetreden, kijk hieronder voor meer info" kan weergeven aan het begin van de pagina ?

ik dacht aan iets van

PHP:
1
if($errors//en-dan-ergens-een-wildcard-ofzo//) !=' ' ) { echo foo; } 

[ Voor 14% gewijzigd door Verwijderd op 20-07-2007 17:00 ]


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
PHP:
1
2
3
if(count($errors)) {
  // echo blaat
}


;)

[ Voor 3% gewijzigd door FragFrog op 20-07-2007 17:22 ]

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
FragFrog schreef op vrijdag 20 juli 2007 @ 17:21:
PHP:
1
2
3
if(count($errors)) {
  // echo blaat
}


;)
Wow, dat werkt, erg bedankt !
Pagina: 1