PHP script werkt wel lokaal, niet op server

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Julian Schuis

Julian Schuis

10/12/2013 11:31:32
Quote Anchor link
Beste PHP forum members,

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)
PHP script in nieuw venster Selecteer het PHP script
1
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>

Het sendmail.php bestand
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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();
?>

Het config.php file, te vinden in de map settings\
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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.
?>

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
 
PHP hulp

PHP hulp

24/12/2024 19:53:38
 
Kris Peeters

Kris Peeters

10/12/2013 11:36:29
Quote Anchor link
Wat zijn de symptomen?

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
 
Dos Moonen

Dos Moonen

10/12/2013 11:37:55
Quote Anchor link
Kun je misschien ietjes specifieker zijn en vertellen wat er niet werkt. (Schiet a.u.b. helemaal door en vertel het uitgebreid mogelijk.)
 
Julian Schuis

Julian Schuis

10/12/2013 11:38:29
Quote Anchor link
Dank voor de snelle reactie, ik heb de symptomen onder de post geplaatst. Gek genoeg heeft het main probleem niks met een sql connactie te maken.

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
 
- SanThe -

- SanThe -

10/12/2013 11:47:54
 
Erwin H

Erwin H

10/12/2013 11:48:43
Quote Anchor link
Dan werk je lokaal waarschijnlijk op een antieke versie van php, terwijl je server wat meer up to date is. De "ereg" functies zijn namelijk 'deprecated' (oftewel verwijderd uit php), die kan je dus niet meer gebruiken als je op een beetje recente versie werkt.

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
 
Julian Schuis

Julian Schuis

10/12/2013 11:50:05
Quote Anchor link
Dank voor de links en feedback! Ik ga de code direct even aanpassen
 
Kris Peeters

Kris Peeters

10/12/2013 11:50:19
Quote Anchor link
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 ...
Gewijzigd op 10/12/2013 11:54:07 door Kris Peeters
 
Dos Moonen

Dos Moonen

10/12/2013 11:59:29
Quote Anchor link
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?
Code (php)
PHP script in nieuw venster Selecteer het PHP script


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
 
Julian Schuis

Julian Schuis

10/12/2013 12:04:28
Quote Anchor link
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?
Code (php)
PHP script in nieuw venster Selecteer het PHP script


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 ...





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
 
Dos Moonen

Dos Moonen

10/12/2013 12:20:50
Quote Anchor link
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
 
Julian Schuis

Julian Schuis

10/12/2013 12:40:48
Quote Anchor link
Dos Moonen op 10/12/2013 12:20:50:
Wat vul je in als email adres?
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
 
- SanThe -

- SanThe -

10/12/2013 13:05:30
Quote Anchor link
Zet je errors eens aan:

Bovenin je script:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);

// rest
?>
 
Dos Moonen

Dos Moonen

10/12/2013 13:27:27
Quote Anchor link
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.


Ga over op de MySQLi versie en het zou moeten werken lijkt mij.
 
Julian Schuis

Julian Schuis

10/12/2013 13:32:19
Quote Anchor link
Dank voor de tip. Ik probeer nu een aantal errors weg te werken, ik zal nog posten of het allemaal gelukt is.
 
Dos Moonen

Dos Moonen

10/12/2013 13:45:50
Quote Anchor link
Oh er bestat trouwens een do {} while(); constructie. Deze wordt minimaal een keer uitgevoerd. Waarschijnlijk iets mooier dan een if en een optionele while.
 
Julian Schuis

Julian Schuis

10/12/2013 13:52:20
Quote Anchor link
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!
 
Dos Moonen

Dos Moonen

10/12/2013 13:56:35
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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)

?>


Geen moeilijke verandering.
Gewijzigd op 10/12/2013 13:58:06 door Dos Moonen
 
Ivo P

Ivo P

10/12/2013 17:24:40
Quote Anchor link
of strikter genomen:

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.
 
Kris Peeters

Kris Peeters

11/12/2013 13:33:25
Quote Anchor link
Wel, ik snap niet dat mensen mysqli gebruiken met de procedurele notatie.
Als je de object-notatie gebruikt, is het allemaal meer dan logisch.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.