Bekijk Volledige Versie : controle op dubbele invoer, hoe gaat dit?
Robert van Hall
10/10/03, 15:45
Geacht Forum,
Niet in het minst door jullie sympathieke hulp ben ik inmiddels toe aan het
stadium: controle op de invoer van de door de gebruiker (d.m.v. een form met
als action een voegtoe.php) ingevulde velden.
Hoe, en in welk stadium kun je het beste controleren of (een gedeelte van,
of het totaal van) de data al in de database zijn opgenomen? Ik zou dit
graag willen implementeren om dubbele invoer te vermijden.
Alvast bedankt voor de tips!
Robert
Maarten Wierda
10/10/03, 16:00
Robert van Hall wrote:
> Hoe, en in welk stadium kun je het beste controleren of (een gedeelte van,
> of het totaal van) de data al in de database zijn opgenomen? Ik zou dit
> graag willen implementeren om dubbele invoer te vermijden.
Maak je gebruik van een database? Het veiligste is om de betreffende
kolom in te stellen op 'unique' o.i.d. In MySQL is dat i.i.g. mogelijk.
Natuurlijk kun je ook met een PHP-scriptje dubbele waarden controleren
maar dit is onveiliger omdat het dan nog steeds mogelijk is om dubbele
waarden in te voeren wanneer je exact tegelijk iets aan de database wilt
toevoegen.
--
Cheers, Maarten Wierda
"Music is first, lyrics are secondary."
Rene Pijlman
10/10/03, 16:30
Robert van Hall:
>Hoe, en in welk stadium kun je het beste controleren of (een gedeelte van,
>of het totaal van) de data al in de database zijn opgenomen? Ik zou dit
>graag willen implementeren om dubbele invoer te vermijden.
In de transactie waarin de data worden ingevoerd. Als blijkt dat de invoer
dubbel is laat je de transactie falen (rollback).
Over hoe dat precies moet is zonder informatie over database, datamodel en
transactiemodel weinig zinnigs te zeggen.
--
René Pijlman
Wat wil jij leren? http://www.leren.nl
In article <3f86b57d$0$61272$e4fe514c@dreader3.news.xs4all.nl>,
rvanhall@bmb-bbm.org says...
> Geacht Forum,
>
> Niet in het minst door jullie sympathieke hulp ben ik inmiddels toe aan het
> stadium: controle op de invoer van de door de gebruiker (d.m.v. een form met
> als action een voegtoe.php) ingevulde velden.
>
> Hoe, en in welk stadium kun je het beste controleren of (een gedeelte van,
> of het totaal van) de data al in de database zijn opgenomen? Ik zou dit
> graag willen implementeren om dubbele invoer te vermijden.
>
> Alvast bedankt voor de tips!
> Robert
>
>
>
Dag Maarten en Rene,
Hier is wat meer info: Ik gebruik inderdaad een MySql database.
Mijn voegtoe.php, dat ik draai als action na het invullen van een form,
plak ik hieronder.
Waar kan ik het beste de check op unieke gegevens inpassen, en hoe komt
dat er dan in het ideale geval uit te zien?
Bedankt!
Robert
(die niet gedacht had dattie nog eens meer tijd zou doorbrengen op de
groep server-side dan op ontwerp, en PHPCoder de laatste tijd meer
gebruikt dan Dreamweaver...
;-)
)
<?php
//verbind met de database server en kies 'personeel'
include 'connect.php';
//de doorgegeven POST-variabelen ophalen
$achternaam = $_POST["achternaam"];
$tussenvoegsel = $_POST["tussenvoegsel"];
$voornaam = $_POST["voornaam"];
$telefoonnummer = $_POST["telefoonnummer"];
//als $achternaam, $voornaam en $telefoonnummer bestaan...
if ($achternaam && $voornaam && $telefoonnummer)
{
//een nieuwe rij aan tabel 'gegevens' toevoegen
$actie = mysql_query("INSERT INTO gegevens (id, achternaam,
tussenvoegsel,
voornaam, telefoonnummer)
VALUES (NULL, '$achternaam', '$tussenvoegsel', '$voornaam',
'$telefoonnummer')")
or die("Foutje bij toevoegen");
echo "<h2 class=\"kopjeoranje\">Naam en telefoonnummer zijn
toegevoegd</h2>";
}
else
{
echo "Vul zowel achternaam, voornaam en telefoonnummer in ";
}
?>
Rene Pijlman
10/10/03, 21:45
Robert:
> $actie = mysql_query("INSERT INTO gegevens (id, achternaam,
^^
Waar komt deze id vandaan, hoe krijgt hij zijn waarde en wat is de
betekenis van de betreffende kolom in de database?
--
René Pijlman
Wat wil jij leren? http://www.leren.nl
In article <1e2eovsp11j453on2505oqr7t95cfi8oop@4ax.com>,
reply.in.the.newsgroup@my.address.is.invalid says...
> Robert:
> > $actie = mysql_query("INSERT INTO gegevens (id, achternaam,
> ^^
> Waar komt deze id vandaan, hoe krijgt hij zijn waarde en wat is de
> betekenis van de betreffende kolom in de database?
>
> --
> René Pijlman
>
> Wat wil jij leren? http://www.leren.nl
>
Beste Rene,
Hier is een stukje uit de php die de db aanmaakt:
// maak een tabel met de naam gegevens
$actie = mysql_query("CREATE TABLE gegevens (
id int(11) auto_increment,
achternaam varchar(80),
tussenvoegsel varchar (80),
voornaam varchar (80),
telefoonnummer varchar(80),
PRIMARY KEY (id),
FULLTEXT tekstindex (achternaam))")
or die(mysql_error());
Is dit voldoende informatie?
Bedankt dat je wil helpen,
Robert
Daniel Tryba
10/10/03, 22:15
Rene Pijlman <reply.in.the.newsgroup@my.address.is.invalid> wrote:
> Robert:
>> $actie = mysql_query("INSERT INTO gegevens (id, achternaam,
> ^^
> Waar komt deze id vandaan, hoe krijgt hij zijn waarde en wat is de
> betekenis van de betreffende kolom in de database?
Neemaar Rene, je bent SQL toch niet verleerd?
Er stond:
"INSERT INTO gegevens (id, achternaam, tussenvoegsel, voornaam, telefoonnummer)
VALUES (NULL, '$achternaam', '$tussenvoegsel', '$voornaam', '$telefoonnummer')")
Aan id wordt de waarde NULL gegeven. Naar betekenis kunnen we gissen, ik
vermoed een auto increment uniek nummer.
--
Daniel Tryba
Daniel Tryba
10/10/03, 22:15
Robert <xipe@spamcop.net> wrote:
> Waar kan ik het beste de check op unieke gegevens inpassen, en hoe komt
> dat er dan in het ideale geval uit te zien?
> $actie = mysql_query("INSERT INTO gegevens (id, achternaam, tussenvoegsel,
> voornaam, telefoonnummer) VALUES (NULL, '$achternaam', '$tussenvoegsel',
> '$voornaam', '$telefoonnummer')")
Wanneer bestempel jij iets als uniek? Is een telefoonnummer uniek (lijkt
me niet)? Is een combinatie van alle velden uniek (dat lijkt er al meer
op)? Je zou dan bv een unieke rij met een hash van alle "unieke" velden
kunnen opnemen in de database, dan rest nog slechts het probleem van
spaties, case en tikfouten.
--
Daniel Tryba
Rene Pijlman
10/10/03, 23:15
Daniel Tryba:
>Neemaar Rene, je bent SQL toch niet verleerd?
Nee, te hard gewerkt vandaag :-/ Ik zag een $id die ik nergens terugvond
en die bovendien - zoals je fijntjes opmerkt - op de verkeerde plaats zou
staan.
Ik dacht nog, zal ik nog eens goed kijken of mijn posting wel helemaal
klopt? Maar ach, waarom zou je dat doen? Als uitkomt dat het niet klopt
dan kun je altijd nog afzien van het vragen van toestemming.
--
René Pijlman
Wat wil jij leren? http://www.leren.nl
Rene Pijlman
10/10/03, 23:30
Robert:
> id int(11) auto_increment,
[...]
> PRIMARY KEY (id),
Yep, zo gaat een insert inderdaad altijd lukken.
Je hebt een conceptueel probleem. Een client zegt via het web: voeg deze
gegevens toe. Maar daarbij zit geen unieke identificatie van de
transactie, van het request of wat dan ook. Hoe zou je op de server willen
beslissen of de toe te voegen gegevens "dubbel" zijn?
Stel dat is de combinatie <achternaam, tussenvoegsel, voornaam>. Dan maak
je op die combinatie een primary key of unique key (weet effe niet uit
mijn hoofd of MySQL dat kent) en dan zou een herhaalde transactie falen.
Bij sommige applicaties wordt de beslissing geheel in handen van de
gebruiker gelegd. In mijn boekhoudpakket is elke factuur er één. Als ik
een factuur 10 keer invoer, dan zijn het 10 facturen.
Bij webapplicaties wordt er soms voor gekozen elk form server-side te
genereren met een unieke id, zodat het maximaal 1 keer kan worden gesubmit
(zolang de client het formulier niet manipuleert door de id te
veranderen). Dat kan een goede oplossing zijn, maar betekent wel dat je de
hele zooi server-side moet genereren en dat je het verwerken van een
formulier moet registreren in de database.
En soms wordt ervoor gekozen de gebruiker een unieke identificatie te
vragen. Verzint de gebruiker een bestaande, dan faalt de transactie. Maar
niets verhindert één gebruiker om voor zichzelf 10 idenfiticaties te
verzinnen. Hotmail werkt bijvoorbeeld zo.
Het is dus een ontwerpkeuze, niet zozeer een regeltje code dat wij je
kunnen aanreiken om ergens in te pluggen.
--
René Pijlman
Wat wil jij leren? http://www.leren.nl