Duplicate entrie, aangepaste melding.
Hoe kan ik een aangepaste melding maken, wanneer mysql normaal een error retourneert als er een dubbel is (duplicate entrie), maw ik wil deze melding: Dit email adres ontvangt reeds de nieuwsbrief. Als het email adres reeds in de db zit.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?
$sql = 'SELECT emailadres FROM leden WHERE emailadres = "'.$nieuw.'"';
$res = mysql_query($sql,$link);
if ($res && mysql_num_rows($res) == 1)
{
echo 'Emailadres is al aangemeld!';
} else {
$voegtoe_sql = 'INSERT INTO leden (emailadres) VALUES ("'.$nieuw.'")';
$voegtoe_res = mysql_query($voegtoe_sql,$link);
echo 'Emailadres nu aangemeld!';
}
?>
$sql = 'SELECT emailadres FROM leden WHERE emailadres = "'.$nieuw.'"';
$res = mysql_query($sql,$link);
if ($res && mysql_num_rows($res) == 1)
{
echo 'Emailadres is al aangemeld!';
} else {
$voegtoe_sql = 'INSERT INTO leden (emailadres) VALUES ("'.$nieuw.'")';
$voegtoe_res = mysql_query($voegtoe_sql,$link);
echo 'Emailadres nu aangemeld!';
}
?>
Waarvoor dient $link?
database connectie is dat bij mij meestal
En omdat je blijkbaar een UNIQUE op de kolom 'emailadres' hebt (heel goed!), slaat die SELECT al helemaal nergens op.
Probeer dit eens:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?
$voegtoe_sql = 'INSERT INTO leden (emailadres) VALUES ("'.$nieuw.'")';
$voegtoe_res = mysql_query($voegtoe_sql,$link);
if (mysql_errno() == 1062) { // zie ook de MySQL handleiding
echo 'Emailadres is al aangemeld!';
}
elseif (!$voegtoe_res){
echo 'Query mislukt vanwege: '.mysql_error().' met query: '.$voegtoe_sql;
}
else {
echo 'Emailadres nu aangemeld!';
}
?>
$voegtoe_sql = 'INSERT INTO leden (emailadres) VALUES ("'.$nieuw.'")';
$voegtoe_res = mysql_query($voegtoe_sql,$link);
if (mysql_errno() == 1062) { // zie ook de MySQL handleiding
echo 'Emailadres is al aangemeld!';
}
elseif (!$voegtoe_res){
echo 'Query mislukt vanwege: '.mysql_error().' met query: '.$voegtoe_sql;
}
else {
echo 'Emailadres nu aangemeld!';
}
?>
Ik ga ff die laatste uitproberen.
Ik heb een script geschreven waarin een persoon zijn email kan opgeven om zich in te schrijven voor een nieuwsbrief. bevat controlemiddelen tegen valse adressen en host's en ook tegen duplicaten:d.
Zou ik hem posten bij de scripts?
Of wil je men code eerst zien of zo?
Bevat in totaal 3 bestande: db_settings.php, newsletter.php (inschrijving) en news_handler.php (de verwerking).
Het voorkomen van duplicaten is kinderlijk eenvoudig, een UNIQUE op de kolom en klaar ben je. Dat heeft niets met PHP te maken, maar alles met basiskennis SQL.
Geef mij uw mening.
Code (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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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
<?
include 'db_settings.php';
if ($_SERVER['REQUEST_METHOD'])
{
if(!empty($_POST['email']))
{
if (eregi("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[a-z]{2,4}$",$email))
{
$post_email = $_POST['email'];
$email_host = explode("@", $post_email);
$email_host = $email_host[1];
$email_resolved = gethostbyname($email_host);
if ($email_resolved == $email_host) { echo("Dit email adres is niet geldig."); }
else {
$trim_email = trim($post_email);
$lower_email = strtolower($trim_email);
$email= $lower_email;
mysql_connect($hostname, $user, $password) or die('Er is iets misgegaan met de database connectie: ');
mysql_select_db($db) or die('Er is iets misgegaan met de database selecteren: ');
$sql = "INSERT INTO newsletter (id_col,email,recieve) VALUES ('','".$email."','1')";
$res = mysql_query($sql);
if (mysql_errno() == 1062)
{
echo "Dit e-mail adres is reeds aangemeld!";
}
else if (!$res)
{
echo "Er is een probleem ontstaan tijdens de verwerking, onze excuses voor het ongemak, probeer later opniewu!";
}
else
{
echo "Bedankt om u in te schrijven voor de nieuwsbrief, u ontvang vanaf nu elke dag onze nieuwsbrief!";
}
}
}
else
{
echo "U heeft geen geldig e-mail adres in gevoerd!";
}
}
else
{
die("U heeft niks ingevoerd!");
}
}
?>
include 'db_settings.php';
if ($_SERVER['REQUEST_METHOD'])
{
if(!empty($_POST['email']))
{
if (eregi("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[a-z]{2,4}$",$email))
{
$post_email = $_POST['email'];
$email_host = explode("@", $post_email);
$email_host = $email_host[1];
$email_resolved = gethostbyname($email_host);
if ($email_resolved == $email_host) { echo("Dit email adres is niet geldig."); }
else {
$trim_email = trim($post_email);
$lower_email = strtolower($trim_email);
$email= $lower_email;
mysql_connect($hostname, $user, $password) or die('Er is iets misgegaan met de database connectie: ');
mysql_select_db($db) or die('Er is iets misgegaan met de database selecteren: ');
$sql = "INSERT INTO newsletter (id_col,email,recieve) VALUES ('','".$email."','1')";
$res = mysql_query($sql);
if (mysql_errno() == 1062)
{
echo "Dit e-mail adres is reeds aangemeld!";
}
else if (!$res)
{
echo "Er is een probleem ontstaan tijdens de verwerking, onze excuses voor het ongemak, probeer later opniewu!";
}
else
{
echo "Bedankt om u in te schrijven voor de nieuwsbrief, u ontvang vanaf nu elke dag onze nieuwsbrief!";
}
}
}
else
{
echo "U heeft geen geldig e-mail adres in gevoerd!";
}
}
else
{
die("U heeft niks ingevoerd!");
}
}
?>
Wat ik gek vind, is dat je $email gaat controleren, maar dat deze variabele helemaal niet bestaat. Net zoals dat je trim() en strtolower() pas gebruikt ná de validatie. Ik zou deze functies al gebruiken voordat je met empty() controleert of de variabele $_POST['email'] is gevuld. Dan heb je al geen gedonder meer met een grappenmaker die spaties invult.
Als ik het goed heb, is 'else if' wat anders dan 'elseif' die je op regel 32 gebruikt.
Die gethostbyname() is inderdaad wel netjes, ga ik ook maar eens gebruiken. Ik vertrouwde tot nu toe uitsluitend op een regular expression en het verzenden van een activatie-email.
Ps. Let even op het inspringen, dat kan nog wat netter. Al kan het zijn dat het in jouw editor wel goed staat. Kijk even naar regel 15: if ($email_resolved == $email_host)
Code (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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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
<?
ini_set('display_errors', 1);
error_reporting(E_ALL);
include 'db_settings.php';
if ($_SERVER['REQUEST_METHOD'])
{
$post_email = $_POST['email'];
$trim_email = trim($post_email);
$email = strtolower($trim_email);
if(!empty($_POST['email']))
{
if (eregi("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[a-z]{2,4}$",$email))
{
$email_host = explode("@", $email);
$email_host = $email_host[1];
$email_resolved = gethostbyname($email_host);
if ($email_resolved == $email_host)
{
echo("Dit email adres is niet geldig.");
}
else
{
mysql_connect($hostname, $user, $password) or die('Er is iets misgegaan met de database connectie: ');
mysql_select_db($db) or die('Er is iets misgegaan met de database selecteren: ');
$sql = "INSERT INTO newsletter (id_col,email,recieve) VALUES ('','".$email."','1')";
$res = mysql_query($sql);
if (mysql_errno() == 1062)
{
echo "Dit e-mail adres is reeds aangemeld!";
}
else if (!$res)
{
echo "Er is een probleem ontstaan tijdens de verwerking, onze excuses voor het ongemak, probeer later opniewu!";
}
else
{
echo "Bedankt om u in te schrijven voor de nieuwsbrief, u ontvang vanaf nu elke dag onze nieuwsbrief!";
}
}
}
else
{
echo "U heeft geen geldig e-mail adres in gevoerd!";
}
}
else
{
die("U heeft niks ingevoerd!");
}
}
?>
ini_set('display_errors', 1);
error_reporting(E_ALL);
include 'db_settings.php';
if ($_SERVER['REQUEST_METHOD'])
{
$post_email = $_POST['email'];
$trim_email = trim($post_email);
$email = strtolower($trim_email);
if(!empty($_POST['email']))
{
if (eregi("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[a-z]{2,4}$",$email))
{
$email_host = explode("@", $email);
$email_host = $email_host[1];
$email_resolved = gethostbyname($email_host);
if ($email_resolved == $email_host)
{
echo("Dit email adres is niet geldig.");
}
else
{
mysql_connect($hostname, $user, $password) or die('Er is iets misgegaan met de database connectie: ');
mysql_select_db($db) or die('Er is iets misgegaan met de database selecteren: ');
$sql = "INSERT INTO newsletter (id_col,email,recieve) VALUES ('','".$email."','1')";
$res = mysql_query($sql);
if (mysql_errno() == 1062)
{
echo "Dit e-mail adres is reeds aangemeld!";
}
else if (!$res)
{
echo "Er is een probleem ontstaan tijdens de verwerking, onze excuses voor het ongemak, probeer later opniewu!";
}
else
{
echo "Bedankt om u in te schrijven voor de nieuwsbrief, u ontvang vanaf nu elke dag onze nieuwsbrief!";
}
}
}
else
{
echo "U heeft geen geldig e-mail adres in gevoerd!";
}
}
else
{
die("U heeft niks ingevoerd!");
}
}
?>
if(!empty($_POST['email']))
uiteraard wel doorgaan met $email.
En dit
$post_email = $_POST['email'];
$trim_email = trim($post_email);
$email = strtolower($trim_email);
zou ook in één regel kunnen:
$email = strtolower(trim($_POST['email']));
Edit: else if zou ik aan elkaar schrijven elseif
Gewijzigd op 01/01/1970 01:00:00 door - SanThe -
En die regel zal ik veranderen
$post_email = $_POST['email'];
$trim_email = trim($post_email);
$email = strtolower($trim_email);
Dan is het toch logisch dat je in de if() dit zet:
if(!empty($email]))
Ik ga nu terwijl, een stukje bijschrijven waar de beheerder een newsletter kan zenden.