Muse Enquiry Form and PHP error

I created a website on Adobe Muse CC and the form is not working properly. I saw the threads for other people where you have guided them on what to do, I am a novice when it comes to this and would like some advice.
I think our emails and websites are hosted on the same provider, but I am unsure.
We are receiving the same PHP error other people have where the form script is missing ‘Form PHP script is missing from web server, or PHP is not configured correctly on your web hosting provider. Check if the form PHP script has been uploaded correctly, then contact your hosting provider about PHP configuration.’
For some of our other websites we have had to set up SMTP mailers to make the contact form’s work. I believe it may be the same thing but we had a web developer who helped with this, I would need step-by-step guidance if this would solve our problems.
Our website is www.century21franchise.co.uk
Could anyone help?

Hi clairebevan welcome to the forum

I noticed some design issues at that link, but did not see a form. Where is it?

Or better yet, please post the form’s HTML and the PHP code. Can’t really analyze PHP code without seeing it.

Hi Mittineague, there’s a form on the left hand side of the site under ‘register your interest’ tab.
I’ll look at the other things you asked for and send those over first thing tomorrow.

1 Like

The PHP code’s for the forms are:
form-u1375.php
form_check.php
form_process.php
form_throttle.php

I’m sorry, you’ll need to give us the code not just the file names. That tells us nothing…

Is the below what you need?

<?php 
/* 	
If you see this text in your browser, PHP is not configured correctly on this hosting provider. 
Contact your hosting provider regarding PHP configuration for your site.

PHP file generated by Adobe Muse CC 2017.0.2.363
*/

require_once('form_process.php');

$form = array(
	'subject' => 'A-Master Form Submission',
	'heading' => 'New Form Submission',
	'success_redirect' => '',
	'resources' => array(
		'checkbox_checked' => 'Selected',
		'checkbox_unchecked' => 'Unselected',
		'submitted_from' => 'Form submitted from website: %s',
		'submitted_by' => 'Visitor IP address: %s',
		'too_many_submissions' => 'Too many recent submissions from this IP',
		'failed_to_send_email' => 'Failed to send email',
		'invalid_reCAPTCHA_private_key' => 'Invalid reCAPTCHA private key.',
		'invalid_reCAPTCHA2_private_key' => 'Invalid reCAPTCHA 2.0 private key.',
		'invalid_reCAPTCHA2_server_response' => 'Invalid reCAPTCHA 2.0 server response.',
		'invalid_field_type' => 'Unknown field type \'%s\'.',
		'invalid_form_config' => 'Field \'%s\' has an invalid configuration.',
		'unknown_method' => 'Unknown server request method'
	),
	'email' => array(
		'from' => 'opportunities@century21franchise.co.uk',
		'to' => 'opportunities@century21franchise.co.uk'
	),
	'fields' => array(
		'Email' => array(
			'order' => 1,
			'type' => 'email',
			'label' => 'Email*',
			'required' => true,
			'errors' => array(
				'required' => 'Field \'Email*\' is required.',
				'format' => 'Field \'Email*\' has an invalid email address.'
			)
		),
		'custom_U1414' => array(
			'order' => 3,
			'type' => 'string',
			'label' => 'First Name*',
			'required' => true,
			'errors' => array(
				'required' => 'Field \'First Name*\' is required.'
			)
		),
		'custom_U1397' => array(
			'order' => 4,
			'type' => 'string',
			'label' => 'Contact Number*',
			'required' => true,
			'errors' => array(
				'required' => 'Field \'Contact Number*\' is required.'
			)
		),
		'custom_U1401' => array(
			'order' => 6,
			'type' => 'string',
			'label' => 'Message',
			'required' => false,
			'errors' => array(
			)
		),
		'custom_U1420' => array(
			'order' => 2,
			'type' => 'string',
			'label' => 'Title',
			'required' => false,
			'errors' => array(
			)
		),
		'custom_U1405' => array(
			'order' => 5,
			'type' => 'string',
			'label' => 'Surname*',
			'required' => true,
			'errors' => array(
				'required' => 'Field \'Surname*\' is required.'
			)
		),
		'custom_U1424' => array(
			'order' => 8,
			'type' => 'string',
			'label' => 'Other',
			'required' => false,
			'errors' => array(
			)
		),
		'custom_U1376' => array(
			'order' => 7,
			'type' => 'checkboxgroup',
			'label' => 'Where did you hear about us?',
			'required' => false,
			'optionItems' => array(
				'Google or other search engine',
				'Century 21 Website',
				'Social Media',
				'Word of mouth',
				'3rd Party franchise website',
				'Email newsletter'
			),
			'errors' => array(
				'format' => 'Field \'Where did you hear about us?\' has an invalid value.'
			)
		)
	)
);

process_form($form);
?>
<?php 
/* 	
If you see this text in your browser, PHP is not configured correctly on this hosting provider. 
Contact your hosting provider regarding PHP configuration for your site.

PHP file generated by Adobe Muse CC 2017.0.2.363
*/

require_once('form_throttle.php');

if ($_SERVER['REQUEST_METHOD'] == 'GET') 
{
	$supportResponse = checkSupport();
	if (!empty($_GET['mode']) and $_GET['mode'] == 'verify')
	{
		echo $supportResponse;
		exit;
	}
	
	echo('<!DOCTYPE html><html><head><title>Muse PHP Diagnostics</title>');
	echo('<style type="text/css">body { font: 14pt Myriad Pro, Arial, Helvetica;}ul { list-style-type: none; }');
	echo(' h1 { background-color: #CCCCCC; padding: 2px;} label {display: inline-block; width: 100px; vertical-align: top;}');
	echo('.good:before { color: green; content:\'\2713\0020\';} .bad:before {color: red; content: \'X\0020\';}');
	echo('</style></head><body>');
	echo('<h1>Diagnostics</h1><ul>');
	
	if (strrpos($supportResponse,'PHP:0;') === false)
	{
		echo('<li class="bad">PHP version too low');
	}
	else 
	{ 
		echo('<li class="good">PHP version ok');
	}
	if (strrpos($supportResponse,'Mail:0;') === false)
	{
		echo('<li class="bad">Mail configuration: PHP mail() configured incorrectly on server. Form will not be able to send email.');
	}
	else
	{
		echo('<li class="good">Mail configuration: No known problems detected with php mail configuration.');
	}
	
	if (strrpos($supportResponse,'SQL:1;') !== false)
	{
		echo('<li class="bad">Spam control: SQLite not found. Form may send email successfully, but limiting spam submissions by IP address will not work.');
	}
	else if (strrpos($supportResponse,'SQL:8;') !== false)
	{
		echo('<li class="bad">Spam control: Cannot write to scripts directory. Form may send email successfully, but limiting spam submissions by IP address will not work.');
	}
	else if (strrpos($supportResponse,'SQL:0;') === false)
	{
		echo('<li class="bad">Spam control: SQL configuration problem. Form may send email successfully, but limiting spam submissions by IP address will not work.');
	}
	else 
	{ 
		echo('<li class="good">Spam control: Emails will be limited to 25 in 2 hours from the same IP address.');
	}
	echo('</ul><br/><br/>');
	
	echo('</body></html>');
}

$phpError = '';
function phpErrorHandler($errno, $errstr, $errfile, $errline)
{
	global $phpError;
    if (!(error_reporting() & $errno)) 
    {
        return;
    }

    $phpError .= $errstr;
    return true;
}

function checkSupport()
{	
	global $phpError;
	set_error_handler("phpErrorHandler");
		
	$response = '';
	$throttleSupport = formthrottle_check();
	$response ='SQL:' . $throttleSupport . ';';

	$version = explode('.', PHP_VERSION);
	if ($version[0] < 4 || ($version[0] == 4 && $version[1] < 1))
	{
		$response .='PHP:1;';
		return $response;
	}
	else 
	{ 
		$response .='PHP:0;';
	}

	if (strncasecmp(php_uname('s'), 'win', 3) == 0) 
	{ 
		$mailserver = ini_get('SMTP');
	}
	else
	{
		$mailserver = ini_get('sendmail_path');
	}
	if (strlen($mailserver) == 0)
	{
		$response .='Mail:1;';
	}
	else
	{
		if (!function_exists("mail")) 
		{ 
			$response .='Mail:2;';
		}  
		else
		{
			$sent = mail("recipient@example.com", "Hi", "test message", "From: sender@example.com");
			if($sent)
			{
				$response .='Mail:0;';
			}
			else
			{
				$response .='Mail:3;';			
			}
		}
	}
			
	if($phpError != '')
	{
		$response .='PHPError:' . $phpError;
	}

	return $response;
<?php 
/* 	
If you see this text in your browser, PHP is not configured correctly on this hosting provider. 
Contact your hosting provider regarding PHP configuration for your site.

PHP file generated by Adobe Muse CC 2017.0.2.363
*/

require_once('form_throttle.php');

function process_form($form) {
	if ($_SERVER['REQUEST_METHOD'] != 'POST')
		die(get_form_error_response($form['resources']['unknown_method']));

	if (formthrottle_too_many_submissions($_SERVER['REMOTE_ADDR']))
		die(get_form_error_response($form['resources']['too_many_submissions']));
	
	// will die() if there are any errors
	check_required_fields($form);
	
	// will die() if there is a send email problem
	email_form_submission($form);
}

function get_form_error_response($error) {
	return get_form_response(false, array('error' => $error));
}

function get_form_response($success, $data) {
	if (!is_array($data))
		die('data must be array');
		
	$status = array();
	$status[$success ? 'FormResponse' : 'MusePHPFormResponse'] = array_merge(array('success' => $success), $data);
	
	return json_serialize($status);
}

function check_required_fields($form) {
	$errors = array();

	foreach ($form['fields'] as $field => $properties) {
		if (!$properties['required'])
			continue;

		if (!array_key_exists($field, $_REQUEST) || ($_REQUEST[$field] !== "0" && empty($_REQUEST[$field])))
			array_push($errors, array('field' => $field, 'message' => $properties['errors']['required']));
		else if (!check_field_value_format($form, $field, $properties))
			array_push($errors, array('field' => $field, 'message' => $properties['errors']['format']));
	}

	if (!empty($errors))
		die(get_form_error_response(array('fields' => $errors)));
}

function check_field_value_format($form, $field, $properties) {
	$value = get_form_field_value($field, $properties, $form['resources'], false);

	switch($properties['type']) {
		case 'checkbox':
		case 'string':
		case 'captcha':
			// no format to validate for those fields
			return true;

		case 'checkboxgroup':
			if (!array_key_exists('optionItems', $properties))
				die(get_form_error_response(sprintf($form['resources']['invalid_form_config'], $properties['label'])));

			// If the value received is not an array, treat it as invalid format
			if (!isset($value))
				return false;

			// Check each option to see if it is a valid value
			foreach($value as $checkboxValue) {
				if (!in_array($checkboxValue, $properties['optionItems']))
					return false;
			}

			return true;

		case 'radiogroup':
			if (!array_key_exists('optionItems', $properties))
				die(get_form_error_response(sprintf($form['resources']['invalid_form_config'], $properties['label'])));

			//check list of real radio values
			return in_array($value, $properties['optionItems']);
	
		case 'recaptcha':
			if (!array_key_exists('recaptcha', $form) || !array_key_exists('private_key', $form['recaptcha']) || empty($form['recaptcha']['private_key']))
				die(get_form_error_response($form['resources']['invalid_reCAPTCHA_private_key']));
			$resp = recaptcha_check_answer($form['recaptcha']['private_key'], $_SERVER["REMOTE_ADDR"], $_POST["recaptcha_challenge_field"], $_POST["recaptcha_response_field"]);
			return $resp->is_valid;

		case 'recaptcha2':
			if (!array_key_exists('recaptcha2', $form) || !array_key_exists('private_key', $form['recaptcha2']) || empty($form['recaptcha2']['private_key']))
				die(get_form_error_response($form['resources']['invalid_reCAPTCHA2_private_key']));

			$resp = recaptcha2_check_answer($form['recaptcha2']['private_key'], $_POST["g-recaptcha-response"], $_SERVER["REMOTE_ADDR"]);
			return $resp["success"];

		case 'email':
			return 1 == preg_match('/^[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i', $value);

		case 'radio': // never validate the format of a single radio element; only the group gets validated
		default:
			die(get_form_error_response(sprintf($form['resources']['invalid_field_type'], $properties['type'])));
	}
}

/**
 * Returns an object with following properties:
 *	"success": true|false,
 *	"challenge_ts": timestamp,  // timestamp of the challenge load (ISO format yyyy-MM-dd'T'HH:mm:ssZZ)
 *	"hostname": string,         // the hostname of the site where the reCAPTCHA was solved
 *	"error-codes": [...]        // optional; possibe values:
 *									missing-input-secret - The secret parameter is missing
 *									invalid-input-secret - The secret parameter is invalid or malformed
 *									missing-input-response - The response parameter is missing
 *									invalid-input-response - The response parameter is invalid or malformed
 */
function recaptcha2_check_answer($secret, $response, $remoteIP) {
	$url = 'https://www.google.com/recaptcha/api/siteverify';
	$data = array(
		'secret' => $secret,
		'response' => $response,
		'remoteip' => $remoteIP
	);

	$options = array(
		'http' => array(
			'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
			'method'  => 'POST',
			'content' => http_build_query($data)
		)
	);
	
	$context = stream_context_create($options);
	$contents = file_get_contents($url, false, $context);
	if ($contents === FALSE) {
		die(get_form_error_response($form['resources']['invalid_reCAPTCHA2_server_response']));
	}

	$result = (array) json_decode($contents);
	return $result;
}

function email_form_submission($form) {
	if(!defined('PHP_EOL'))
		define('PHP_EOL', '\r\n');

	$form_email = ((array_key_exists('Email', $_REQUEST) && !empty($_REQUEST['Email'])) ? cleanup_email($_REQUEST['Email']) : '');

	$to = $form['email']['to'];
	$subject = $form['subject'];
	$message = get_email_body($subject, $form['heading'], $form['fields'], $form['resources']);
	$headers = get_email_headers($to, $form_email);	

	$sent = @mail($to, $subject, $message, $headers);
	
	if(!$sent)
		die(get_form_error_response($form['resources']['failed_to_send_email']));
	
	$success_data = array(
		'redirect' => $form['success_redirect']
    );
	
	echo get_form_response(true, $success_data);
}

function get_email_headers($to_email, $form_email) {
	$headers = 'From: ' . $to_email . PHP_EOL;
	$headers .= 'Reply-To: ' . $form_email . PHP_EOL;
	$headers .= 'X-Mailer: Adobe Muse CC 2017.0.2.363 with PHP' . PHP_EOL;
	$headers .= 'Content-type: text/html; charset=utf-8' . PHP_EOL;
	
	return $headers;
}

function get_email_body($subject, $heading, $fields, $resources) {
	$message = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';
	$message .= '<html xmlns="http://www.w3.org/1999/xhtml">';
	$message .= '<head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><title>' . encode_for_form($subject) . '</title></head>';
	$message .= '<body style="background-color: #ffffff; color: #000000; font-style: normal; font-variant: normal; font-weight: normal; font-size: 12px; line-height: 18px; font-family: helvetica, arial, verdana, sans-serif;">';
	$message .= '<h2 style="background-color: #eeeeee;">' . $heading . '</h2>';
	$message .= '<table cellspacing="0" cellpadding="0" width="100%" style="background-color: #ffffff;">'; 

	$sorted_fields = array();
	
	foreach ($fields as $field => $properties) {
		// Skip reCAPTCHA from email submission
		if ('recaptcha' == $properties['type'] || 'recaptcha2' == $properties['type'])
			continue;

		array_push($sorted_fields, array('field' => $field, 'properties' => $properties));
	}

	// sort fields
	usort($sorted_fields, 'field_comparer');

	foreach ($sorted_fields as $field_wrapper)
		$message .= '<tr><td valign="top" style="background-color: #ffffff;"><b>' . encode_for_form($field_wrapper['properties']['label']) . ':</b></td><td>' . get_form_field_value($field_wrapper['field'], $field_wrapper['properties'], $resources, true) . '</td></tr>';

	$message .= '</table>';
	$message .= '<br/><br/>';
	$message .= '<div style="background-color: #eeeeee; font-size: 10px; line-height: 11px;">' . sprintf($resources['submitted_from'], encode_for_form($_SERVER['SERVER_NAME'])) . '</div>';
	$message .= '<div style="background-color: #eeeeee; font-size: 10px; line-height: 11px;">' . sprintf($resources['submitted_by'], encode_for_form($_SERVER['REMOTE_ADDR'])) . '</div>';
	$message .= '</body></html>';

	return cleanup_message($message);
}

function field_comparer($field1, $field2) {
	if ($field1['properties']['order'] == $field2['properties']['order'])
		return 0;

	return (($field1['properties']['order'] < $field2['properties']['order']) ? -1 : 1);
}

function is_assoc_array($arr) {
	if (!is_array($arr))
		return false;
	
	$keys = array_keys($arr);
	foreach (array_keys($arr) as $key)
		if (is_string($key)) return true;

	return false;
}

function json_serialize($data) {

	if (is_assoc_array($data)) {
		$json = array();
	
		foreach ($data as $key => $value)
			array_push($json, '"' . $key . '": ' . json_serialize($value));
	
		return '{' . implode(', ', $json) . '}';
	}
	
	if (is_array($data)) {
		$json = array();
	
		foreach ($data as $value)
			array_push($json, json_serialize($value));
	
		return '[' . implode(', ', $json) . ']';
	}
	
	if (is_int($data) || is_float($data))
		return $data;
	
	if (is_bool($data))
		return $data ? 'true' : 'false';
	
	return '"' . encode_for_json($data) . '"';
}

function encode_for_json($value) {
	return preg_replace(array('/([\'"\\t\\\\])/i', '/\\r/i', '/\\n/i'), array('\\\\$1', '\\r', '\\n'), $value);
}

function encode_for_form($text) {
	$text = stripslashes($text);
	return htmlentities($text, ENT_QUOTES, 'UTF-8');// need ENT_QUOTES or webpro.js jQuery.parseJSON fails
}

function get_form_field_value($field, $properties, $resources, $forOutput) {
	$value = $_REQUEST[$field];
	
	switch($properties['type']) {
		case 'checkbox':
			return (($value == '1' || $value == 'true') ? $resources['checkbox_checked'] : $resources['checkbox_unchecked']);
		
		case 'checkboxgroup':
			if (!is_array($value))
				return NULL;

			$outputValue = array();

			foreach ($value as $checkboxValue)
				array_push($outputValue, $forOutput ? encode_for_form($checkboxValue) : stripslashes($checkboxValue));
			
			if ($forOutput)
				$outputValue = implode(', ', $outputValue);

			return $outputValue;
		
		case 'radiogroup':
			return ($forOutput ? encode_for_form($value) : stripslashes($value));
		
		case 'string':
		case 'captcha':
		case 'recaptcha':
		case 'recaptcha2':
		case 'email':
			return encode_for_form($value);

		case 'radio': // never validate the format of a single radio element; only the group gets validated
		default:
			die(get_form_error_response(sprintf($resources['invalid_field_type'], $properties['type'])));
	}
}

function cleanup_email($email) {
	$email = encode_for_form($email);
	$email = preg_replace('=((<CR>|<LF>|0x0A/%0A|0x0D/%0D|\\n|\\r)\S).*=i', null, $email);
	return $email;
}

function cleanup_message($message) {
	$message = wordwrap($message, 70, "\r\n");
	return $message;
}
?>
<?php 
/* 	
If you see this text in your browser, PHP is not configured correctly on this hosting provider. 
Contact your hosting provider regarding PHP configuration for your site.

PHP file generated by Adobe Muse CC 2017.0.2.363
*/

function formthrottle_check()
{
	if (!is_writable('.'))
	{
		return '8';
	}

	try
	{
	    if (in_array("sqlite",PDO::getAvailableDrivers(),TRUE))
		{
			$db = new PDO('sqlite:muse-throttle-db.sqlite3');
			if ( file_exists('muse-throttle-db') )
			{
				unlink('muse-throttle-db');
			}
		}
		else if (function_exists("sqlite_open")) 
		{
			$db = new PDO('sqlite2:muse-throttle-db');
			if ( file_exists('muse-throttle-db.sqlite3') )
			{
				unlink('muse-throttle-db.sqlite3');
			}
		} else {
			return '4';
		}
	}
	catch( PDOException $Exception ) {
		return '9';
	}

	$retCode ='5';
	if ($db) 
	{
		$res = $db->query("SELECT 1 FROM sqlite_master WHERE type='table' AND name='Submission_History';");
		if (!$res or $res->fetchColumn() == 0)
	    {
			$created = $db->exec("CREATE TABLE Submission_History (IP VARCHAR(39), Submission_Date TIMESTAMP)");

			if($created == 0)
			{
				$created = $db->exec("INSERT INTO Submission_History (IP,Submission_Date) VALUES ('256.256.256.256', DATETIME('now'))");
			}
			
			if ($created != 1)
			{
				$retCode = '2';
			}
		}
		if($retCode == '5')
		{
			$res = $db->query("SELECT COUNT(1) FROM Submission_History;");
			if ($res && $res->fetchColumn() > 0)
			{
				$retCode = '0';
			}
			else
				$retCode = '3';
		}

		// Close file db connection
 		$db = null;
	} 
	else
		$retCode = '4';
		
	return $retCode;
}	

function formthrottle_too_many_submissions($ip)
{
	$tooManySubmissions = false;

	try
	{
		if (in_array("sqlite",PDO::getAvailableDrivers(),TRUE))
		{
			$db = new PDO('sqlite:muse-throttle-db.sqlite3');
		}
		else if (function_exists("sqlite_open")) 
		{
			$db = new PDO('sqlite2:muse-throttle-db');
		} else {
			return false;
		}
	}
	catch( PDOException $Exception ) {
		return $tooManySubmissions;
	}

	if ($db) 
	{
		$res = $db->query("SELECT 1 FROM sqlite_master WHERE type='table' AND name='Submission_History';");
		if (!$res or $res->fetchColumn() == 0)
	    {
			$db->exec("CREATE TABLE Submission_History (IP VARCHAR(39), Submission_Date TIMESTAMP)");
		}
		$db->exec("DELETE FROM Submission_History WHERE Submission_Date < DATETIME('now','-2 hours')");

		$stmt = $db->prepare("INSERT INTO Submission_History (IP,Submission_Date) VALUES (:ip, DATETIME('now'))");
		$stmt->bindParam(':ip', $ip);
		$stmt->execute();
		$stmt->closeCursor();

		$stmt = $db->prepare("SELECT COUNT(1) FROM Submission_History WHERE IP = :ip;");
		$stmt->bindParam(':ip', $ip);
		$stmt->execute();
		if ($stmt->fetchColumn() > 25) 
			$tooManySubmissions = true;
		// Close file db connection
 		$db = null;
	}
	return $tooManySubmissions;
}
?>

Hello @Gandalf and @Mittineague is the PHP code I posted all that you need, or is there anything else? I would be grateful for any help or direction you could provide, thank you.

contact your web-hosting provider and ask them to fix it … They should be able to look at the php code for this file and determine what configuration.

Hi @brillmindztechnologi, we manage our hosting ourselves and I am unsure what to do.

you have to enable SMTP ports to send an email from your server or else use php mailer to send emails.

This topic was automatically closed 91 days after the last reply. New replies are no longer allowed.