Probleem met Undefined index

Status
Niet open voor verdere reacties.

Samuel1

Gebruiker
Lid geworden
16 aug 2010
Berichten
7
Hallo allemaal,

Ik had onlangs een contactformulier gemaakt dat perfect werkte en geen foutmeldingen gaf. Nu sinds enkele dagen krijg ik plots volgende meldingen onder mijn formulier:

PHP Notice: Undefined index: submit in D:\www\7inchrecords.com\www\contact.php on line 28 PHP Notice: Undefined index: submit in D:\www\7inchrecords.com\www\contact.php on line 30 PHP Notice: Undefined index: naam in D:\www\7inchrecords.com\www\contact.php on line 30 PHP Notice: Undefined index: naam in D:\www\7inchrecords.com\www\contact.php on line 45 PHP Notice: Undefined index: mail in D:\www\7inchrecords.com\www\contact.php on line 52 PHP Notice: Undefined index: onderwerp in D:\www\7inchrecords.com\www\contact.php on line 59 PHP Notice: Undefined index: msggs in D:\www\7inchrecords.com\www\contact.php on line 66

Terwijl de form perfect blijft werken, als je ze invult krijg ik mooi een email toe.

Hoe kan ik dit vervelende euvel verhelpen? Hier is de code die ik gebruik:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Where to find us</title>
<link rel="stylesheet" type="text/css" href="sam6.css" >
</head>
<body text="#000000" link="#000000">

<?
// geef e-mail adres op van ontvanger
$mail_ontv = "samuel.coomans@telenet.be";

// is niet 100% !!!
function checkmail($mail)
{
$email_host = explode("@", $mail);
$email_host = $email_host['1'];
$email_resolved = gethostbyname($email_host);

if ($email_resolved != $email_host && eregi("^[0-9a-z]([-_.~]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[a-z]{2,4}$",$mail))
$valid = 1;

return $valid;
}

// als er niet op submit is gedrukt, of als er wel op is gedrukt maar niet alles ingevoerd is
if (!$_POST['submit'] || !$_POST['submit'] && (!$_POST['naam'] || !$_POST['mail'] || !checkmail($_POST['mail']) || !$_POST['msggs'] || !$_POST['onderwerp']))
{
if (!$_POST['submit'] && (!$_POST['naam'] || !$_POST['mail'] || !checkmail($_POST['mail']) || !$_POST['msggs'] || !$_POST['onderwerp']))
{
echo "You forget to fill out your name, email, subject or message. It is also possible that";
echo "you used a wrong email address.<p>";
}

// form + tabel
echo "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" width=\"100%\" height=\"100%\">";
echo "<tr><td align=\"center\" valign=\"middle\">";

echo "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" ALIGN=\"center\">";
echo "<form method=\"POST\" ACTION=\"" . $_SERVER['PHP_SELF'] . "\">";

// naam
echo "<tr><td>Name:</td></tr>";
echo "<tr><td><input type=\"text\" name=\"naam\" value=\"" . $_POST['naam'] . "\"></td></tr>";

// space
echo "<tr><td>&nbsp;</td></tr>";

// mail
echo "<tr><td>E-mail:</td></tr>";
echo "<tr><td><input type=\"text\" name=\"mail\" value=\"" . $_POST['mail'] . "\"></td></tr>";

// space
echo "<tr><td>&nbsp;</td></tr>";

// mail
echo "<tr><td>Subject:</td></tr>";
echo "<tr><td><input type=\"text\" name=\"onderwerp\" value=\"" . $_POST['onderwerp'] . "\"></td></tr>";

// space
echo "<tr><td>&nbsp;</td></tr>";

// mail
echo "<tr><td>Message:</td></tr>";
echo "<tr><td><TEXTAREA name=\"msggs\" ROWS=\"6\" COLS=\"45\">" . htmlentities($_POST['msggs']) . "</TEXTAREA></td></tr>";

// space
echo "<tr><td>&nbsp;</td></tr>";

// button
echo "<tr><td>&nbsp;</td></tr>";
echo "<tr><td><input type=\"submit\" name=\"submit\" value=\"Send\"></td></tr>";

// sluit form + tabel
echo "</form>";
echo "</table>";

echo "</td></tr>";
echo "</table>";
}
// versturen naar
else
{
// set datum
$datum = date("d.m.Y H:i");

// set ip
$ip = $_SERVER['REMOTE_ADDR'];

$inhoud_mail = "===================================================\n";
$inhoud_mail .= "Ingevulde contact formulier\n";
$inhoud_mail .= "===================================================\n\n";

$inhoud_mail .= $_SERVER['SCRIPT_URI'] . "\n\n";

$inhoud_mail .= "Naam: " . $_POST['naam'] . "\n";
$inhoud_mail .= "E-mail adres: " . $_POST['mail'] . "\n";
$inhoud_mail .= "Bericht:\n";
$inhoud_mail .= $_POST['msggs'] . "\n\n";

$inhoud_mail .= "Verstuurd op " . $datum . " via het ip " . $ip . "\n\n";

$inhoud_mail .= "===================================================\n\n";

// --------------------
// spambot protectie
// ------
// van de tutorial: http://www.phphulp.nl/php/tutorials/10/340/
// ------

$headers = "From: " . $_POST['naam'] . " <" . $_POST['mail'] . ">";

$headers = stripslashes($headers);
$headers = str_replace("\n", "", $headers); // Verwijder \n
$headers = str_replace("\r", "", $headers); // Verwijder \r
$headers = str_replace("\"", "\\\"", str_replace("\\", "\\\\", $headers)); // Slashes van quotes

$_POST['onderwerp'] = str_replace("\n", "", $_POST['onderwerp']); // Verwijder \n
$_POST['onderwerp'] = str_replace("\r", "", $_POST['onderwerp']); // Verwijder \r
$_POST['onderwerp'] = str_replace("\"", "\\\"", str_replace("\\", "\\\\", $_POST['onderwerp'])); // Slashes van quotes

mail($mail_ontv, $_POST['onderwerp'], $inhoud_mail, $headers);

echo "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" width=\"100%\" height=\"100%\">";
echo "<tr><td align=\"center\" valign=\"middle\">";
echo "<h2>Your email has been sent</h2>";

echo "<p>Thanks for sending your message, <br>we will respond as soon as possible.</p>";
echo '<A HREF="http://www.7inchrecords.com/home.htm" target="main">Click here to go back to my homepage</A>';
echo "</td></tr>";
echo "</table>";
}
?>

</body>
</html>
 
De code tussen php tags

PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Where to find us</title>
<link rel="stylesheet" type="text/css" href="sam6.css" >
</head>
<body text="#000000" link="#000000">

<? 
// geef e-mail adres op van ontvanger 
$mail_ontv = "samuel.coomans@telenet.be";

// is niet 100% !!! 
function checkmail($mail) 
{ 
$email_host = explode("@", $mail); 
$email_host = $email_host['1']; 
$email_resolved = gethostbyname($email_host); 

if ($email_resolved != $email_host && eregi("^[0-9a-z]([-_.~]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[a-z]{2,4}$",$mail)) 
$valid = 1; 

return $valid; 
} 

// als er niet op submit is gedrukt, of als er wel op is gedrukt maar niet alles ingevoerd is 
if (!$_POST['submit'] || !$_POST['submit'] && (!$_POST['naam'] || !$_POST['mail'] || !checkmail($_POST['mail']) || !$_POST['msggs'] || !$_POST['onderwerp'])) 
{ 
if (!$_POST['submit'] && (!$_POST['naam'] || !$_POST['mail'] || !checkmail($_POST['mail']) || !$_POST['msggs'] || !$_POST['onderwerp'])) 
{ 
echo "You forget to fill out your name, email, subject or message. It is also possible that"; 
echo "you used a wrong email address.<p>"; 
} 

// form + tabel 
echo "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" width=\"100%\" height=\"100%\">";
echo "<tr><td align=\"center\" valign=\"middle\">";

echo "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" ALIGN=\"center\">"; 
echo "<form method=\"POST\" ACTION=\"" . $_SERVER['PHP_SELF'] . "\">"; 

// naam 
echo "<tr><td>Name:</td></tr>"; 
echo "<tr><td><input type=\"text\" name=\"naam\" value=\"" . $_POST['naam'] . "\"></td></tr>"; 

// space 
echo "<tr><td>&nbsp;</td></tr>"; 

// mail 
echo "<tr><td>E-mail:</td></tr>"; 
echo "<tr><td><input type=\"text\" name=\"mail\" value=\"" . $_POST['mail'] . "\"></td></tr>"; 

// space 
echo "<tr><td>&nbsp;</td></tr>"; 

// mail 
echo "<tr><td>Subject:</td></tr>"; 
echo "<tr><td><input type=\"text\" name=\"onderwerp\" value=\"" . $_POST['onderwerp'] . "\"></td></tr>"; 

// space 
echo "<tr><td>&nbsp;</td></tr>"; 

// mail 
echo "<tr><td>Message:</td></tr>"; 
echo "<tr><td><TEXTAREA name=\"msggs\" ROWS=\"6\" COLS=\"45\">" . htmlentities($_POST['msggs']) . "</TEXTAREA></td></tr>"; 

// space 
echo "<tr><td>&nbsp;</td></tr>"; 

// button 
echo "<tr><td>&nbsp;</td></tr>"; 
echo "<tr><td><input type=\"submit\" name=\"submit\" value=\"Send\"></td></tr>"; 

// sluit form + tabel 
echo "</form>"; 
echo "</table>";

echo "</td></tr>";
echo "</table>";
} 
// versturen naar 
else 
{ 
// set datum 
$datum = date("d.m.Y H:i"); 

// set ip 
$ip = $_SERVER['REMOTE_ADDR']; 

$inhoud_mail = "===================================================\n"; 
$inhoud_mail .= "Ingevulde contact formulier\n"; 
$inhoud_mail .= "===================================================\n\n"; 

$inhoud_mail .= $_SERVER['SCRIPT_URI'] . "\n\n";

$inhoud_mail .= "Naam: " . $_POST['naam'] . "\n"; 
$inhoud_mail .= "E-mail adres: " . $_POST['mail'] . "\n"; 
$inhoud_mail .= "Bericht:\n"; 
$inhoud_mail .= $_POST['msggs'] . "\n\n"; 

$inhoud_mail .= "Verstuurd op " . $datum . " via het ip " . $ip . "\n\n"; 

$inhoud_mail .= "===================================================\n\n"; 

// -------------------- 
// spambot protectie 
// ------ 
// van de tutorial: http://www.phphulp.nl/php/tutorials/10/340/ 
// ------ 

$headers = "From: " . $_POST['naam'] . " <" . $_POST['mail'] . ">";

$headers = stripslashes($headers);
$headers = str_replace("\n", "", $headers); // Verwijder \n 
$headers = str_replace("\r", "", $headers); // Verwijder \r 
$headers = str_replace("\"", "\\\"", str_replace("\\", "\\\\", $headers)); // Slashes van quotes 

$_POST['onderwerp'] = str_replace("\n", "", $_POST['onderwerp']); // Verwijder \n 
$_POST['onderwerp'] = str_replace("\r", "", $_POST['onderwerp']); // Verwijder \r 
$_POST['onderwerp'] = str_replace("\"", "\\\"", str_replace("\\", "\\\\", $_POST['onderwerp'])); // Slashes van quotes 

mail($mail_ontv, $_POST['onderwerp'], $inhoud_mail, $headers); 

echo "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" width=\"100%\" height=\"100%\">";
echo "<tr><td align=\"center\" valign=\"middle\">";
echo "<h2>Your email has been sent</h2>";

echo "<p>Thanks for sending your message, <br>we will respond as soon as possible.</p>";
echo '<A HREF="http://www.7inchrecords.com/home.htm" target="main">Click here to go back to my homepage</A>';
echo "</td></tr>";
echo "</table>";
} 
?> 

</body>
</html>
 
Weet het niet helemaal zeker, maar volgens mij komt het omdat je je inputs escaped.

PHP:
><input type=\"text\" name=\"onderwerp\" value=\"" . $_POST['onderwerp'] . "\"></
//Waarom niet gewoon zo:
><input type="text" name="onderwerp" value='" . $_POST['onderwerp'] . "'></
 
Laatst bewerkt:
Hello Robin,

Bedankt voor je antwoord. Ik heb geprobeert wat jij suggereert maar hellaas krijg ik dan helemaal niets meer op mijn scherm, de php werkt dan niet meer.

Er moet toch ergens een reden zijn dat hij deze meldingen geeft, misschien iets heel eenvoudigs???

Dank voor enig ander antwoord.

Samuel
 
Er zijn twee hele eenvoudige redenen ;) De eerste is dat je script altijd al fout was, maar dat de error reporting instellingen veranderd zijn en je nu alle errors ziet ipv alleen ernstige, vandaar dat ze nu pas op het scherm ziet.

De twee is dat je indexes aanroept die niet bestaan. Je checkt namelijk op !$_POST['submit'], maar dat is een controle of submit FALSE is, niet of hij bestaat. Als je wil controleren of een veld bestaat moet je isset gebruiken:

PHP:
if ( !isset( $_POST['submit'] ) {

Daarmee kijk je of het veld bestaat.

Verder kun je ook controleren of een formulier is ingezonden door te kijken of het met POST of GET is aangevraagd:
PHP:
if( $_SERVER['REQUEST_METHOD'] == 'POST' ) { // er is een formulier ingezonden

Succes :)
 
Het is een notice, iets wat PHP opmerkt, het is geen fout of een error in ieder geval. Je kan het verhelpen door om elke $_POST['iets'] een isset() te doen, dus isset($_POST['iets']). Mogelijk zal je script dan niet meer helemaal correct werken.

Wat PHP nu opmerkt is dat je iets opvraagt vanaf het formulier, maar PHP weet niet zeker of dat bestaat. Met isset() controleer je of het wel bestaat.

Maar in principe is het niet nodig om het te doen. Je script werkt goed, alleen dit zijn net de puntjes op de I. Mocht je niets meer aan je script willen veranderen, kun je er ook voor kiezen om de error_reporting aan te passen van PHP zodat hij de notices niet meer laat zien.
 
Aan SumBeam,

Hoe kan ik de error reporting in php uitschakelen of aanpassen?
Ik heb geprobeert om isset te gebruiken maar dan werkt de pagina inderdaad niet meer.
Uiteindelijk is er op zich niets fout aan de code en werkt het formulier perfect.

Ik ben nl. nogal een leek in php en de code die ik hier heb gebruikt komt van een engelse website waar je gratis php code kan downloaden om je webpagina te maken. Ik heb gewoon alle parameters verandert.

Bedankt!

Samuel
 
PHP:
// Turn off all error reporting
error_reporting(0);

// Report all errors except E_NOTICE
// This is the default value set in php.ini
error_reporting(E_ALL ^ E_NOTICE);


Dit moet je dan bovenaan in je script zetten. Je kan er voor kiezen om geen enkele error meer te laten zien (doe ik zelf ook voor websites die publiekelijk bezocht worden), zodat je je bezoekers niet met een foutmelding opscheept. Je ziet dan gewoon een witte pagina.

Die laatste kan ook, die weergeeft alles (dus ook errors), maar alleen die notices niet.

Niet beide erin zetten dus, 1 van die twee (er zijn nog veel meer mogelijkheden, maar die lijken me voor hier niet nuttig)


Meer informatie kun je hier lezen over error_reporting: Linkje
 
Laatst bewerkt:
Als je ALLES uitzet dan loop je wel het risico dat je het niet doorhebt als je hele script aan het crashen is; mgoed als je al aangeeft dat je zelf niet kunt scripten dan kun je dat net zo goed doen waarschijnlijk :)
 
Bedankt allemaal!

Euvel is nu verholpen en alles werkt prima ;-)

Samuel
 
Hellaas, is toch niet opgelost. Nu geeft hij wel geen errors meer als je de pagina opend maar wel als je wil versturen. Volgende melding wordt dan zichtbaar:

PHP Deprecated: Function eregi() is deprecated in D:\www\7inchrecords.com\www\contact.php on line 25

??? Iemand

Groetjes,

Samuel
 
Als ik jou was zou ik een moderner script zoeken, deze is verouderd.

Als je de error reporting op error_reporting(0) zet zou deze ook weg moeten zijn, maar als je je PHP versie upgrade is het hele script onbruikbaar dus je kunt beter van tevoren een nieuwe zoeken dan een tijdlang zonder zitten.
 
PHP:
preg_match('/^[0-9a-z]([-_.~]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[a-z]{2,4}$/', $mail);

Vervang die eregi eens met bovenstaande... De functie eregi is oud en PHP geeft een melding daarover. (Ik heb geen idee of het in 1x werkt, ik heb hem niet getest)
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan