Avatar billede jdjensen Juniormester
11. november 2011 - 11:01 Der er 30 kommentarer og
1 løsning

Database check: Emailadresse må kun tilmeldes én gang pr. dag

Hej,

I min process.php fil har jeg nederst følgende:

// Get values from form
$arrParams = array('sssss', $_POST['firstname'], $_POST['lastname'], $_POST['emailaddress'], $_POST['answer'], $_POST['newsletter']);
   
// Insert data into table
$sql = "INSERT INTO $tbl_name (firstname, lastname, emailaddress, answer, newsletter, date) VALUES (?, ?, ?, ?, ?, CURDATE())";
$result = iQuery($sql, $arrParams);
}

// Redirect to successpage if no error"
if($result){header('Location: http://www.domain.dk/');
} else {
echo "ERROR";
}

Vil gerne have lidt hjælp til et check inden dataerne ryger ind i databasen. Checket skal se på/sørge for at den samme emailadresse ikke kan tilmeldes flere gange samme dag. Hvis en bruger forsøger at tilmelde sig med den samme emailadresse igen kommer der en prompt der siger noget i stil med "Denne email er allerede registeret".
Checket skal ligge lige inden min redirect funktion således at når brugeren har trykker ok til prompten, så redirecter siden til den angivet url.
Avatar billede xsejer Nybegynder
11. november 2011 - 11:23 #1
Du skal vel lave checket inden, du laver dit insert :-)
Avatar billede xsejer Nybegynder
11. november 2011 - 11:24 #2
Du skal vel lave check inden du laver insert :-)
11. november 2011 - 11:31 #3
iQuery kender jeg ikke.  Men princippet må vel være, at du laver en databasesøgning i tabellen for rækker hvor emailaddress = $_POST['emailaddress'] og data = CURRDATE().  Med mysql query kunne det have været gjort som følger.  Jeg går ud fra, at det kan gøres på en lignende måde med iQuery:

$sql = "SELECT * FROM $tbl_name WHERE date = CURRDATE())";
if(mysql_num_rows > 0) echo "Denne email er allerede registreret."
else
{
    $arrParams = array('sssss', $_POST['firstname'], $_POST['lastname'],    $_POST['emailaddress'], $_POST['answer'], $_POST['newsletter']);

    o.s.v., din kode som opgivet.
}
11. november 2011 - 11:33 #4
For hurtig, sprang en linie over.  Her kommer den:

$sql = "SELECT * FROM $tbl_name WHERE date = CURRDATE())";
$result = mysql_query($sql);
if(mysql_num_rows($result) > 0) echo "Denne email er allerede registreret."
else
{
    $arrParams = array('sssss', $_POST['firstname'], $_POST['lastname'],    $_POST['emailaddress'], $_POST['answer'], $_POST['newsletter']);

    o.s.v., din kode som opgivet.
}
Avatar billede jdjensen Juniormester
11. november 2011 - 11:59 #5
Christtian_Belgien:

Jeg prøver men der kommer lidt fejl op. Måske det bare er min sammenkobling der er forkert?:

// Check to see if email already exist in the database within the current day
$sql = "SELECT * FROM $tbl_name WHERE date = CURRDATE())";
$result = mysql_query($sql);
if(mysql_num_rows($result) > 0) echo "Denne email er allerede registreret.";
else {

// Get values from form
$arrParams = array('sssss', $_POST['firstname'], $_POST['lastname'], $_POST['emailaddress'], $_POST['answer'], $_POST['newsletter']);

// Insert data into table
$sql = "INSERT INTO $tbl_name (firstname, lastname, emailaddress, answer, newsletter, date) VALUES (?, ?, ?, ?, ?, CURDATE())";
$result = iQuery($sql, $arrParams);
}

// Redirect to successpage if no error"
if($result){header('Location: http://www.domain.dk/');
} else {
echo "ERROR";
}

}
Avatar billede jdjensen Juniormester
11. november 2011 - 12:01 #6
Christian_Belgien:

Tak, jeg prøver men får lidt fejl op. Måske det bare er sammensætningen af min kode (ikke sikker)?:

// Check to see if email already exist in the database within the current day
$sql = "SELECT * FROM $tbl_name WHERE date = CURRDATE())";
$result = mysql_query($sql);
if(mysql_num_rows($result) > 0) echo "Denne email er allerede registreret.";
else {

// Get values from form
$arrParams = array('sssss', $_POST['firstname'], $_POST['lastname'], $_POST['emailaddress'], $_POST['answer'], $_POST['newsletter']);

// Insert data into table
$sql = "INSERT INTO $tbl_name (firstname, lastname, emailaddress, answer, newsletter, date) VALUES (?, ?, ?, ?, ?, CURDATE())";
$result = iQuery($sql, $arrParams);
}

// Redirect to successpage if no error"
if($result){header('Location: http://www.domain.dk/');
} else {
echo "ERROR";
}

}
Avatar billede jdjensen Juniormester
11. november 2011 - 12:08 #7
Hov, tror ikke jeg gjorde det tydeligt i opgavebeskrivelsen men hvis emailen allerede findes i databasen, så skal processen med at lægge dataerne ind og redirectet ikke køres. Det er kun prompten med "Denne email er allerede registreret." der skal vises i dette tilfælde.
11. november 2011 - 12:40 #8
1.  Jeg har kun kunnet bruge de oplysninger du gav.
2.  Jeg står og skal afsted.  Jeg kikker i aften.
Avatar billede olebole Juniormester
11. november 2011 - 12:52 #9
<ole>

Prøv dette:


$sql = 'SELECT `id` FROM $tbl_name WHERE `emailaddress`=? AND `date`=CURDATE()';
$result = iQuery($sql, array('s', $_POST['emailaddress']));
if (count($result->rows)>0) {
    // Brugeren er indsat i dag
} else {
    // Kør en insert
}


Undlad at bruge *, da du ikke skal bruge nogen felter, men kun skal lave et check på evt. eksistens. Jeg er gået ud fra, at du har et felt id, så det har jeg nappet. Du kan vælge et andet, hvis du ikke har det pågældende felt.

Undgå såvidt muligt *, hvis du ikke skal bruge alle felter. Hent kun de felter, du skal bruge. Det andet er spild af DB'ens kræfter  *o)
/mvh
</bole>
Avatar billede jdjensen Juniormester
11. november 2011 - 13:47 #10
Tak olebole. :-)
Jeg har netop tilføjet en ekstra kolonne (id) til min tabel og har nu følgende i min kode. Men brugeren ryger stadig ind af en eller anden årsag og prompten "Denne email er allerede registeret" bliver ikke vist. Kan ikke lige gennemskue hvad der er galt i nedenstående. Skal der iøvrigt en return false ind efter min echo eller er det ligemeget.

// Check if users email exist in the database at currect day
$sql = 'SELECT `id` FROM $tbl_name WHERE `emailaddress`=? AND `date`=CURDATE()';
$result = iQuery($sql, array('s', $_POST['emailaddress']));
if (count($result->rows)>0) {
echo "Denne email er allerede registreret.";

} else {

// Get values from form
$arrParams = array('sssss', $_POST['firstname'], $_POST['lastname'], $_POST['emailaddress'], $_POST['answer'], $_POST['newsletter']);

// Insert data into table
$sql = "INSERT INTO $tbl_name (firstname, lastname, emailaddress, answer, newsletter, date) VALUES (?, ?, ?, ?, ?, CURDATE())";
$result = iQuery($sql, $arrParams);
}

// Redirect to successpage if no error
if($result){header('Location: http://www.domain.dk/');
} else {
echo "ERROR";
}

}
Avatar billede Qobra Nybegynder
11. november 2011 - 14:47 #11
Du bør indbygge funktionaliteten i databasen:
- Kolonne med emailadresse og kolonne med dato
- Unikt indeks der spænder over begge kolonner

Så vil dit INSERT statement automatisk fejle, hvis parret allerede findes i tabellen:

if (query("INSERT ..")) {
  // ok
} else {
  // error
}

Er det en mysql database? Så vil jeg foreslå at lægge det primære indeks på (emailadresse, dato), og hvis du allerede har et primært indeks, så lav det om til et unikt indeks.
Avatar billede jdjensen Juniormester
11. november 2011 - 14:50 #12
Fik muligvis byttet om på løkkerne (Den redirecter dog altid selvom brugerens emailadresse findes den pågældende dag):

// Check if users email exist in the database at currect day
$sql = 'SELECT `id` FROM $tbl_name WHERE `emailaddress`=? AND `date`=CURDATE()';
$result = iQuery($sql, array('s', $_POST['emailaddress']));
if (count($result->rows)>0) {

// Get values from form
$arrParams = array('sssss', $_POST['firstname'], $_POST['lastname'], $_POST['emailaddress'], $_POST['answer'], $_POST['newsletter']);

// Insert data into table
$sql = "INSERT INTO $tbl_name (firstname, lastname, emailaddress, answer, newsletter, date) VALUES (?, ?, ?, ?, ?, CURDATE())";
$result = iQuery($sql, $arrParams);
}

// Redirect to successpage if no error
header( 'Location: http://www.domain.dk' ) ;

} else {

die("The email address '" . $_POST['emailaddress'] ."' is already registered");

}
Avatar billede olebole Juniormester
11. november 2011 - 15:01 #13
Sorry, det er min SQL-streng, der fejler  :o|

$sql = 'SELECT `id` FROM '.$tbl_name.' WHERE `emailaddress`=? AND `date`=CURDATE()';

- og så skal jeg have lavet noget mere error handling i iQuery. Mon ikke nu er et godt tidspunkt?  :D
Avatar billede olebole Juniormester
11. november 2011 - 15:03 #14
Hold da op, hvor Eksperten er i knæ i dag. For kort tid siden var den helt nede - nu 'kun' halvt  :o|
Avatar billede Qobra Nybegynder
11. november 2011 - 15:56 #15
Ja, det kører sgu lidt langsomt. Olebole: Read The Fucking Manual? :)
Avatar billede olebole Juniormester
11. november 2011 - 18:17 #16
@Qobra: Faktisk har jeg lidt på fornemmelsen, der har været et nedbrud udenfor E. Jeg er de seneste par timer været ude for flere sites, der har været i knæ - men det kan jo være et tilfælde  =)

Ja, mange år på Eksperten resulterede på et tidspunkt i en uimodståelig trang til at lave den avatar ... om man nu kan forstå det  *D
Avatar billede olebole Juniormester
11. november 2011 - 18:22 #17
PS: jeg har skrevet med spørgeren og naturligvis tilsluttet mig din tidligere kommentar om indekset.

Problemet var, at min første version af mysqli-wrapperen (iQuery) var knaldet lidt hurtigt sammen og ikke håndterede f.eks. en 1062 fejl. Der var derfor ikke noget at handle på. Nu har spørger fået en ny version, hvor det er rettet.

Jeg er ved at omskrive den til en klasse, som gør det væsentligt mere overskueligt at få gang i mysqli - hvilket mange synes at have problemer med
Avatar billede Qobra Nybegynder
12. november 2011 - 20:14 #18
Fair nok, det er vel heller ingen hemmelighed at de fleste spørgsmål her på eksperten passer fint ind i kategorien "tl;dr" ;-)

Er enig i at alle burde bruge mysqli. Det gamle mysql interface burde faktisk blive fjernet som standard, ligesom magic quotes fjernes.
Avatar billede olebole Juniormester
13. november 2011 - 15:11 #19
Ja, det er en kedelig 'Pixi' holdning, der har bredt sig (og ikke kun på området 'webkode'). Alt, længere end en sms eller FB-opdatering, er for 'indsatskrævende' og 'opslidende'. Ikke mindst kan det undre, når folk i samme forbindelse påstår, at webkode er en hobby, og at de elsker deres hobby. Hvornår skal der så være motivation til at fordybe sig?

Synd, vi ikke så det, da vi for år tilbage tordnede forbi afkørslen til Videnssamfundet. Nu må vi tage til takke med et overfladisk Misinformations- og Underholdningssamfund.

Said the grumpy old man! Statler og Waldorf har ikke 'levet' forgæves  *D
Avatar billede Qobra Nybegynder
13. november 2011 - 16:44 #20
Ja, så fik vi også lige det med i tråden ;-)
Avatar billede jdjensen Juniormester
14. november 2011 - 11:26 #21
Hej,

Så langt så godt. :) Har fået en modificeret version af mysqli fra olebole og den laver nu et check på emailen som virker.

Der hvor jeg stadig har lidt udfordringer er med hensyn til den action der skal ske hvis brugeren allerede findes den pågældende dag. Her vil jeg gerne at teksten "Denne email er allerede registreret." bliver outputtet i en div på samme side:

<div class="RegisterErrors" style="display:none">Denne email er allerede registreret.</div>.

(style="display:none" skal så fjernes for at teksten kan blive vist.)

Her udsnit af min process.php med reglen:

// Check if users email exist in the database at currect day
$sql = 'SELECT `id` FROM '.$tbl_name.' WHERE `emailaddress`=? AND `date`=CURDATE()';
$result = iQuery($sql, array('s', $_POST['emailaddress']));

if (count($result->rows)>0) {

// Prompt
echo "Denne email er allerede registreret.";

} else {

// Get values from form
$arrParams = array('sssss', $_POST['firstname'], $_POST['lastname'], $_POST['emailaddress'], $_POST['answer'], $_POST['newsletter']);

// Insert data into table
$sql = "INSERT INTO $tbl_name (firstname, lastname, emailaddress, answer, newsletter, date) VALUES (?, ?, ?, ?, ?, CURDATE())";
$result = iQuery($sql, $arrParams);

// Redirect
header( 'Location: http://www.domain.dk/er-tilfoet-idag' );

}

----------------------------------------

Er der en der lige vil hjælpe med det sidste? :)
Avatar billede jdjensen Juniormester
14. november 2011 - 11:34 #22
For kan jo ikke bare gøre således. Så bliver den stadig vist på en ny blank side:

echo "<div class='RegisterErrors'>Denne email er allerede registreret.</div>";

Iøvrigt bliver <div class="RegisterErrors" style="display:none"></div> også brugt af min php validering af felterne så der skal helst ikke laves en ny <div>. Teksten "Denne email er allerede registreret" skal bare indsættes i den allerede eksisterende <div> (hvis muligt).
Avatar billede jdjensen Juniormester
14. november 2011 - 11:55 #23
Så kort og godt skal jeg bare have teksten fre min echo:

echo ("Denne email er allerede registreret");

Indsat dynamisk i denne (allerede eksisterende div):

<div class="RegisterErrors" style="display:none"></div>"

(style="display:none" skal self. fjernes)

--

Så vil jeg i begge tilfælde kunne bruge en tekst istedet for at anvende redirects hvilket ville være perfekt. Håber en kan hjælpe.
Avatar billede jdjensen Juniormester
14. november 2011 - 12:31 #24
Har prøvet følgende men det virker heller ikke:

Process.php:
$msg = 'Du er allerede registereret.';

Body:
<? if(isset($msg)) echo "<div class='RegisterErrors'>$msg</div>"; ?>

---
Hvordan gør man lige... :)
Avatar billede jdjensen Juniormester
14. november 2011 - 13:06 #25
Her formen:

<form class="form" action="process.php" method="post">
<fieldset>

<div class="RegisterErrors" style="display:none"></div>
<?php if(isset($msg)) echo "<div>$msg</div>"; ?>

... diverse felter ...

<input type="submit" name="send" class="button" value="Send" />

</fieldset>
</form>

---

Skal min action evt. se anderledes ud for at det vil virke?
Avatar billede Qobra Nybegynder
14. november 2011 - 13:25 #26
Det er lidt svært at finde hoved og hale i alle dine stumper, men dit problem lyder umiddelbart meget basalt. Så jeg tror sagtens du selv kan få løst det sidste selv, hvis du lige holder hovedet koldt et øjeblik.
Avatar billede jdjensen Juniormester
14. november 2011 - 13:48 #27
Qobra: Burde være ret basalt men lige meget hvad jeg prøver får jeg bare en hvid skærm op ved submit.
Avatar billede jdjensen Juniormester
14. november 2011 - 17:10 #28
Man bliver jo fra at have trykket submit, sendt over i min process.php fil. Er jeg virkelig nød til at gengive hele designet i min process.php fil? Kan den ikke sende værdien fra variablen $msg tilbage til min index.php fil?

Jeg forstår det ik og har brugt timer nu på at lede efter en løsning. :((
Avatar billede olebole Juniormester
14. november 2011 - 17:29 #29
Det kan let blive noget bøvl med en længere besked - men da jeg ikke kender din app, er det svært at komme med et alternativ.

Umiddelbart ville jeg nok bruge Ajax, hvis man skal blive på e-mail-siden, når der er sendt(?)
Avatar billede jdjensen Juniormester
14. november 2011 - 18:38 #30
Du har ret olebole. Tror jeg lukker denne her nu lidt uoverskuelige tråd.

Jeg ender nok bare med at lave et redirect til en "bekræftelsesside" i samme design istedet.

Jeg takker for hjælpen. De som vil have points må gerne lægge et svar.
14. november 2011 - 20:10 #31
Det er spørgsmålsstillerens ansvar at bestemme hvilke indlæg der var til hjælp.  Jeg startede, men måtte afsted, og da jeg kom tilbage var der allerede livlig aktivitet, så jeg holdt mig tilbage for at se hvad der kom ud af det.  Jeg tabte også oversigten - trådens 'scope' udvidede sig til områder der synes at gå ud over spørgsmålet som du definerede det.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester