Содержание:
- Способы вывода ошибок PHP
- Виды ошибок в файле .htaccess
- Как включить вывод ошибок через .htaccess
- Примеры практического применения
- Включение журналирования ошибок PHP в .htaccess
- Дополнительные способы вывода ошибок PHP
Ошибки в коде — неотъемлемая часть любого процесса разработки. Чтобы понять, почему не выполняется скрипт, необходимо вывести error-логи PHP на экран.
Следует помнить, что в публичной версии сайта вывод ошибок на экран должен быть отключён.
- Через файл .htaccess, отвечающий за дополнительные параметры сервера Apache.
- Непосредственно через PHP-скрипт.
- Через файл php.ini, содержащий настройки интерпретатора PHP.
Преимущества вывода ошибок в файле .htaccess
- Широкий охват. Параметры распространяются на все элементы дочерних поддиректорий.
- Быстрота и удобство. Обработка ошибок настраивается в несколько команд и в одном месте.
Вывод ошибок на экран лучше делать через файл .htaccess, особенно когда PHP-файлов несколько. Поэтому далее разберём этот способ подробнее.
Виды ошибок PHP в файле .htaccess
- E_ALL — все виды ошибок, кроме E_STRICT до PHP 5.4.0.
- E_ERROR — фатальные ошибки, прекращающие работу скрипта.
- E_WARNING — ошибки-предупреждения. Не являются фатальными, поэтому не вызывают прекращение работы скрипта.
- E_PARSE — ошибки разбора. Могут возникать только во время компиляции.
- E_NOTICE — уведомления о нарушении времени выполнения скрипта.
- E_CORE_ERROR — фатальная ошибка обработчика. Генерируется ядром во время запуска PHP-скрипта.
- E_CORE_WARNING — предупреждения компиляции, возникающие при запуске PHP-скрипта.
- E_COMPILE_ERROR — фатальные ошибки, возникающие на этапе компиляции.
- E_COMPILE_WARNING — предупреждение компилятора PHP-скриптов.
- E_USER_ERROR — ошибки, сгенерированные пользователями.
- E_USER_WARNING — предупреждения, сгенерированные пользователями.
- E_USER_NOTICE — уведомления, сгенерированные пользователями.
Как включить вывод ошибок через .htaccess
Файл .htaccess должен находиться в корневой директории сайта (например, «public_html»). Отредактировать его можно с помощью проводника, доступного в панели хостинга.
Примечание. Если файла .htaccess нет, то его необходимо создать.
Включить отображение ошибок PHP и настроить фильтрацию их вывода можно двумя директивами: «display_errors» и «error_reporting». Первая отвечает за состояние режима показа ошибок («On» или «Off»), а вторая задаёт глубину отображения.
Показать ошибки PHP на экране можно с помощью следующего кода:
php_flag display_errors on php_value error_reporting -1
После сохранения изменённого файла, следует обновить страницу.
Примеры практического применения
Используя указанный код, можно быстро включить или отключить вывод ошибок, а также настроить различные конфигурации для разных режимов работы.
Следующий код скроет ошибки PHP с экрана:
# скрыть ошибки php php_flag display_startup_errors off php_flag display_errors off php_flag html_errors off php_value docref_root 0 php_value docref_ext 0
Иногда нужно фиксировать сбои, но нет возможности вывести ошибки PHP на экран (например, сайт работает в реальном времени). Для этого можно перенаправить вывод информации в лог-файл с помощью следующего кода:
# включить ведение журнала ошибок PHP php_flag log_errors on # месторасположение журнала ошибок PHP php_value error_log /var/www/имя_пользователя/data/www/ваш_www-домен/
Чтобы обработка ошибок в .htaccess выполнялась безопасно надо обязательно защитить папку с log-файлами от внешнего доступа при помощи следующего кода:
# запретить доступ к журналу ошибок PHP <Files PHP_errors.log> Order allow,deny Deny from all Satisfy All </Files>
Можно также настроить фильтрацию. Флаг «integer» указывает на глубину вывода данных (уровень показа). Значение «0» не выведет никаких ошибок. Комбинация «8191» запишет в log-файл сбои всех уровней.
# общая директива для фильтрации ошибок php php_value error_reporting integer
Чтобы текст ошибок не обрезался, можно установить максимальный размер на строку:
# общая директива для установки максимального размера строки log_errors_max_len integer
Выключение записи повторяющихся ошибок сократит объём поступающих данных и улучшит восприятие информации:
# отключить запись повторяющихся ошибок php_flag ignore_repeated_errors on php_flag ignore_repeated_source on
В результате настройки .htaccess для сайта, находящегося в публичном доступе, должны выглядеть так:
# обработка ошибок PHP для публичного ресурса php_flag display_startup_errors off php_flag display_errors off php_flag html_errors off php_flag log_errors on php_flag ignore_repeated_errors off php_flag ignore_repeated_source off php_flag report_memleaks on php_flag track_errors on php_value docref_root 0 php_value docref_ext 0 php_value error_reporting -1 php_value log_errors_max_len 0 <Files /home/path/public_html/domain/PHP_errors.log> Order allow,deny Deny from all Satisfy All </Files>
Во время разработки или отладки файл .htaccess должен содержать следующий код:
# Обработка ошибок PHP во время разработки php_flag display_startup_errors on php_flag display_errors on php_flag html_errors on php_flag log_errors on php_flag ignore_repeated_errors off php_flag ignore_repeated_source off php_flag report_memleaks on php_flag track_errors on php_value docref_root 0 php_value docref_ext 0 php_value error_log /home/path/public_html/domain/PHP_errors.log # [see footnote 3] # php_value error_reporting 999999999 php_value error_reporting -1 php_value log_errors_max_len 0 <Files /home/path/public_html/domain/PHP_errors.log> Order allow,deny Deny from all Satisfy All </Files>
Включение журналирования ошибок PHP в .htaccess
Когда отображение ошибок на странице выключено, необходимо запустить их журналирование следующим кодом:
# включение записи PHP ошибок
php_flag log_errors onphp_value error_log /home/path/public_html/domain/PHP_errors.log
Примечание. Вместо «/home/path/public_html/domain/PHP_errors.log» нужно подставить собственный путь до директории, в которой будет вестись журнал ошибок.
Чтобы запретить доступ к журналу извне, нужно добавить следующий код:
# предотвращаем доступ к логу PHP ошибок <Files PHP_errors.log> Order allow,deny Deny from all Satisfy All </Files>
Дополнительные способы вывода ошибок PHP
Можно добавить оператор «@», чтобы запретить показ ошибок в конкретной инструкции PHP:
$value = @$var[$key];
Вывод ошибок в PHP-скрипте
Чтобы выводить все ошибки, нужно в начале скрипта прописать:
error_reporting(-1);
Если необходимо отображать ошибки PHP только из определённого места скрипта, то можно использовать следующий код:
ini_set('display_errors', 'On'); // сообщения с ошибками будут показываться error_reporting(E_ALL); // E_ALL - отображаем ВСЕ ошибки $value = $var[$key]; // пример ошибки ini_set('display_errors', 'Off'); // теперь сообщений НЕ будет
Примечание. Если заменить значения «On» и «Off» в первой и последней строках на противоположные, то на конкретном участке кода ошибки выводиться не будут.
Через файл php.ini
Включить или выключить показ ошибок на всём сайте/хостинге также можно с помощью файла «php.ini», в котором нужно изменить два следующих параметра:
error_reporting = E_ALL display_errors On
Первая строка отвечает за фильтрацию ошибок (в данном случае показываться будут все типы сбоев), а вторая активирует их отображение на экране. После изменений этого файла необходимо перезапустить сервер Apache.
- Главная»
- Уроки»
-
PHP»
- Создаем единую страницу для обработки ошибок
- Метки урока:
- php
- кодинг
- разное
Создаем единую страницу для обработки ошибок
В данном уроке представлено очень простое решение для обработки различных ошибок HTTP, таких как 404, 500 и так далее, в одном файле PHP. Нужно создать массив кодов ошибок и установить правила перенаправления на наш PHP файл. То есть, можно использовать одну страницу для обработки нескольких ошибок.
Перенаправление
В файле .htaccess
вашего сервера нужно установить правила для обработки ошибок. В нашем случае мы будем перенаправлять все ошибки в наш файл errors.php
, который будет формировать страницу HTML для посетителя. Добавляем в файл .htaccess
следующие правила:
ErrorDocument 400 /errors.php ErrorDocument 403 /errors.php ErrorDocument 404 /errors.php ErrorDocument 405 /errors.php ErrorDocument 408 /errors.php ErrorDocument 500 /errors.php ErrorDocument 502 /errors.php ErrorDocument 504 /errors.php
PHP
Теперь создаем файл errors.php,
который должен располагаться в корневом каталоге вашего сервера (так как такое его местоположение установлено в заданных нами выше правилах в файле .htaccess
).
$status = $_SERVER['REDIRECT_STATUS']; $codes = array( 400 => array('400 Плохой запрос', 'Запрос не может быть обработан из-за синтаксической ошибки.'), 403 => array('403 Запрещено', 'Сервер отказывает в выполнении вашего запроса.'), 404 => array('404 Не найдено', 'Запрашиваемая страница не найдена на сервере.'), 405 => array('405 Метод не допускается', 'Указанный в запросе метод не допускается для заданного ресурса.'), 408 => array('408 Время ожидания истекло', 'Ваш браузер не отправил информацию на сервер за отведенное время.'), 500 => array('500 Внутренняя ошибка сервера', 'Запрос не может быть обработан из-за внутренней ошибки сервера.'), 502 => array('502 Плохой шлюз', 'Сервер получил неправильный ответ при попытке передачи запроса.'), 504 => array('504 Истекло время ожидания шлюза', 'Вышестоящий сервер не ответил за установленное время.'), ); $title = $codes[$status][0]; $message = $codes[$status][1]; if ($title == false || strlen($status) != 3) { $message = 'Код ошибки HTTP не правильный.'; } echo '<h1>Внимание! Обнаружена ошибка '.$title.'!</h1> <p>'.$message.'</p>';
Готово!
Конечно, код PHP может формировать и более информативную страницу для пользователя. При формировании разметки стоит учесть рекомендации для страниц, выводящих информацию об ошибках.
5 последних уроков рубрики «PHP»
-
Фильтрация данных с помощью zend-filter
Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.
-
Контекстное экранирование с помощью zend-escaper
Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.
-
Подключение Zend модулей к Expressive
Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.
-
Совет: отправка информации в Google Analytics через API
Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.
-
Подборка PHP песочниц
Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.
При отладке скриптов на PHP обычное дело заполучить в браузере «белый экран». Что в большинстве случаев говорит об остановке выполнения PHP кода из-за ошибки. PHP интерпретатор позволяет выводить служебную информацию об ошибках на экран, что существенно облегчает отладку. Но по-умолчанию (в большинстве случаев) такое поведение из соображений безопасности отключено, то есть сообщения об ошибках PHP на экран не выводятся.
В этой статье я расскажу как заставить PHP выводить сообщения об ошибках на экран монитора в окне браузера. Инструкция справедлива для случая когда вы используете веб сервер Apache и если PHP для Вашего сайта подключен как модуль Apache.
Вывод ошибок на экран следует включать только во время отладки сайта. Наличие такого кода может негативно сказаться на безопасности веб-приложения.
Включение вывода ошибок PHP на экран с помощью файла .htaccess
Это очень удобный способ для отладки PHP кода. Работает практически во всех случаях. В папку со скриптом на сайте помещаем файл .htaccess со следующим содержимым:
php_flag display_errors on php_flag display_startup_errors on php_flag error_reporting E_ALL
где:
- display_errors — включает опцию для вывода ошибок на экран вместе с остальным кодом.
- display_startup_errors — включает опцию вывода ошибок, возникающих при запуске PHP, когда еще не работает директива display_errors.
- error_reporting — указывает, какие ошибки выводятся по уровню значимости. При значении директивы E_ALL отображаются все ошибки.
Включение вывода ошибок PHP на экран в коде файла PHP
Этот способ удобен тем, что выводом ошибок на экран вы управляете в самом скрипте PHP. Параметры, заданные с помощью функции ini_set(), имеют более высокий приоритет и перекрывают директивы php.ini и .htaccess. Разместите следующий код в начале PHP файла:
ini_set('display_errors', 1); ini_set('display_startup_errors', 1); ini_set('error_reporting', E_ALL);
Включение вывода ошибок PHP на экран с помощью файла php.ini
Этот способ актуален когда вы являетесь администратором сервера. В файле php.ini отредактируйте следующие строки (добавьте при необходимости):
display_errors = On display_startup_errors = On error_reporting = E_ALL
Лучший способ вывода PHP ошибок на экран
На мой взгляд обычному пользователю удобнее всего использовать .htaccess, особенно если у вас больше чем один PHP файл. Способ №2 удобен для отладки одного php файла, чтобы не затрагивать уровень вывода ошибок для других php скриптов. Вариант с php.ini подойдет только администраторам сервера, но зато его действие распространяется на все сайты расположенные на данном сервере.
Благодарности
При написании статьи были использованы следующие источники:
- http://drupalace.ru/lesson/vyvod-oshibok-php-na-ekran
- https://help.sweb.ru/entry/137
- http://ramzes.ws/blog/vkljuchit-vyvod-oshibok-php
- http://php.net/manual/ru/function.error-reporting.php
0 / 0 / 0 Регистрация: 11.02.2014 Сообщений: 100 |
|
1 |
|
Вывод сообщения об ошибке на этой же странице13.12.2015, 23:14. Показов 3507. Ответов 2
Есть форма, которая запрашивает адрес (улица, дом, кв) и отправляет эти данные на обработку скрипту, который проверяет есть ли в базе данных такой адрес и выводит соответствующее сообщение. Как сделать так, чтобы это сообщение выводилось на той же странице, что и форма (например ниже формы), а не на новой странице?
0 |
Фрилансер 1846 / 1342 / 599 Регистрация: 12.01.2011 Сообщений: 5,431 |
|
13.12.2015, 23:27 |
2 |
Поле action в форме оставить пустым. И писать код обработчика формы, на странице где форма.
0 |
sending 64 / 22 / 9 Регистрация: 03.11.2012 Сообщений: 327 |
||||||||||||
14.12.2015, 11:15 |
3 |
|||||||||||
Сообщение было отмечено dark009 как решение Решениеdark009, как вариант, функция которая обрабатывает данные от формы, просто должна вернуть какой-то ответ в виде сообщения.
На странице с формой, в шапке, делаешь как-то так:
А там где надо вывести сообщение о результате обработки, пиши так:
0 |
Это для живого коммерческого проекта, поэтому любая помощь очень ценится.
Я относительно новичок в PHP и jQuery/Javascript, так что простите меня, если большинство из того, что у меня уже есть, что вы, эксперты, сочтете… дерьмо 🙂
- Мой сайт – это HTML только с формой контакта, в которой используется почтовая форма PHP (форма контакта находится в HTML-документе).
- Используя jQuery Validate, я выполнил проверку на стороне клиента, которая работает на том уровне, которым я доволен.
- Я также выполнил проверку и санитацию на стороне сервера в скрипте формы PHP.
Хотя проверки на стороне клиента и сервера, похоже, работают вместе правильно, я страдаю ментальным блоком в том, как отображать сообщения об ошибках, генерируемые скриптом PHP на стороне сервера.
Проверка слайдов на слайде клиента работает отлично – у меня есть контейнер сообщений DIV на странице contact.html, на котором отображаются правильные сообщения об ошибках; однако для серверной части – когда я нажимаю submit, он загружает load-form.php в браузере и отображает сообщения об ошибках (или сообщение об успешном завершении) – на пустой странице.
Я хочу, чтобы любые выходные сообщения об ошибках из файла contact-form.php отображались в том же контейнере DIV ошибок, что и в jQuery, не покидая страницы.
Причина, по которой я пытаюсь это сделать, – если пользователь не поддерживает javascript, jQuery validator, очевидно, не будет работать, но мне все еще нужна обработка ошибок PHP, чтобы быть столь же изящной, как обработка jQuery.
Спасибо, что нашли время, чтобы прочитать и посоветовать.
Вот мой код в его нынешнем виде:
контакт-form.php
<?php
$formType = $_POST['formType'] ;
$sender_name = $_POST['name'] ;
$sender_company = $_POST['company'] ;
$sender_email = $_POST['email'] ;
$sender_telephone = $_POST['telephone'] ;
$sender_message = $_POST['message'] ;
// Server Side Validation
// Error Messages
// Name
$errorMsg_Name_Empty = "Please enter your name (cannot be empty). <br />" ; // isEmpty
$errorMsg_Name_Invalid = "Please your name using valid characters only. <br />" ; // Contains illegal characters only
// Email
$errorMsg_Email_Invalid = "Please enter a valid e-mail address. <br />" ;
$errorMsg_Email_Empty = "Please enter your e-mail address (cannot be empty). <br />" ;
// Telephone
$errorMsg_Telephone_Invalid = "Please enter a valid telephone number." ;
$errorMsg_Telephone_Empty = "Please enter your telephone number (cannot be empty). <br />" ;
// Message
$errorMsg_Message = "Please enter a message. Your message should be at least 30 and no more than 3000 characters in length. <br />" ;
// Human
$errorMsg_Human_Incorrect = "You have not answered the simple maths question correctly! <br />" ;
// Callback Date
$errorMsg_callbackDate = "Please enter a valid date for us to call you back on, formatted as dd/mm/yyyy (for example: 31/01/2103). <br />" ;
// Callback Time
$errorMsg_callbackTime = "Please specify a time you would like us to call you back. <br />" ;
// Input: Name
if ( $sender_name != "") {
$sender_name = substr(filter_var( $sender_name, FILTER_SANITIZE_STRING), 0,49) ;
if ( $sender_name == "" ) {
$errors .= $errorMsg_Name_Invalid ;
}
} else {
$errors .= $errorMsg_Name_Empty ;
}
// Input: Company
if ( $sender_company != "") {
$sender_company = substr(filter_var( $sender_company, FILTER_SANITIZE_STRING),0,49);
}
// Input: Email
if ( $sender_email != "") {
$email_temp = filter_var( $sender_email, FILTER_SANITIZE_EMAIL);
if (!filter_var( $email_temp, FILTER_VALIDATE_EMAIL )) {
$errors .= $errorMsg_Email_Invalid ;
}
} else {
$errors .= $errorMsg_Email_Empty ;
}
// Input: Telephone
if ( $sender_telephone != "") {
$sender_telephone = filter_var($sender_telephone, FILTER_SANITIZE_NUMBER_INT);
if ( strlen ( $sender_telephone ) < 11 || strlen ( $sender_telephone ) > 12 ) {
$errors .= $errorMsg_Telephone_Invalid ;
}
} else {
$errors .= $errorMsg_Telephone_Empty ;
}
// Input: Message
if ( $sender_message != "") {
$sender_message = filter_var($sender_message, FILTER_SANITIZE_STRING);
if ($sender_message == "") {
$errors .= $errorMsg_Message ;
} elseif ( strlen ($sender_message) < 30 || strlen ($sender_message) > 3000 ) {
$errors .= $errorMsg_Message ;
}
} else {
$errors .= $errorMsg_Message ;
}
// Human
if ($formType == "Message") {
$human = $_POST['human_message'] ;
} elseif ( $formType == "Callback") {
$human = $_POST['human_callback'] ;
} ;
$human_correctAnswer = '12' ;
// Input: Human
if ( $human != $human_correctAnswer) {
$errors .= $errorMsg_Human_Incorrect ;
}
// Callback Specific
// If form type is "Callback", collect time/date input fields.
if ( $formType == "Callback" ) {
$callback_date = $_POST['callback_date'] ;
$callback_time = $_POST['callback_time'] ;
//Callback date
if ( $callback_date != "" ) {
list ($day,$month,$year) = explode ("/" ,$callback_date );
if ( (is_numeric($day)) || (is_numeric($month)) || (is_numeric($year)) ) {
if (!checkdate($month, $day, $year))
$errors .= $errorMsg_callbackDate ;
} else {
$errors .= $errorMsg_callbackDate ;
}
} else {
$errors .= $errorMsg_callbackDate ;
} ;
//Callback Time
if ( $callback_time == "" ) {
$errors .= $errorMsg_callbackTime ;
}
}
// END Callback Specific
// If there are no errors - send the form.
if (!$errors) {
$sender_ipAddress = $_SERVER['REMOTE_ADDR'];
$sender_browser = $_SERVER['HTTP_USER_AGENT'];
// E-mail headers
$recipient_email = "[email protected]" ;
$headers = "MIME-Version: 1.0" . "rn";
$headers .= "Content-type:text/html; charset: utf8" . "rn";
$headers .= "From: My Websitern";
$headers .= 'Reply-To: [email protected]' . "rn" ;
// Setting the e-mail subject
if ( $formType == "Message" ) {
$subject = "Message from the My website." ;
} else {
$subject = "Callback request from the My website." ;
};
// For database scripting - replace new-line html with carriage return character - Array
// Placeholders for array
$sender_message_placeholders = array("n") ;
//Replace Values for array
$sender_message_replaceValues = array("¶") ;
// $sender_message stripped of new-lines, and replaced with nc-characters.
$sender_message_stripped = str_replace($sender_message_placeholders, $sender_message_replaceValues, $sender_message) ;
// Writing the e-mail body.
if ( $formType == "Message") {
$emailBody = "
<style type "text/css">
body { font-family: Helvetica, Arial ; font-size: 16px ; line-height: 20px ; color: #5e5e5e }
h1 { font-size: 42px ; line-height: 42px ; color: #c1c1c1 }
div.section { padding: 12px ; margin-bottom: 8px ; background-color: #f7f7f7 ; border: 1px solid #c8c8c8 }
div.part { margin-bottom: 8px ; 1border: 1px solid blue }
div.part:last-child { margin-bottom: 0 }
label { margin: 0 ; font-size: 13px ; line-height: 20px ; font-weight: bold ; color: #80a553 }
p { margin: 0 }
p.input-field#sender-message { white-space: pre-line }
div#dbImport { color: #a1a1a1!important }
div#dbImport p { font-size: 12px!important ; line-height: 14px ; white-space: normal!important }
</style>
</head>
<body>
<html>
<h1>Message</h1>
<p class="input-field" style="margin-bottom:12px">A message has been sent from Mywebsite. The message is as follows:</p>
<div class="section">
<div class="part">
<label>Contact Form Type:</label>
<p class="input-field">$formType</p>
</div>
</div>
<div class="section">
<div class="part">
<label>Name:</label>
<p class="input-field">$sender_name</p>
</div><!-- !.part -->
<div class="part">
<label>Company:</label>
<p class="input-field">$sender_company</p>
</div><!-- !.part -->
<div class="part">
<label>E-mail:</label>
<p class="input-field">$sender_email</p>
</div><!-- !.part -->
<div class="part">
<label>Telephone:</label>
<p class="input-field">$sender_telephone</p>
</div><!-- !.part -->
</div><!-- !.section -->
<div class="section">
<div class="part">
<label>Message:</label>
<p class="input-field" id="sender-message">$sender_message</p>
</div><!-- !.part -->
</div><!-- !.section -->
<div class="section" id="visitor-info">
<div class="part">
<label>Sender IP Address:</label>
<p class="input-field"><a href="http://network-tools.com/default.asp?prog=express&host=$sender_ipAddress">$sender_ipAddress</a></p>
</div><!-- !.part -->
<div class="part">
<label>Sender Web Browser:</label>
<p class="input-field">$sender_browser</p>
</div><!-- !.part -->
</div><!-- !.section -->
<div id="dbImport">
<p style="font-weight:bold">IMPORTDB DATA</p>
<p>NAME/COMPANY/EMAIL/TELEPHONE/MESSAGE/CALLBACK-DATE/CALLBACK-TIME</p>
<p>#begin#$sender_name#$sender_company#$sender_email#$sender_telephone#$sender_message_stripped#end</p>
</div>
</body>
</html>
" ;
} else {
$emailBody = "
<head>
<style type "text/css">
body { font-family: Helvetica, Arial ; font-size: 16px ; line-height: 20px ; color: #5e5e5e }
h1 { font-size: 42px ; line-height: 42px ; color: #c1c1c1 }
div.section { padding: 12px ; margin-bottom: 8px ; background-color: #f7f7f7 ; border: 1px solid #c8c8c8 }
div.section#callback-details { background-color: #f8e0e0 }
div.section#callback-details label { color: #df5c5c }
div.part { margin-bottom: 8px }
div.part:last-child { margin-bottom: 0 }
label { margin: 0 ; font-size: 13px ; line-height: 20px ; font-weight: bold ; color: #80a553 }
p { margin: 0 }
p.input-field#sender-message { white-space: pre-line }
div#dbImport { color: #a1a1a1!important }
div#dbImport p { font-size: 12px!important ; line-height: 19px ; white-space: normal!important }
</style>
</head>
<body>
<html>
<h1>Callback Request</h1>
<p class="input-field" style="margin-bottom:12px">A callback request has been sent from mywebsite. The callback details are as follows:</p>
<div class="section">
<div class="part">
<label>Contact Form Type:</label>
<p class="input-field">$formType</p>
</div>
</div>
<div class="section" id="callback-details">
<div class="part">
<label>Callback Date:</label>
<p class="input-field">$callback_date</p>
</div><!-- !.part -->
<div class="part">
<label>Callback Time:</label>
<p class="input-field">$callback_time</p>
</div><!-- !.part -->
</div><!-- !.section -->
<div class="section">
<div class="part">
<label>Name:</label>
<p class="input-field">$sender_name</p>
</div><!-- !.part -->
<div class="part">
<label>Company:</label>
<p class="input-field">$sender_company</p>
</div><!-- !.part -->
<div class="part">
<label>E-mail:</label>
<p class="input-field">$sender_email</p>
</div><!-- !.part -->
<div class="part">
<label>Telephone:</label>
<p class="input-field">$sender_telephone</p>
</div><!-- !.part -->
</div><!-- !.section -->
<div class="section">
<div class="part">
<label>Message:</label>
<p class="input-field" id="sender-message">$sender_message</p>
</div><!-- !.part -->
</div><!-- !.section -->
<div class="section" id="visitor-info">
<div class="part">
<label>Sender IP Address:</label>
<p class="input-field"><a href="http://network-tools.com/default.asp?prog=express&host=$sender_ipAddress">$sender_ipAddress</a></p>
</div><!-- !.part -->
<div class="part">
<label>Sender Web Browser:</label>
<p class="input-field">$sender_browser</p>
</div><!-- !.part -->
</div><!-- !.section -->
<div id="dbImport">
<p style="font-weight:bold">IMPORTDB DATA</p>
<p>NAME/COMPANY/EMAIL/TELEPHONE/MESSAGE/CALLBACK-DATE/CALLBACK-TIME</p>
<p>#begin#$sender_name#$sender_company#$sender_email#$sender_telephone#$sender_message_stripped#$callback_date#$callback_time#end</p>
</div>
</body>
</html>
" ;
} ;
// End e-mail bodies
/* Send the message using mail() function */
mail($recipient_email, $subject, $emailBody, $headers) ;
// The message to display in the contact form success div
if ( $formType == "Message") {
print "
<h4>Your message has been sent. Thank you.</h4>
<hr>
<p>Someone will get back to you very shortly. We aim to respond to all messages within 24 hours. If your enquiry is super-duper-urgent, why not give us a ring?</p>
" ;
} else {
print "
<h4>Your request has been sent. Thank you.</h4>
<hr>
<h5>A note about our callback service.</h5>
<p>Sometimes life throws you a curve-ball that really mucks up your plans.</p>
<p>In the event that we encounter one of said curve-balls and we're unable to callback when you requested, we will, where possible, get in touch and make arrangements for us
to call back at another time convenient to you.</p>" ;
} ;
// end 'if there are no errors'
} else { // if there are errors with the users inputs
echo '
There was a problem with the information you have tried to submit:
<div style="color: red ; font-size: 22px ; line-height: 28px">' . $errors . '<br/></div>
Please go back, check the information and try again.';
}
?>
файл contact.html Обратите внимание: на одной странице есть две формы: одна – это форма сообщения, а другая – форма запроса обратного вызова – они находятся на вкладках jQuery. Я включил разметку HTML только для одной формы.
Как вы можете видеть, есть ошибкаContainer DIV, в которой отображаются сообщения об ошибке проверки jQuery, и где мне бы хотелось, чтобы сообщения об ошибках, сгенерированные из скрипта PHP, отображались.
<form id="form-callback" method="post" action="contact-form.php" class="clearfix">
<input name="formType" id="formType" value="Callback">
<div id="errorContainer-callback" class="errorContainer">
<b>Oops... it looks like there is a problem with the data you have entered into the form. Please correct the following errors:</b>
<ul />
</div><!-- !#errorContainer-callback -->
<!-- BEGIN 4 INPUT FIELDS -->
<div id="input-fields">
<div id="name-company">
<label>Name</label>
<input name="name" tabindex="1">
<label>Company</label>
<input name="company" tabindex="2">
</div><!-- ! #name-company -->
<div id="email-telephone">
<label>Email</label>
<input name="email" tabindex="3">
<label>Telephone</label>
<input name="telephone" tabindex="4">
</div><!-- ! #email-telephone -->
</div><!-- ! #input-fields -->
<!-- BEGIN MESSAGE CELL -->
<div id="message">
<label>Tell us a little about what you'd like talk about when we call you back.</label>
<textarea name="message" tabindex="5"></textarea>
</div><!-- ! #message -->
<div class="clearfix"></div>
<!-- BEGIN Bottom of Form (Date/Time/Human/Button) -->
<div id="end">
<!-- BEGIN DATE -->
<div id="cell1" class="cell">
<label>When would you like us to get back to you?</label>
<div>
<input placeholder="Date" name="callback_date" type="date" id="callback-date" tabindex="6">
</div><!-- ! date input container -->
<!-- BEGIN CELL-TIME -->
<div>
Time
<select id="callback-time" name="callback_time" tabindex="7">
<option value="" selected="selected"></option>
<option value="0900-1100">09:00-11:00</option>
<option value="1100-1300">11:00-13:00</option>
<option value="1300-1500">13:00-15:00</option>
<option value="1500-1700">15:00-17:00</option>
</select>
</div><!-- ! subcell -->
</div><!-- ! #cell1 -->
<!-- BEGIN CELL-HUMANCHECK -->
<div id="cell2" class="cell human-check">
<label><b> What is 3 + 9</b></label>
<input id="human-result-callback" class="human" name="human_callback" type="number" maxlength="2" tabindex="8" />
</div><!-- ! #cell2 .cell -->
<!-- BEGIN CELL-BUTTON -->
<div id="cell3" class="cell">
<input class="button" id="submit" name="submit" type="submit" value="Send Your Request">
</div><!-- ! #cell3 .cell -->
</div><!-- ! #end -->
</form><!-- ! form#form-callback -->