[PHP] Hoe beste valideren?

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

Onderwerpen


  • MsG
  • Registratie: November 2007
  • Laatst online: 16:39

MsG

Forumzwerver

Topicstarter
Voor een te maken website voor school, moeten we eerst een enquete houden onder leerlingen. Omdat op onze opleiding onze kennis nooit in de praktijk bij de opdrachten wordt gevraagd, besloot ik om in plaats van bij een gratis formservicesite een formulier te maken, er zelf 1 te maken met mijn geringe PHP kennis. Dit is wat ik er tot nu toe van gebakken heb en werkt perfect:

*snip*

Nu wil ik alleen nog zorgen dat hij gevalideerd erdoor heen komt, dit is opzich niet zo'n punt, gewoon de variabelen uitlezen en pas als er geen variabele leeg is het formulier echt in de database gooien. Alleen weet ik niet wat nou een beetje goede manier is, ik wil namelijk het liefst dat de foutmelding in het formulier zelf weer komt, in plaats van usabilityloos opgesomd in een leeg scherm. Nu kan ik dit wel oplossen met tientallen If-statements, alleen ik vroeg me gaandeweg af of er niet een wat efficientere methode is. En via internet kwam ik eigenlijk enkel de wat minder gebruikersvriendelijke methoden tegen. Met javascript had je zoiets als innerHTML, waardoor je iets in een stuk html bij kon plaatsen zonder het hele formulier dubbel in je script te hebben. Hoe pakken jullie dit aan en hoe kan ik het het beste doen?

*snip*

offtopic:
Hoe maak ik de code PHP? Tweakers vind hem te lang als ik code=php gebruik.

[ Voor 92% gewijzigd door Creepy op 21-12-2007 08:56 ]

Denk om uw spatiegebruik. Dit scheelt Tweakers.net kostbare databaseruimte! | Groninger en geïnteresseerd in Domotica? Kom naar DomoticaGrunn


  • Cyphax
  • Registratie: November 2000
  • Laatst online: 19:48

Cyphax

Moderator LNX
Ach met javascript lijkt me best een aardige oplossing. Je zou bij elk veld de bijbehorende foutmelding kunnen plaatsen in HTML en ze dan standaard verbergen, en door de validatie in javascript de juiste dan tonen. Dan heb je een iets grotere hoeveelheid html, maar wel minder javascript.

Vergeet niet ook serverside toch een controle uit te voeren op de inhoud, of je nou javascript client-side laat checken of niet.

Saved by the buoyancy of citrus


  • MsG
  • Registratie: November 2007
  • Laatst online: 16:39

MsG

Forumzwerver

Topicstarter
Maar het nadeel met JS is, dat je de validatie van de gebruiker laat afhangen. In dit geval is het geen ramp, maar ik hoor liever een betere methode :-).

Denk om uw spatiegebruik. Dit scheelt Tweakers.net kostbare databaseruimte! | Groninger en geïnteresseerd in Domotica? Kom naar DomoticaGrunn


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

disjfa

be

Een foreach loopje met desnoods een switch erin? Simpel toch.

En js moet je idd niet gebruiken voor validatie als het serverside nog niet eens werkt.

disjfa - disj·fa (meneer)
disjfa.nl


  • Cyphax
  • Registratie: November 2000
  • Laatst online: 19:48

Cyphax

Moderator LNX
Hoe bedoel je "dat je de validatie van de gebruiker laat afhangen"? Als je het grafisch wilt doen op jouw manier kun je dat met wat handige javascript het makkelijkst doen. Het scheelt ook een refresh van de pagina. Je zou kunnen overwegen het gedeelte javascript mbv PHP te schrijven door via de querystring variabelen door te sturen maar dan moet je wel refreshen en je zit weer extra PHP te schrijven in een pagina die dat verder niet nodig heeft.

Saved by the buoyancy of citrus


  • MsG
  • Registratie: November 2007
  • Laatst online: 16:39

MsG

Forumzwerver

Topicstarter
Ik zal eens googlen op jouw methodes. Waar ik vooral mee zat was dat, ik eerst kijk of er wel gesubmit is en zo niet ik het formulier laat zien. Maar als ik dus de foutmeldingen tussen de velden van het formulier moet hebben, moet ik in de submit afhandeling wéér stukken formulier plaatsen, dat leek me wat overbodig en dubbel.
Cyphax schreef op donderdag 20 december 2007 @ 23:49:
Hoe bedoel je "dat je de validatie van de gebruiker laat afhangen"? Als je het grafisch wilt doen op jouw manier kun je dat met wat handige javascript het makkelijkst doen. Het scheelt ook een refresh van de pagina. Je zou kunnen overwegen het gedeelte javascript mbv PHP te schrijven door via de querystring variabelen door te sturen maar dan moet je wel refreshen en je zit weer extra PHP te schrijven in een pagina die dat verder niet nodig heeft.
Ik bedoel dat als de gebruiker JS heeft uitstaan (heeft ie niet, maar toch) de hele validatie niet werkt en hij toch nog alles pakt.

[ Voor 51% gewijzigd door MsG op 20-12-2007 23:52 ]

Denk om uw spatiegebruik. Dit scheelt Tweakers.net kostbare databaseruimte! | Groninger en geïnteresseerd in Domotica? Kom naar DomoticaGrunn


  • ID-College
  • Registratie: November 2003
  • Laatst online: 21:03
Als ik het goed begrijp wil je dus de foutmeldingen weergeven als iets niets is ingevuld of zit ik ernaast?
Dus zonder refresh?

[ Voor 8% gewijzigd door ID-College op 20-12-2007 23:51 ]


  • MsG
  • Registratie: November 2007
  • Laatst online: 16:39

MsG

Forumzwerver

Topicstarter
De refresh maakt niet uit, het formulier mag best mét foutmeldingen pas terugkomen als er gesubmit is (anders wordt de enige oplossing zeker Ajax?), maar ik wil eigenlijk dat ALS er een fout is gevonden, hij het formulier weer laat zien, maar op de plekken waar het fout is gegaan nu een stukje foutmelding. Maar hoe pak ik dit aan zonder het formulier gewoon te copy pasten en te bewerken per foutmelding? Want dat werkt prima en zal zeer waarschijnlijk ook niet slomer zijn, maar het voelt als een vrij inefficiente en niet nette manier.

Denk om uw spatiegebruik. Dit scheelt Tweakers.net kostbare databaseruimte! | Groninger en geïnteresseerd in Domotica? Kom naar DomoticaGrunn


  • Cyphax
  • Registratie: November 2000
  • Laatst online: 19:48

Cyphax

Moderator LNX
MsG schreef op donderdag 20 december 2007 @ 23:50:
Ik zal eens googlen op jouw methodes. Waar ik vooral mee zat was dat, ik eerst kijk of er wel gesubmit is en zo niet ik het formulier laat zien. Maar als ik dus de foutmeldingen tussen de velden van het formulier moet hebben, moet ik in de submit afhandeling wéér stukken formulier plaatsen, dat leek me wat overbodig en dubbel.

Ik bedoel dat als de gebruiker JS heeft uitstaan (heeft ie niet, maar toch) de hele validatie niet werkt en hij toch nog alles pakt.
Onder andere om die reden moet je serverside ook controleren. Ik ging er alleen vanuit dat je naar een PHP-script submitte die de input afhandelde. Ik zou die 2 dingen echt even opdelen in een html-bestand voor je formulier en een PHP-bestand voor de submit. Dat schoont de boel nogal op. :)

Saved by the buoyancy of citrus


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

disjfa

be

Gewoon posten naar zichzelf :? Flormulier altijd weer invullen. Foutmelding erbij.

disjfa - disj·fa (meneer)
disjfa.nl


  • MsG
  • Registratie: November 2007
  • Laatst online: 16:39

MsG

Forumzwerver

Topicstarter
Ik ga denk ik even maken hoe ik het in eerste instantie dacht en dan post ik hem hier wel en dan hoor ik wel of het efficienter kan :-).

@disjfa, ik post hem nu toch naar zichzelf? met action="index.php" of bedoel je iets anders?
offtopic:
ben nog een beetje een nieuweling in php

Denk om uw spatiegebruik. Dit scheelt Tweakers.net kostbare databaseruimte! | Groninger en geïnteresseerd in Domotica? Kom naar DomoticaGrunn


  • ID-College
  • Registratie: November 2003
  • Laatst online: 21:03
Hmm dat is niet zo moeilijk.
Wat ik altijd doe is een check.php en een layout.php bestand. In het layout.php bestand zet ik de tabellen en layout.
Als form action doe ik check.php.
In check.php check ik alle waarden. Daarmee maak ik een array. Dmv array_push gooi ik de fouten (lege velden oid) in een array. In layout.php kijk ik of er een array is, zoja lees ik die uit, daar staan dus de fouten in. Dan komt alles onder elkaar wat er niet goed is gegaan.
Zo zijn er nog talloze oplossingen, deze gebruik ik meestal :)

Edit: Als hij index.php heet post je hem naar jezelf.
Dan kan je gewoon dit achter een textfield plakken:
PHP:
1
2
if(empty($_POST["veldnaam"]))
  print "veld niet ingevuld";

Ben al een jaar uit PHP, maar als je dit erachter plakt moet het toch werken. ?

[ Voor 20% gewijzigd door ID-College op 21-12-2007 00:03 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Persoonlijk vind ik zowel server side als client side validatie het mooist. Client side validatie mbv javascript voor een snelle en makkelijk te programmeren terug koppeling naar de bezoeker en daarnaast server side validatie omdat je eigenlijk nooit mag vertrouwen op client side validatie. De server side validatie zou ik vrij basic houden met zo min mogelijk feedback naar de bezoeker omdat deze eigenlijk altijd goed gevalideerd zou moeten worden tenzij de bezoeker de client side validatie probeerd te omzeilen.

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Heel erg simpel gezegd, je kan met JS je input valideren, als het dan fout gaat dan kan je een nette foutmelding geven in het formulier.

Daarna controleer je het nog een keer server-side en als je dan een fout vind heeft de gebruiker of JS uitstaan ( niet erg waarschijnlijk met jouw doelgroep schat ik ) of hij is doelbewust aan het proberen of hij rond je validatie komt, hier kan je wat mij betreft gewoon een simpele FOUT, wilt u weten waar het fout ging zet dan JS aan. op een lege pagina tonen.

Zo doe ik het in ieder geval over het algemeen met sites waarbij ik kan voorspellen dat JS aanstaat, degene die toch FOUT, wilt u weten waar het fout ging zet dan JS aan. krijgen weten in 9 van de 10 keer wel waar het aan ligt.

Voorbeeldje, als ik je form submit en ik zeg dat op vraag 1 het antwoord misschien is, wat voor foutmelding wou jij dan gaan genereren???
ID-College schreef op donderdag 20 december 2007 @ 23:58:
Hmm dat is niet zo moeilijk.
Wat ik altijd doe is een check.php en een layout.php bestand. In het layout.php bestand zet ik de tabellen en layout.
Als form action doe ik check.php.
In check.php check ik alle waarden. Daarmee maak ik een array. Dmv array_push gooi ik de fouten (lege velden oid) in een array. In layout.php kijk ik of er een array is, zoja lees ik die uit, daar staan dus de fouten in. Dan komt alles onder elkaar wat er niet goed is gegaan.
Zo zijn er nog talloze oplossingen, deze gebruik ik meestal :)

Edit: Als hij index.php heet post je hem naar jezelf.
Dan kan je gewoon dit achter een textfield plakken:
PHP:
1
2
if(empty($_POST["veldnaam"]))
  print "veld niet ingevuld";

Ben al een jaar uit PHP, maar als je dit erachter plakt moet het toch werken. ?
Werkt wel, maar bij 1e x op de pagina komen is je post zeer waarschijnlijk leeg, en dan is het imho niet netjes om gelijk dit soort meldingen te geven. Laat een gebruiker eerst maar ploeteren...

[ Voor 38% gewijzigd door Gomez12 op 21-12-2007 00:12 ]


Acties:
  • 0 Henk 'm!

  • MsG
  • Registratie: November 2007
  • Laatst online: 16:39

MsG

Forumzwerver

Topicstarter
:)het ging er meer om dat een of andere aap niet de lege options kiest (ik heb die bewust er in gedaan om zo niet bevooroordeeld te zijn met een keuze als enquete-opsteller).

Echter heb ik de index met de layout nu gestript van de code, alleen nu doet hij niks meer :S. Ik zie de fout niet:

*snip*

[ Voor 98% gewijzigd door Creepy op 21-12-2007 08:56 ]

Denk om uw spatiegebruik. Dit scheelt Tweakers.net kostbare databaseruimte! | Groninger en geïnteresseerd in Domotica? Kom naar DomoticaGrunn


Acties:
  • 0 Henk 'm!

  • MsG
  • Registratie: November 2007
  • Laatst online: 16:39

MsG

Forumzwerver

Topicstarter
Ik heb de fout al. Een of andere grapjas hier heeft m'n database gewist :).

Denk om uw spatiegebruik. Dit scheelt Tweakers.net kostbare databaseruimte! | Groninger en geïnteresseerd in Domotica? Kom naar DomoticaGrunn


Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 19:48

Cyphax

Moderator LNX
:D
Tijd om het principe van SQL-injectie eens door te lezen en maatregelen te nemen, als dat hier al niet aan de hand was komt dat nog wel. ;)
Hoort ook bij de serverside checks op de input (met als uitgangspunt: vertrouw nooit input van een gebruiker).

[ Voor 12% gewijzigd door Cyphax op 21-12-2007 00:31 ]

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • MsG
  • Registratie: November 2007
  • Laatst online: 16:39

MsG

Forumzwerver

Topicstarter
:p was jij dat dan? of niet

Denk om uw spatiegebruik. Dit scheelt Tweakers.net kostbare databaseruimte! | Groninger en geïnteresseerd in Domotica? Kom naar DomoticaGrunn


Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 19:48

Cyphax

Moderator LNX
Uiteraard niet, da's niet de meest beleefde vorm om iemand te wijzen op een fout in z'n code. 'k Zou het ook niet waarderen als iemand dat bij mij deed. :)

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Is Ruby on Rails anders een mogelijkheid voor je? In dat raamwerk zitten al wat validators voor dit soort werk, en als ruby niet een mogelijkheid is zal een railsclone het vast ook wel bevatten, e.g. CakePHP of code igniter.

Ervanuitgaande dat een persoon maar hooguit 1 enquete mag afleggen, zou heb je in je model dan zoiets.

/app/models/person.rb
Ruby:
1
2
3
4
5
6
7
class Person < ActiveRecord::Base
  #evt has_many :survey_answers

  validates_presence_of :name, :message => "Je moet een naam opgeven"
  validates_numericality_of :age, :greater_than => 15, :only_integer => true
  #etc...
end


/app/models/survey.rb
Ruby:
1
2
3
class Survey < ActiveRecord::Base
  has_many :survey_answers
end


/app/models/survey_answer.rb
Ruby:
1
2
3
4
5
6
7
class SurveyAnswer < ActiveRecord::Base
  belongs_to :survey
  belongs_to :person

  validates_uniqueness_of :person_id, :scope => :survey_id #bij gebrek aan composite keysupport
  #Hier nog meer validators die evt nodig zijn.
end


In je controller:

survey_controller.rb
Ruby:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class SurveyController < ApplicationController
  def process #verwerk enquete actie
    @person  = Person.new({:name => params[:name], :age => params[:age]})
    @enquete = Enquete.new #hier je constructor variabelen in knallen
    @enquete.person = @person

    if @person.valid? && @enquete.valid?
      person.save! #evt exception opvangen
      enquete.save! #ditto
    else
      render :action => :show, :id => params[:id]
      return
    end
  end

  def show #actie om je enquete te laten zien
    @survey = Survey.find_by_id(params[:id])
    #...
  end
end


In je view om alle errors in 1x te laten zien:
RHTML:
1
2
<%= error_messages_for 'person', 'enquete' %>
<!-- hier de rest van je html -->


Of voor een bepaalde property van een bepaalde model:
RHTML:
1
2
<%= error_messages_on 'person', 'name' %>
Je naam: <input type="text" name="name" />


Niet teveel waarde hechten aan m'n code btw, kan evt fouten bevatten, maar 'k ben net terug van uitgaan, dus vergeef me ;) Het is meer om om je even te laten zien hoe het ook (lees: netter, veiliger (de default properties en finders worden by default ge-escaped iirc) en eenvoudiger) kan.

[ Voor 10% gewijzigd door prototype op 21-12-2007 03:03 ]


Acties:
  • 0 Henk 'm!

  • LDenninger
  • Registratie: Augustus 2005
  • Laatst online: 02-08-2024
Jeuzus, heb je dat allemaal met de hand uitgeschreven ? :D

Was het niet veel simpeler geweest om de vragen en mogelijke antwoorden eventjes in een database te zetten en het form te genereren ofzo ?

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
offtopic:
MsG, edit eens je berichten zodat je [php] [/php] tags gebruikt ipv code tags, dan werkt syntax highlighting tenminste. :)


En die selects moet je echt minsten dmv een functie maken.

{signature}


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 19:51

Creepy

Tactical Espionage Splatterer

Ok, ff een kleine opschoon actie gehouden.

Het is hier niet de bedoeling je code te dumpen te hopen dat wij het voor je gaan fixen. Code geven is prima maar geef dan alleen de relevante code (dus niet alle!).
Kijk ook aub eens naar Programming Beleid - De Quickstart zodat je weet wat we van een topicstart (en een vraag) verwachten.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • MsG
  • Registratie: November 2007
  • Laatst online: 16:39

MsG

Forumzwerver

Topicstarter
De code was meer ter verduidelijking, maar is goed. Ik zal vandaag nog even het een en ander maken.

@LDenninger, ja helemaal met de hand :).

Denk om uw spatiegebruik. Dit scheelt Tweakers.net kostbare databaseruimte! | Groninger en geïnteresseerd in Domotica? Kom naar DomoticaGrunn


Acties:
  • 0 Henk 'm!

  • MsG
  • Registratie: November 2007
  • Laatst online: 16:39

MsG

Forumzwerver

Topicstarter
Ik ben nu weer bezig met de enquete maar opeens werkt het volgende niet meer:

PHP:
1
mysql_query("INSERT INTO enquete_antwoorden(geslacht, leeftijd, relatie, opleiding, woonplaats, vraag_1_internetvaardigheid, vraag_2_kroeggedrag, vraag_3_kroegstijl, vraag_4_profielensites,   vraag_5_kleur, vraag_6a_naam, vraag_6b_achternaam,  vraag_6c_geslacht,  vraag_6d_leeftijd, vraag_6e_email, vraag_6f_woonplaats, vraag_6g_telefoonnummer, vraag_7a_forum, vraag_7b_uitgaansagenda,   vraag_7c_fotoalbums, vraag_7d_privatemessaging, ip_adres) VALUES ('$geslacht', '$leeftijd', '$relatie', '$opleiding', '$woonplaats', '$vraag_1', '$vraag_2', '$vraag_3', '$vraag_4', '$vraag_5', '$vraag_6a', '$vraag_6b', '$vraag_6c','$vraag_6d', '$vraag_6e', '$vraag_6f', '$vraag_6g', '$vraag_7a', '$vraag_7b', '$vraag_7c', '$vraag_7d', '$ip')");


Eerst werkte het altijd, ik heb niks veranderd. Ook klopt user + pw e.d. gewoon 8)7

Denk om uw spatiegebruik. Dit scheelt Tweakers.net kostbare databaseruimte! | Groninger en geïnteresseerd in Domotica? Kom naar DomoticaGrunn


Acties:
  • 0 Henk 'm!

  • Dennahz
  • Registratie: November 2001
  • Laatst online: 17-09 21:50

Dennahz

Life feels like hell should.

or die (mysql_error()); erachter zetten en kijken wat voor fout je krijgt. Lees anders wat tutorials door, dit is opzich erg basis allemaal.

Twitter


Acties:
  • 0 Henk 'm!

  • Deikke
  • Registratie: Juni 2004
  • Laatst online: 06:44
doe eens

or die(mysql_error);

erachter, 9 van de 10x vind je dan de fout.

Acties:
  • 0 Henk 'm!

  • djiwie
  • Registratie: Februari 2002
  • Laatst online: 17-09 16:35

djiwie

Wie?

Wat krijg je dan voor error?
En check je datastructuur eens, je hebt nu allerlei (min of meer) repeating groups.

Acties:
  • 0 Henk 'm!

  • MsG
  • Registratie: November 2007
  • Laatst online: 16:39

MsG

Forumzwerver

Topicstarter
Bedankt jongens :) het was een veldnaam welke ik had veranderd.

Maar ik zit al een poos met het volgende:

Ik gebruik dit als check of hij verzonden mag worden:
PHP:
1
2
3
4
5
6
7
if (isset($_POST['submit']) && maysend == true)
                                    {
                                        mysql_query("INSERT INTO enquete_antwoorden(geslacht, leeftijd, relatie, opleiding, woonplaats, vraag_1_internetvaardigheid, vraag_2_kroeggedrag, vraag_3_kroegstijl, vraag_4_profielensites,   vraag_5_kleur, vraag_6a_naam, vraag_6b_achternaam,  vraag_6c_geslacht,  vraag_6d_leeftijd, vraag_6e_email, vraag_6f_woonplaats, vraag_6g_telefoonnummer, vraag_7a_forum, vraag_7b_uitgaansagenda,   vraag_7c_fotoalbums, vraag_7d_privatemessaging, ip_adres) VALUES ('$geslacht', '$leeftijd', '$relatie', '$opleiding', '$woonplaats', '$vraag_1', '$vraag_2', '$vraag_3', '$vraag_4', '$vraag_5', '$vraag_6a', '$vraag_6b', '$vraag_6c','$vraag_6d', '$vraag_6e', '$vraag_6f', '$vraag_6g', '$vraag_7a', '$vraag_7b', '$vraag_7c', '$vraag_7d', '$ip')") or die (mysql_error());
                                        echo $geslacht;
                                    }
                                    else
                                    {


Waarbij ik na die else mijn html heb van mijn form.

In die form heb ik per veld dit:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<td>
                  <select id="geslacht" name="geslacht"
                                    <?php
                                    if (isset($_POST['submit']))
                                    {
                                        if (empty($_POST['geslacht']))
                                        {
                                                $maysend = false;
                                                echo "class=\"faulty\"";
                                        }
                                        else
                                        {
                                            $maysend = true;
                                        }
                                    }
                                    ?>
                  >
                    <option name="nothing"></option>
                    <option>Man</option>
                    <option>Vrouw</option>
                  </select>
                </td>


Echter verzend hij het formulier toch als ik niks heb geselecteerd bij Geslacht.

Denk om uw spatiegebruik. Dit scheelt Tweakers.net kostbare databaseruimte! | Groninger en geïnteresseerd in Domotica? Kom naar DomoticaGrunn


Acties:
  • 0 Henk 'm!

  • killercow
  • Registratie: Maart 2000
  • Laatst online: 18-09 12:47

killercow

eth0

Zodra er nu 1 veld goed is komt $maysend als true uit de bus.

Ik zou eenmalig maysend op true zetten, en dan alleen False toevoegen. (de else kan dus weg dan)

openkat.nl al gezien?


Acties:
  • 0 Henk 'm!

  • MsG
  • Registratie: November 2007
  • Laatst online: 16:39

MsG

Forumzwerver

Topicstarter
Ja dat is wel een goede, alleen heb ik het nu nog maar in 1 veld en hij laat hem nu al verzenden. Dat klopt dan toch niet?

Toen ik de submitcheck juist ontkennend maakte en de if en de else code omdraaide, ging hij juist nooit verzenden, ook toen hij wel goed was :S.

Denk om uw spatiegebruik. Dit scheelt Tweakers.net kostbare databaseruimte! | Groninger en geïnteresseerd in Domotica? Kom naar DomoticaGrunn


Acties:
  • 0 Henk 'm!

  • Dennahz
  • Registratie: November 2001
  • Laatst online: 17-09 21:50

Dennahz

Life feels like hell should.

Zoeits kan je ook proberen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$error = FALSE;
if($_POST['veldnaam'] == "")
{
    $error = TRUE;
    //Andere code als veldnaam leeg is
}

if($_POST['veldnaam2'] == "")
{
    $error = TRUE;
    //Andere code als veldnaam leeg is
}

if($error == FALSE) //Als var $error FALSE is zijn er geen fouten.
{
    //Insert code
}


PHP leer je door te proberen, proberen en nog eens te proberen... niet door klakkeloos code over te nemen enzo :)

Twitter


Acties:
  • 0 Henk 'm!

  • MsG
  • Registratie: November 2007
  • Laatst online: 16:39

MsG

Forumzwerver

Topicstarter
Zoiets heb ik in principe al, alleen dan anders neergezet.

Maar ik heb het nu omgedraaid, en de afhandeling of hij wel of niet mag verzonden worden onderaan en nu verzend hij het dus nooit, terwijl ik bovenaan expliciet $maysend eerst op true heb.

Heb nu dit:

bovenste gedeelte:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Gebruikersvariabelen
                                $ip = $_SERVER['REMOTE_ADDR'];
                                $maysend = true;
                                // Errors
                                $al_gestemd = "Er is al een enquete ingevuld vanaf IP-adres: ".$ip."";
                                $error_lijst = "";
                                // MySQL
                                $query = mysql_query("SELECT COUNT(ip_adres) FROM enquete_antwoorden WHERE ip_adres = '".$ip."'");
                                $resultaat = mysql_fetch_array($query);
                                if (0 == 1)//$resultaat[0] > 0)
                                {
                                    echo $al_gestemd;
                                }
                                else
                                {


Dan per selectieveldje:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<td>
                    <select id="geslacht" name="geslacht"
                    <?php
                                            if (isset($_POST['submit']))
                                            {
                                                if (empty($_POST['geslacht']))
                                                {
                                                        $maysend = false;
                                                        echo "class=\"faulty\"";
                                                }
                                            }
                                        ?>
                    >
                        <option name="nothing"></option>
                      <option>Man</option>
                      <option>Vrouw</option>
                    </select>
                  </td>

Waarbij dat geslacht ding uiteraard relatief is aan welke selectie ding het is.

En dan onderaan:

PHP:
1
2
3
4
5
6
7
 <?php
                            }
                if (isset($_POST['submit']) && maysend == true)
                            {
                                    mysql_query("INSERT INTO enquete_antwoorden(geslacht, leeftijd, relatie, opleiding, woonplaats, vraag_1_internetvaardigheid, vraag_2_kroeggedrag, vraag_3_kroegstijl, vraag_4_profielensites,   vraag_5_kleur, vraag_6a_naam, vraag_6b_achternaam,  vraag_6c_geslacht,  vraag_6d_leeftijd, vraag_6e_email, vraag_6f_woonplaats, vraag_6g_telefoonnummer, vraag_7a_forum, vraag_7b_uitgaansagenda,   vraag_7c_fotoalbums, vraag_7d_privatemessaging, ip_adres) VALUES ('$geslacht', '$leeftijd', '$relatie', '$opleiding', '$woonplaats', '$vraag_1', '$vraag_2', '$vraag_3', '$vraag_4', '$vraag_5', '$vraag_6a', '$vraag_6b', '$vraag_6c','$vraag_6d', '$vraag_6e', '$vraag_6f', '$vraag_6g', '$vraag_7a', '$vraag_7b', '$vraag_7c', '$vraag_7d', '$ip')") or die (mysql_error());
                            }
                        ?>


En het is ook totaal niet mijn bedoeling code klakkeloos over te nemen hoor :), ik snap alleen niet waarom hij nu niet verzend. Maysend is true als ik iets selecteer ja, maar nee hoor het veld blijft staan.

Denk om uw spatiegebruik. Dit scheelt Tweakers.net kostbare databaseruimte! | Groninger en geïnteresseerd in Domotica? Kom naar DomoticaGrunn


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
MsG schreef op donderdag 10 januari 2008 @ 14:32:
En dan onderaan:

[php]
<?php
}
if (isset($_POST['submit']) && maysend == true)
Er staat geen dollar voor maysend. En als je gewoon beiden dingen var_dump()'t, moet je genoeg weten.

{signature}


Acties:
  • 0 Henk 'm!

  • MsG
  • Registratie: November 2007
  • Laatst online: 16:39

MsG

Forumzwerver

Topicstarter
Thx het werkt nu min of meer. Alleen als ik iets leeg laat en ik submit, krijg ik het formpje terug met een rode border (door die class) alleen is de goede input ook weg, ik zou dit wel kunnen fixen, maar is hier ook iets heel simpels voor?

Ik heb alleen nog een probleempje met leeftijd:

Ik heb dit scriptje geschreven om 50 leeftijden te kunnen zien ipv allemaal handmatig die options te maken:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<option name="nothing"></option>
                       <?php
                        //Variabelen
                        $leeftijd = 16;
                      
                        while($leeftijd < 51)
                        {
                        echo("<option>".$leeftijd."</option>");
                        
                        $leeftijd++;
                        }
                      ?>
                    </select>


Echter krijg ik als resultaat regelmatig 51 te zien. Ook wel eens wat ik had gekozen, maar ook wel 51. Ik heb onderaan de pagina even echo $leeftijd; gedaan en dan krijg ik aldoor wat ik had geselecteerd en nooit 51.

Denk om uw spatiegebruik. Dit scheelt Tweakers.net kostbare databaseruimte! | Groninger en geïnteresseerd in Domotica? Kom naar DomoticaGrunn


Acties:
  • 0 Henk 'm!

  • Duroth
  • Registratie: Juni 2007
  • Laatst online: 27-04-2016

Duroth

No rest for the tweaked

De waarde van die select komt terug in je POST vars neem ik aan, anders kan je nooit valideren.

Je kunt een option standaard selecteren door 'SELECTED' in de option tag op te nemen.

Ik neem aan dat het $_POST['select_leeftijd'] is, al is dit afhankelijk van de naam die je aan je select mee hebt gegeven.

Probeer dan dit eens:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<option name="nothing"></option>
                       <?php
                        //Variabelen
                        $leeftijd = 16;
                      
                        while($leeftijd < 51)
                        {
                        if($_POST['select_leeftijd'] == $leeftijd) { $selected = " selected"; } else { $selected = ""; }
                        echo("<option".$selected.">".$leeftijd."</option>");
                        
                        $leeftijd++;
                        }
                      ?>
                    </select>


Toch allemaal erg basic HTML / PHP, ik zou dan ook voorstellen toch eens even wat tutorials op te zoeken en door te nemen.

Acties:
  • 0 Henk 'm!

Verwijderd

Doe dan eens mysql_error en kijkt wat hij zegt. Het zou bijvoorbeeld kunnen dat de tabelnaam gewijzigd is, of dat er stiekum toch íets veranderd is (dat moet wel)

Acties:
  • 0 Henk 'm!

  • Dennahz
  • Registratie: November 2001
  • Laatst online: 17-09 21:50

Dennahz

Life feels like hell should.

Zou je sowieso niet beter een tabel maken genaamd: "Vragen" met daarin:

vraag_id
vraag_titel
vraag_omschrijving

En dan antwoorden:

antwoord_id
antwoord_vraag_id (Koppelen met vraag_id).
antwoord_omschrijving

Etc? Dat is veel beter te onderhouden dan voor elke vraag een aparte kolom te maken, wat sowieso niet echt netjes is.

Twitter


Acties:
  • 0 Henk 'm!

  • zwippie
  • Registratie: Mei 2003
  • Niet online

zwippie

Electrons at work

^^ Met Dennahz. Elke vraag is een rij in je tabel.

En voor serverside validatie kun je bijvoorbeeld ook per veld een error_msg bijhouden. Zorg ervoor dat zo'n error_msg bestaat als je de pagina laat zien, ook al zijn er (nog) geen fouten of is het formulier nog niet verstuurd.

Simpel (incompleet) voorbeeldje:

Controller:
PHP:
1
2
3
4
5
6
$leeftijd = $_POST['leeftijd'];
$leeftijd_error = "";
// validatie
if (!is_numeric($leeftijd)) {
  $leeftijd_error = 'Leeftijd moet een getal zijn';
}


View:
PHP:
1
2
<input type="text" name="leeftijd" value="<?= $leeftijd ?>" />
<span class="error"><?= $leeftijd_error; ?></span>

How much can you compute with the "ultimate laptop" with 1 kg of mass and 1 liter of volume? Answer: not more than 10^51 operations per second on not more than 10^32 bits.


Acties:
  • 0 Henk 'm!

  • MsG
  • Registratie: November 2007
  • Laatst online: 16:39

MsG

Forumzwerver

Topicstarter
Ik heb de database zo simpel mogelijk gehouden omdat hij wordt uitgelezen in phpmyadmin zelf en het anders vrij kut leest :). Toegegeven het is allemaal wat n00bish. Maar ik post straks even wat ik heb, het lukt al aardig.

Denk om uw spatiegebruik. Dit scheelt Tweakers.net kostbare databaseruimte! | Groninger en geïnteresseerd in Domotica? Kom naar DomoticaGrunn


Acties:
  • 0 Henk 'm!

  • moozzuzz
  • Registratie: Januari 2005
  • Niet online
Als één van je PHP-variabelen die je in je query gebruikt een ' bevat, klopt de query niet meer. Kijk es naar
PHP:
1
$veilige_MySQL_string = mysql_real_escape_string($waarde);

[ Voor 1% gewijzigd door moozzuzz op 11-01-2008 16:20 . Reden: niet gezien dat er al een page 2 was met de oplossing 8)7 ]


Acties:
  • 0 Henk 'm!

  • scarhand
  • Registratie: December 2001
  • Laatst online: 24-06-2021
zwippie schreef op vrijdag 11 januari 2008 @ 14:01:
PHP:
1
2
3
4
5
6
$leeftijd = $_POST['leeftijd'];
$leeftijd_error = "";
// validatie
if (!is_numeric($leeftijd)) {
  $leeftijd_error = 'Leeftijd moet een getal zijn';
}
Even een kleine side-note voor de lame copy-pasters onder ons ;)

is_numeric controleert of iets een getal is, 1.3E10 is ook een getal. ctype_digit() controleert of iets uit nummers, nummers en niets anders dan nummers bestaat. :)

Acties:
  • 0 Henk 'm!

  • WouZz
  • Registratie: Mei 2000
  • Niet online

WouZz

Elvis is alive!

Verder is het natuurlijk aan te raden om de geboortedatum op te slaan in plaats van leeftijd, anders blijf je zo druk met updaten.. :z

On track


Acties:
  • 0 Henk 'm!

  • MsG
  • Registratie: November 2007
  • Laatst online: 16:39

MsG

Forumzwerver

Topicstarter
Hey thx dat is handig. Ik heb het nu op een n00b methode foolproof gemaakt door alles meerkeuze te maken, dus geen rare input die sql injection geeft enz. Maar zoiets kan altijd handig zijn.

Ik heb per veld nu Doroth's code gebruikt:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
<?php
                        //Variabelen
                        $leeftijd = 16;
                      
                        while($leeftijd < 51)
                        {
                        if($_POST['select_leeftijd'] == $leeftijd) { $selected = " selected"; } else { $selected = ""; }
                        echo("<option".$selected.">".$leeftijd."</option>");
                        
                        $leeftijd++;
                        }
                      ?> 


Alleen trekt hij het niet bij dit veld, omdat er waarschijnlijk gegenereerd wordt.

Bij de anderen heb ik het als dit:

PHP:
1
2
<option <?php if ($_POST['geslacht'] == "Man"){ $selected = " selected"; } else { $selected = ""; } echo($selected); ?>>Man</option>
                      <option <?php if ($_POST['geslacht'] == "Vrouw"){ $selected = " selected"; } else { $selected = ""; } echo ($selected); ?>>Vrouw</option>


PHP:
1
2
3
4
5
6
7
<select name="relatie" <?php if (isset($_POST['submit'])){ if (empty($_POST['relatie'])){ $maysend = false; echo "class=\"faulty\""; } } ?>>
                      <option name="nothing"></option>
                      <option <?php if ($_POST['relatie'] == "Getrouwd"){ $selected = " selected"; } else { $selected = ""; } echo ($selected); ?>>Getrouwd</option>
                      <option <?php if ($_POST['relatie'] == "Gescheiden"){ $selected = " selected"; } else { $selected = ""; } echo ($selected); ?>>Gescheiden</option>
                      <option <?php if ($_POST['relatie'] == "Verkering"){ $selected = " selected"; } else { $selected = ""; } echo ($selected); ?>>Verkering</option>
                      <option <?php if ($_POST['relatie'] == "Alleenstaand"){ $selected = " selected"; } else { $selected = ""; } echo ($selected); ?>>Alleenstaand</option>
                    </select>


en dan werkt het perfect. Ik snap niet waarom bij leeftijd het fout gaat.

Denk om uw spatiegebruik. Dit scheelt Tweakers.net kostbare databaseruimte! | Groninger en geïnteresseerd in Domotica? Kom naar DomoticaGrunn


Acties:
  • 0 Henk 'm!

  • scarhand
  • Registratie: December 2001
  • Laatst online: 24-06-2021
Waarom geef je de options geen value mee?

Acties:
  • 0 Henk 'm!

  • MsG
  • Registratie: November 2007
  • Laatst online: 16:39

MsG

Forumzwerver

Topicstarter
Omdat hij bij een option het gedeelte pakt tussen de option tags en niet de value.

Denk om uw spatiegebruik. Dit scheelt Tweakers.net kostbare databaseruimte! | Groninger en geïnteresseerd in Domotica? Kom naar DomoticaGrunn


Acties:
  • 0 Henk 'm!

  • djiwie
  • Registratie: Februari 2002
  • Laatst online: 17-09 16:35

djiwie

Wie?

WouZz schreef op vrijdag 11 januari 2008 @ 23:26:
Verder is het natuurlijk aan te raden om de geboortedatum op te slaan in plaats van leeftijd, anders blijf je zo druk met updaten.. :z
In een enquete die je eenmalig invult? :P

Acties:
  • 0 Henk 'm!

  • MsG
  • Registratie: November 2007
  • Laatst online: 16:39

MsG

Forumzwerver

Topicstarter
WouZz schreef op vrijdag 11 januari 2008 @ 23:26:
Verder is het natuurlijk aan te raden om de geboortedatum op te slaan in plaats van leeftijd, anders blijf je zo druk met updaten.. :z
Klopt normaliter wel. Bij een enquete juist, gaat het om de absolute leeftijd van toen hij/zij de enquette invulde, en niet iemands leeftijd wanneer ik hem uitlees. Als ik besluit om over 50 jaar pas uitlees, moet het wel gaan om iemand van 18 en niet nu opeens van 68.

Denk om uw spatiegebruik. Dit scheelt Tweakers.net kostbare databaseruimte! | Groninger en geïnteresseerd in Domotica? Kom naar DomoticaGrunn


Acties:
  • 0 Henk 'm!

  • WouZz
  • Registratie: Mei 2000
  • Niet online

WouZz

Elvis is alive!

MsG schreef op zaterdag 12 januari 2008 @ 10:43:
[...]


Klopt normaliter wel. Bij een enquete juist, gaat het om de absolute leeftijd van toen hij/zij de enquette invulde, en niet iemands leeftijd wanneer ik hem uitlees. Als ik besluit om over 50 jaar pas uitlees, moet het wel gaan om iemand van 18 en niet nu opeens van 68.
Nou vooruit dan maar ;)

On track


Acties:
  • 0 Henk 'm!

  • sPENKMAN
  • Registratie: April 2002
  • Laatst online: 04-09 12:42
Edit: whoops, er was een 2de pagina :+

[ Voor 96% gewijzigd door sPENKMAN op 12-01-2008 12:30 ]

Eve char: Warock <TEST>

Pagina: 1