tags:

views:

42

answers:

3

I'm working on a PHP contact form, but I can't get it to work. I get the following error in the Apache server log, running on an Ubuntu Server VM:

PHP Parse error:  syntax error, unexpected $end in /home/matthew/Sites/contactFormResponse.php on line 75, referer: http://192.168.1.4/contactForm.php

From googling this error, it sounds like it's normally caused by either using the short PHP tag when the server's not set up to recognise them, or by having a block of code that isn't closed correctly. But as far as I can see that isn't the case here - as far as I can see it's all closed correctly. The line it refers to is one line past the end of the file.

Here's the PHP code:

 <?php
                                    error_reporting(E_ALL);
                                    // Define variables to hold the name, email address and message, and import the information into the variables
                                    $name = $_POST['NameInput'];
                                    $email = $_POST['EmailAddress'];
                                    $telno = $_POST['ContactNumber'];
                                    $querytype = $_POST['QueryType'];
                                    $bookingstartdate = $_POST['BookingStartDay'] . $_POST['BookingStartMonth'] . $_POST['BookingStartYear'];
                                    $bookingenddate = $_POST['BookingEndDay'] . $_POST['BookingEndMonth'] . $_POST['BookingEndYear'];
                                    $message = $_POST['QueryText'];

                                    // Validate the inputs - send it if it's OK
                                    if(3 < strlen($name) && 3 < strlen($email))
                                    {
                                            $email_message = <<< EMAIL
                                                    Message from contact form at holidaychalet.co.uk
                                                    Name: $name
                                                    Email: $email
                                                    Contact Number: $telno
                                                    Query Type: $querytype
                                                    Booking Start Date: $bookingstartdate
                                                    Booking End Date: $bookingenddate
                                                    The message:
                                                    $message
                                                    EMAIL;
                                            $headers = "cc:[email protected]\r\n";
                                            if(mail('matthew@localhost','Contact form email', $email_message, $headers))
                                            {
                                                    echo "Thanks for completing the form! I'll be in touch shortly!";
                                            }
                                            else
                                            {
                                                    echo "Something went wrong - please use the back button and try again";
                                            }
                                    }
                                    else
                                    {
                                            echo "You didn't complete the form fully enough! Please use go back using your web browser's back button";
                                    }
                            ?>
+4  A: 

The closing identifier for the here document syntax must be at the start of the line without any indentation:

It is very important to note that the line with the closing identifier must contain no other characters, except possibly a semicolon (;). That means especially that the identifier may not be indented, and there may not be any spaces or tabs before or after the semicolon. It's also important to realize that the first character before the closing identifier must be a newline as defined by the local operating system.

So in your case:

                                            $email_message = <<< EMAIL
                                                    Message from contact form at holidaychalet.co.uk
                                                    Name: $name
                                                    Email: $email
                                                    Contact Number: $telno
                                                    Query Type: $querytype
                                                    Booking Start Date: $bookingstartdate
                                                    Booking End Date: $bookingenddate
                                                    The message:
                                                    $message
EMAIL;
Gumbo
+1 Sadly, this is the way it is, rendering HEREDOC useless in most cases.
Pekka
Er? It's still completely usable... having the close identifier not indented doesn't kill code readability. In fact, it makes sense, considering that the indent whitespace for the heredoc *contents* will be included in the string produced, thus it keeps the developer conscious of what they're putting in their strings.
Amber
Cheers, that's solved the issue!
mattbd
+3  A: 
EMAIL;

cannot be indented. Heredoc syntax requires that the closing identifier be at the start of the line, and that includes no leading whitespace.

Amber
+2  A: 

You are filling $email_message with a string which is marked to end with EMAIL;

This one must be in a single line.

Change it to:

                                            $email_message = <<< EMAIL
                                                    Message from contact form at holidaychalet.co.uk
                                                    Name: $name
                                                    Email: $email
                                                    Contact Number: $telno
                                                    Query Type: $querytype
                                                    Booking Start Date: $bookingstartdate
                                                    Booking End Date: $bookingenddate
                                                    The message:
                                                    $message
EMAIL;
favo