PHP script werkt wel lokaal, niet op server
Ik heb een kein script gemaakt lokaal via Wamp, maar deze doet het niet wanneer ik hem plaats op de server. SQL settings heb ik aangepast en de database is overgezet. Code gaat om een klein scriptje dat ervoor moet zorgen dat wanneer mensen hun mail invoeren, zij een lotnummer krijgen. Ook wordt er een mail verzondeen met hn gekregen nummer. In de database wordt het lotnummer als Primary key opgeslagen en als toevoeging wordt het mail adres ook opgeslagen.
Het index.php bestand
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<html>
<head>
<title>Registreer voor uw unieke code!</title>
</head>
<body>
<?php
require("settings/config.php");
require("sendmail.php");
?>
<form method="post" action="">
<label>Mail: </label>
<input type="text" name="mailform">
<br>
<input type="submit" value="Verzeker mijn unieke ID" name="verzend">
</form>
</body>
</html>
<head>
<title>Registreer voor uw unieke code!</title>
</head>
<body>
<?php
require("settings/config.php");
require("sendmail.php");
?>
<form method="post" action="">
<label>Mail: </label>
<input type="text" name="mailform">
<br>
<input type="submit" value="Verzeker mijn unieke ID" name="verzend">
</form>
</body>
</html>
Het sendmail.php bestand
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
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
<?php
//maak verbinding met de SQL server.
$db = new mysqli($conn_host, $conn_user, $conn_passwd, $conn_db);
//check of de invoer van het formulier geldig is
if(isset($_POST['mailform']) && !empty($_POST['mailform'])){
$email = mysql_real_escape_string($_POST['mailform']);
if(!mb_ereg("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email)){
// Foutief mail adres. Geeft foutmelding
echo "<script>alert('$error_invalidmail');</script>";
}else{
// Succesvolle invoer
//Check of het mail adres al niet is geregistreerd in de database
$mailcheck = mysqli_query($db, "SELECT * FROM maindb WHERE mail = '$email'");
if(mysqli_num_rows($mailcheck) > 0){
echo "<script>alert('$error_mailused');</script>";
}else{
// Check of het random nummer niet al bestaat. Indien deze al is gevonden in de database, maak een nieuw nummer aan.
$lot1 = mt_rand($value_min,$value_max);
$check = mysqli_query($db, "SELECT * FROM maindb where lotnummer = $lot1");
if(mysqli_num_rows($check) == 0){
mysqli_query($db, "INSERT INTO maindb (lotnummer, mail) VALUES ('" . $lot1 . "','" . $email . "');");
//zend mail
$mailtext1 = "Beste deelnemer,\n
Uw code voor de loterij is" . $lot1 . ".\n
Bewaar deze code goed, en veel geluk!";
mail($email,$subject,$mailtext1,$header);
}else{
$check2 = $check;
while(mysqli_num_rows($check2) >= 1){
$lot2 = mt_rand($value_min,$value_max);
$check2 = mysqli_query($db, "SELECT * FROM maindb where lotnummer = $lot2");
if(mysqli_num_rows($check2) >= 1){
//Laat de while loop opniew starten
}else{
mysqli_query($db, "INSERT INTO maindb (lotnummer, mail) VALUES ('" . $lot2 . "','" . $email . "');");
//zend mail
$mailtext2 = "Beste deelnemer,\n
Uw code voor de loterij is" . $lot2 . ".\n
Bewaar deze code goed, en veel geluk!";
mail($email,$subject,$mailtext2,$header);
};
};
};
};
};
};
$db->close();
?>
//maak verbinding met de SQL server.
$db = new mysqli($conn_host, $conn_user, $conn_passwd, $conn_db);
//check of de invoer van het formulier geldig is
if(isset($_POST['mailform']) && !empty($_POST['mailform'])){
$email = mysql_real_escape_string($_POST['mailform']);
if(!mb_ereg("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email)){
// Foutief mail adres. Geeft foutmelding
echo "<script>alert('$error_invalidmail');</script>";
}else{
// Succesvolle invoer
//Check of het mail adres al niet is geregistreerd in de database
$mailcheck = mysqli_query($db, "SELECT * FROM maindb WHERE mail = '$email'");
if(mysqli_num_rows($mailcheck) > 0){
echo "<script>alert('$error_mailused');</script>";
}else{
// Check of het random nummer niet al bestaat. Indien deze al is gevonden in de database, maak een nieuw nummer aan.
$lot1 = mt_rand($value_min,$value_max);
$check = mysqli_query($db, "SELECT * FROM maindb where lotnummer = $lot1");
if(mysqli_num_rows($check) == 0){
mysqli_query($db, "INSERT INTO maindb (lotnummer, mail) VALUES ('" . $lot1 . "','" . $email . "');");
//zend mail
$mailtext1 = "Beste deelnemer,\n
Uw code voor de loterij is" . $lot1 . ".\n
Bewaar deze code goed, en veel geluk!";
mail($email,$subject,$mailtext1,$header);
}else{
$check2 = $check;
while(mysqli_num_rows($check2) >= 1){
$lot2 = mt_rand($value_min,$value_max);
$check2 = mysqli_query($db, "SELECT * FROM maindb where lotnummer = $lot2");
if(mysqli_num_rows($check2) >= 1){
//Laat de while loop opniew starten
}else{
mysqli_query($db, "INSERT INTO maindb (lotnummer, mail) VALUES ('" . $lot2 . "','" . $email . "');");
//zend mail
$mailtext2 = "Beste deelnemer,\n
Uw code voor de loterij is" . $lot2 . ".\n
Bewaar deze code goed, en veel geluk!";
mail($email,$subject,$mailtext2,$header);
};
};
};
};
};
};
$db->close();
?>
Het config.php file, te vinden in de map settings\
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
//Extra mail instellingen
$subject = "Uw lotnummer"; //Het onderwerp van de mail die word verzonden.
$header = "[email protected]"; //De afzender van de mail die wordt verstuurd.
//SQL instellingen
$conn_host = "localhost"; //De host van de SQL server.
$conn_user = "user"; //De user die moet worden gebruikt bij login.
$conn_passwd = "password"; //Het password van de gekozen user.
$conn_db = "database"; //De database die moet worden benaderd.
//Error afhandelingen
$error_mailused = "Dit adres is al geregistreerd!"; //De foutmelding die moet worden weergeven wanneer er wordt geregistreerd met een bekend mail adres
$error_invalidmail = "Het mailadres dat u heeft ingevoerd is geen geldig mailadres."; //Melding die wordt weergeven wanneer er een niet geldig mail adres is ingevoerd.
//Overige instellingen
$value_min = 1; //het laagste getal waartussen de random berekening wordt uitgevoerd.
$value_max = 5300; //het hoogste getal waartussen de random berekening wordt uitgevoerd.
?>
//Extra mail instellingen
$subject = "Uw lotnummer"; //Het onderwerp van de mail die word verzonden.
$header = "[email protected]"; //De afzender van de mail die wordt verstuurd.
//SQL instellingen
$conn_host = "localhost"; //De host van de SQL server.
$conn_user = "user"; //De user die moet worden gebruikt bij login.
$conn_passwd = "password"; //Het password van de gekozen user.
$conn_db = "database"; //De database die moet worden benaderd.
//Error afhandelingen
$error_mailused = "Dit adres is al geregistreerd!"; //De foutmelding die moet worden weergeven wanneer er wordt geregistreerd met een bekend mail adres
$error_invalidmail = "Het mailadres dat u heeft ingevoerd is geen geldig mailadres."; //Melding die wordt weergeven wanneer er een niet geldig mail adres is ingevoerd.
//Overige instellingen
$value_min = 1; //het laagste getal waartussen de random berekening wordt uitgevoerd.
$value_max = 5300; //het hoogste getal waartussen de random berekening wordt uitgevoerd.
?>
De error melding die ik eerst krijg is dat mijn mail adres niet geldig is (regel 8 in het sendmail.php file). Deze error melding krijg ik altijd, tenzij ik de if else weghaal, dan krijg ik dat mijn adres al is geregistreerd, terwijl de database toch echt leeg is :)
Alvast bedankt voor de tijd nemen om dit alles te lezen!
Gelieve in het vervolg bij code de [code][/code]-tags gebruiken.[/modedit] <-- Dank voor de tip, zal dit toepassen volgende keer
Gewijzigd op 10/12/2013 12:37:12 door Julian Schuis
Wat gebeurt er wel? Wat gebeurt er niet? Waar stopt het script met werken?
...
Error messages op het scherm te zien? Gelieve die hier te copy/pasten
Kun je misschien ietjes specifieker zijn en vertellen wat er niet werkt. (Schiet a.u.b. helemaal door en vertel het uitgebreid mogelijk.)
Even snel gecopy pased van de main post;
De error melding die ik eerst krijg is dat mijn mail adres niet geldig is (regel 8 in het sendmail.php file). Deze error melding krijg ik altijd, tenzij ik de if else weghaal, dan krijg ik dat mijn adres al is geregistreerd, terwijl de database toch echt leeg is :)
Gewijzigd op 10/12/2013 11:38:46 door Julian Schuis
http://phpwiki.santhe.nl/index.php?title=Check_het_emailadres_op_juistheid
http://phpwiki.santhe.nl/index.php?title=De_juiste_mailheaders
http://phpwiki.santhe.nl/index.php?title=De_juiste_mailheaders
Uhm, of toch weer niet? Op de php manual staat bij mb_ereg dan weer niets over dit feit.... Bestaan deze dan nog wel?
Gewijzigd op 10/12/2013 11:51:23 door Erwin H
Dank voor de links en feedback! Ik ga de code direct even aanpassen
Die mb_ is voor multi byte support.
Laat ons er van uit gaan dat dit niet overeen komt met de database charset, ofwel deprecated, of zo.
Ik stel voor om eerst die functie te vervangen door dit:, zie http://www.php.net/manual/en/function.preg-match.php#83446
dus lijn 8 wordt dan
if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
EDIT
... of een andere e-mail validatie functie ...
Gewijzigd op 10/12/2013 11:54:07 door Kris Peeters
Mocht je met mbstring willen blijven werken:
Wat is het resultaat van de volgende code op beide servers?
Wat vul je in als email adres?
Wat zijn de PHP versies?
Wat zijn de mbstring extensie versies?
Misschien eens kijken naar http://barebonescms.com/documentation/ultimate_email_toolkit/ aangezien emails valideren moeilijk is: http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address
Dos Moonen op 10/12/2013 11:59:29:
mb_erig() is deel van een extensie die standaard niet met PHP gecompiled wordt, mogelijk dat het daar iets mee te maken heeft.
Mocht je met mbstring willen blijven werken:
Wat is het resultaat van de volgende code op beide servers?
Wat vul je in als email adres?
Wat zijn de PHP versies?
Wat zijn de mbstring extensie versies?
Misschien eens kijken naar http://barebonescms.com/documentation/ultimate_email_toolkit/ aangezien emails valideren moeilijk is: http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address
Mocht je met mbstring willen blijven werken:
Wat is het resultaat van de volgende code op beide servers?
Wat vul je in als email adres?
Wat zijn de PHP versies?
Wat zijn de mbstring extensie versies?
Misschien eens kijken naar http://barebonescms.com/documentation/ultimate_email_toolkit/ aangezien emails valideren moeilijk is: http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address
Ik neem aan dat hier wat fout gaat, ik krijg 2 verschillende outputs met dezelfde code
Op de server
string(6) "EUC-JP" string(2) "pr"
Lokaal
string 'EUC-JP' (length=6)
string 'pr' (length=2)
PHP versie op de server draait op 5.3.3, lokaal draait hij op 5.4.12
Toevoeging op 10/12/2013 12:08:40:
Kris Peeters op 10/12/2013 11:50:19:
mb_ereg
Die mb_ is voor multi byte support.
Laat ons er van uit gaan dat dit niet overeen komt met de database charset, ofwel deprecated, of zo.
Ik stel voor om eerst die functie te vervangen door dit:, zie http://www.php.net/manual/en/function.preg-match.php#83446
dus lijn 8 wordt dan
if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
EDIT
... of een andere e-mail validatie functie ...
Die mb_ is voor multi byte support.
Laat ons er van uit gaan dat dit niet overeen komt met de database charset, ofwel deprecated, of zo.
Ik stel voor om eerst die functie te vervangen door dit:, zie http://www.php.net/manual/en/function.preg-match.php#83446
dus lijn 8 wordt dan
if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
EDIT
... of een andere e-mail validatie functie ...
- SanThe - op 10/12/2013 11:47:54:
Zowel met beide deze methodes krijg ik hetzelfde resultaat, geen enkel geldig mail adres wordt geaccepteerd.
Gewijzigd op 10/12/2013 12:05:50 door Julian Schuis
Quote:
Ik neem aan dat hier wat fout gaat, ik krijg 2 verschillende outputs met dezelfde code
Nee, het gaat goed, var_dump() heeft blijkbaar een update gekregen ergens tussen die twee versies. De output is niet precies het zelfde, maar verteld wel precies het zelfde.
Wat vul je in als email adres?
Wat is het resultaat van var_dump($email) ?
Oh, en je gebruikt de MySQL en MySQLi extensies door elkaar, ga http://si1.php.net/manual/en/mysqli.real-escape-string.php gebruiken.
Het zou fijn zijn als je dit keer ALLE vragen beantwoord.
EDIT: Woops... linkte naar de MySQL versie en niet de MySQLi versie zoals ik van plan was. Sorry.
Gewijzigd op 10/12/2013 13:32:14 door Dos Moonen
Dos Moonen op 10/12/2013 12:20:50:
Wat vul je in als email adres?
Wat is het resultaat van var_dump($email) ?
Wat is het resultaat van var_dump($email) ?
Ik gebruik het adres "[email protected]". Op de server krijg ik, na een test mail in te voeren, te zien dat er niks is opgeslagen (bool(false)), terwijl ik op de lokale machine keurig mijn ingevoerde mail te zien krijg; string '[email protected]' .(length=17)
Gewijzigd op 10/12/2013 12:41:08 door Julian Schuis
Bovenin je script:
Julian Schuis op 10/12/2013 12:40:48:
Op de server krijg ik, na een test mail in te voeren, te zien dat er niks is opgeslagen (bool(false))
Ik ga er even van uit dat je mysql_real_escape_string($email) nog niet vervangen hebt/had door mysqli_real_escape_string($db, $email).
Op http://si1.php.net/manual/en/function.mysql-real-escape-string.php valt dit te lezen:
Quote:
Note:
A MySQL connection is required before using mysql_real_escape_string() otherwise an error of level E_WARNING is generated, and FALSE is returned. If link_identifier isn't defined, the last MySQL connection is used.
A MySQL connection is required before using mysql_real_escape_string() otherwise an error of level E_WARNING is generated, and FALSE is returned. If link_identifier isn't defined, the last MySQL connection is used.
Ga over op de MySQLi versie en het zou moeten werken lijkt mij.
Dank voor de tip. Ik probeer nu een aantal errors weg te werken, ik zal nog posten of het allemaal gelukt is.
Oh er bestat trouwens een do {} while(); constructie. Deze wordt minimaal een keer uitgevoerd. Waarschijnlijk iets mooier dan een if en een optionele while.
Ik heb hem werkend gekregen hoor :) Vele dank aan de tips dat ik error reporting aan moest zetten, en dat ik mysql en mysqli door elkaar gooide. Hierdoor wou ie inloggen op de server met mysql credentials, die niet gespecifiseerd waren in het script. Ik heb nu tijdelijk de mysql_real_escape_string weggehaald, ik moet nog even kijken hoe het allemaal werkt met die escape string met mysqli_real_escape_string. Reuze bedankt voor alle hulp!
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
#MySQL:
mysql_query('bla')
mysql_real_escape_string($email)
#MySQLi:
mysqli_query($db, 'bla')
mysqli_real_escape_string($db, $email)
?>
#MySQL:
mysql_query('bla')
mysql_real_escape_string($email)
#MySQLi:
mysqli_query($db, 'bla')
mysqli_real_escape_string($db, $email)
?>
Geen moeilijke verandering.
Gewijzigd op 10/12/2013 13:58:06 door Dos Moonen
mysql_real_escape_string() zou eigenlijk ook 2 paramters moeten hebben: $string, $db.
Maar iedereen laat die 2e toch maar weg, "want er is toch maar 1 connectie, dus php weet wel wat ik bedoel". Totdat je een 2e verbinding gaat gebruiken.
Daarom dwingt mysqli je nu om de connectie expliciet op te geven.
Als je de object-notatie gebruikt, is het allemaal meer dan logisch.