#php
#php
Вопрос:
Я попытался провести исследование через этот сайт, чтобы самостоятельно исправить проблему, но, похоже, я все еще не могу заставить эту форму вызывать несколько параметров, выбранных в установленных флажках. Код взят из онлайн-формы, которую я скачал. Ни один из других точных вопросов здесь, похоже, не может мне помочь.
FULL FORM:
<form id='contactus' action='<?php echo $formproc->GetSelfScript(); ?>' method='post' enctype="multipart/form-data" accept-charset='UTF-8'>
<input type='hidden' name='submitted' id='submitted' value='1'/>
<input type='hidden' name='<?php echo $formproc->GetFormIDInputName(); ?>' value='<?php echo $formproc->GetFormIDInputValue(); ?>'/>
<input type='hidden' class='spmhidip' name='<?php echo $formproc->GetSpamTrapInputName(); ?>' />
<fieldset >
<dl>
<dd>*Name (last, first)
<input type="text" name="name" size="33" value='<?php echo $formproc->SafeDisplay('name') ?>'>
<span id='contactus_name_errorloc' class='error'></span>
</dd>
</dl>
<dl>
<dd>*Email Address <input type="text" name="email" size="35" value='<?php echo $formproc->SafeDisplay('email') ?>'> <span id='contactus_email_errorloc' class='error'> </span>
</dd></dl>
<dl>
<dd>*Construction Experience <input type="radio" name="construction_experience" id="construction_experience" value="Yes<?php echo $formproc->SafeDisplay('experience') ?>">Yes<input type="radio" name="construction_experience" id="construction_experience" value="No<?php echo $formproc->SafeDisplay('experience') ?>">No </dd></dl>
<dl>
<dd>*You must have valid drivers license, please select all that apply: <br />
<input type=checkbox name="valid_license[]" id="valid_licenseD" value="D<?php echo $formproc->SafeDisplay('valid_license') ?>">D license
<input type=checkbox name="valid_license[]" id="valid_licenseG" value="G<?php echo $formproc->SafeDisplay('valid_license') ?>">G license
<input type=checkbox name="valid_license[]" id="valid_licenseG2" value="G2<?php echo $formproc->SafeDisplay('valid_license') ?>">G2 license
</dd></dl>
<p><strong>Enter additional comments in the space provided below:</strong></p>
<dl>
<dd> <span id='contactus_message_errorloc' class='error'></span><textarea name="message" id="message" cols="60" rows="8"><?php echo $formproc->SafeDisplay('message') ?></textarea></dd></dl>
<dl>
<dd>*Resume (insert attachment) <input type="file" name="resume" id="resume" value="" size="30">
<div><span class='error'><?php echo $formproc->GetErrorMessage(); ?></span></div>
<span id='contactus_photo_errorloc' class='error'></span>
</dd></dl>
<p style="padding-left:60px;"><input type="submit" class="button primary" value="Submit Application" /> <input type="reset" class="button primary" value="Clear Form" name"clear" />
</fieldset>
</form>
Вот php, который запрашивает информацию:
`
require_once("class.phpmailer.php");
/*
Interface to Captcha handler
*/
class FG_CaptchaHandler
{
function Validate() { return false;}
function GetError(){ return '';}
}
/*
FGContactForm is a general purpose contact form class
It supports Captcha, HTML Emails, sending emails
conditionally, File atachments and more.
*/
class FGContactForm
{
var $receipients;
var $errors;
var $error_message;
var $name;
var $email;
var $message;
var $from_address;
var $form_random_key;
var $conditional_field;
var $arr_conditional_receipients;
var $fileupload_fields;
var $captcha_handler;
var $mailer;
function FGContactForm()
{
$this->receipients = array();
$this->errors = array();
$this->form_random_key = 'HTgsjhartag';
$this->conditional_field='';
$this->arr_conditional_receipients=array();
$this->fileupload_fields=array();
$this->mailer = new PHPMailer();
$this->mailer->CharSet = 'utf-8';
}
function EnableCaptcha($captcha_handler)
{
$this->captcha_handler = $captcha_handler;
session_start();
}
function AddRecipient($email,$name="")
{
$this->mailer->AddAddress($email,$name);
}
function SetFromAddress($from)
{
$this->from_address = $from;
}
function SetFormRandomKey($key)
{
$this->form_random_key = $key;
}
function GetSpamTrapInputName()
{
return 'sp'.md5('KHGdnbvsgst'.$this->GetKey());
}
function SafeDisplay($value_name)
{
if(empty($_POST[$value_name]))
{
return'';
}
return htmlentities($_POST[$value_name]);
}
function GetFormIDInputName()
{
$rand = md5('TygshRt'.$this->GetKey());
$rand = substr($rand,0,20);
return 'id'.$rand;
}
function GetFormIDInputValue()
{
return md5('jhgahTsajhg'.$this->GetKey());
}
function SetConditionalField($field)
{
$this->conditional_field = $field;
}
function AddConditionalReceipent($value,$email)
{
$this->arr_conditional_receipients[$value] = $email;
}
function AddFileUploadField($file_field_name,$accepted_types,$max_size)
{
$this->fileupload_fields[] =
array("name"=>$file_field_name,
"file_types"=>$accepted_types,
"maxsize"=>$max_size);
}
function ProcessForm()
{
if(!isset($_POST['submitted']))
{
return false;
}
if(!$this->Validate())
{
$this->error_message = implode('<br/>',$this->errors);
return false;
}
$this->CollectData();
$ret = $this->SendFormSubmission();
return $ret;
}
function RedirectToURL($url)
{
header("Location: $url");
exit;
}
function GetErrorMessage()
{
return $this->error_message;
}
function GetSelfScript()
{
return htmlentities($_SERVER['PHP_SELF']);
}
function GetName()
{
return $this->name;
}
function GetEmail()
{
return $this->email;
}
function GetMessage()
{
return htmlentities($this->message,ENT_QUOTES,"UTF-8");
}
/*——— Частные (внутренние) функции ——— */
function SendFormSubmission()
{
$this->CollectConditionalReceipients();
$this->mailer->CharSet = 'utf-8';
$this->mailer->Subject = "Online Application from $this->name";
$this->mailer->From = $this->GetFromAddress();
$this->mailer->FromName = "thermosealinsulation.ca";
$this->mailer->AddReplyTo($this->email);
$message = $this->ComposeFormtoEmail();
$textMsg = trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?</\1>/s','',$message)));
$this->mailer->AltBody = @html_entity_decode($textMsg,ENT_QUOTES,"UTF-8");
$this->mailer->MsgHTML($message);
$this->AttachFiles();
if(!$this->mailer->Send())
{
$this->add_error("Failed sending email!");
return false;
}
return true;
}
function CollectConditionalReceipients()
{
if(count($this->arr_conditional_receipients)>0 amp;amp;
!empty($this->conditional_field) amp;amp;
!empty($_POST[$this->conditional_field]))
{
foreach($this->arr_conditional_receipients as $condn => $rec)
{
if(strcasecmp($condn,$_POST[$this->conditional_field])==0 amp;amp;
!empty($rec))
{
$this->AddRecipient($rec);
}
}
}
}
/*
Internal variables, that you donot want to appear in the email
Add those variables in this array.
*/
function IsInternalVariable($varname)
{
$arr_interanl_vars = array('scaptcha',
'submitted',
$this->GetSpamTrapInputName(),
$this->GetFormIDInputName()
);
if(in_array($varname,$arr_interanl_vars))
{
return true;
}
return false;
}
function FormSubmissionToMail()
{
$ret_str='';
foreach($_POST as $key=>$value)
{
if(!$this->IsInternalVariable($key))
{
$value = htmlentities($value,ENT_QUOTES,"UTF-8");
$value = nl2br($value);
$key = ucfirst($key);
// CHANGES BEGIN HERE.....
// This loop looks over all the $_POST values. Need to isolate the `valid_licenses` and do something special with it.
if ($key == "valid_license") {
$value = implode(", ", $value);
// Now $value will output as the comma-separated values list.
}
// CHANGES END HERE
$ret_str .= "<div class='label'>$key :</div><div class='value'>$value </div>n";
}
}
foreach($this->fileupload_fields as $upload_field)
{
$field_name = $upload_field["name"];
if(!$this->IsFileUploaded($field_name))
{
continue;
}
$filename = basename($_FILES[$field_name]['name']);
$ret_str .= "";
}
return $ret_str;
}
function ExtraInfoToMail()
{
$ret_str='';
$ip = $_SERVER['REMOTE_ADDR'];
$ret_str = "<div class='label'>IP address of the submitter:</div><div class='value'>$ip</div>n";
return $ret_str;
}
function GetMailStyle()
{
$retstr = "n<style>".
"body,.label,.value { font-family:Arial,Verdana; } ".
".label {font-weight:bold; margin-top:5px; font-size:1.2em; color:#333;} ".
".value {margin-bottom:15px;font-size:1.2em;padding-left:20px;} ".
"</style>n";
return $retstr;
}
function GetHTMLHeaderPart()
{
$retstr = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">'."n".
'<html><head><title></title>'.
'<meta http-equiv=Content-Type content="text/html; charset=utf-8">';
$retstr .= $this->GetMailStyle();
$retstr .= '</head><body>';
return $retstr;
}
function GetHTMLFooterPart()
{
$retstr ='</body></html>';
return $retstr ;
}
function ComposeFormtoEmail()
{
$header = $this->GetHTMLHeaderPart();
$formsubmission = $this->FormSubmissionToMail();
$extra_info = $this->ExtraInfoToMail();
$footer = $this->GetHTMLFooterPart();
$message = $header."<div class='label'>Job Application Submission From thermosealinsulation.ca: </div><p>$formsubmission</p><hr/>$extra_info".$footer;
return $message;
}
function AttachFiles()
{
foreach($this->fileupload_fields as $upld_field)
{
$field_name = $upld_field["name"];
if(!$this->IsFileUploaded($field_name))
{
continue;
}
$filename =basename($_FILES[$field_name]['name']);
$this->mailer->AddAttachment($_FILES[$field_name]["tmp_name"],$filename);
}
}
function GetFromAddress()
{
if(!empty($this->from_address))
{
return $this->from_address;
}
$host = $_SERVER['SERVER_NAME'];
$from ="nobody@$host";
return $from;
}
function Validate()
{
$ret = true;
//security validations
if(empty($_POST[$this->GetFormIDInputName()]) ||
$_POST[$this->GetFormIDInputName()] != $this->GetFormIDInputValue() )
{
//The proper error is not given intentionally
$this->add_error("Automated submission prevention: case 1 failed");
$ret = false;
}
//This is a hidden input field. Humans won't fill this field.
if(!empty($_POST[$this->GetSpamTrapInputName()]) )
{
//The proper error is not given intentionally
$this->add_error("Automated submission prevention: case 2 failed");
$ret = false;
}
//name validations
if(empty($_POST['name']))
{
$this->add_error("Please provide your name");
$ret = false;
}
else
if(strlen($_POST['name'])>50)
{
$this->add_error("Name is too big!");
$ret = false;
}
//email validations
if(empty($_POST['email']))
{
$this->add_error("Please provide your email address");
$ret = false;
}
else
if(strlen($_POST['email'])>50)
{
$this->add_error("Email address is too big!");
$ret = false;
}
else
if(!$this->validate_email($_POST['email']))
{
$this->add_error("Please provide a valid email address");
$ret = false;
}
//message validaions
if(strlen($_POST['message'])>2048)
{
$this->add_error("Message is too big!");
$ret = false;
}
//captcha validaions
if(isset($this->captcha_handler))
{
if(!$this->captcha_handler->Validate())
{
$this->add_error($this->captcha_handler->GetError());
$ret = false;
}
}
//file upload validations
if(!empty($this->fileupload_fields))
{
if(!$this->ValidateFileUploads())
{
$ret = false;
}
}
return $ret;
}
function ValidateFileType($field_name,$valid_filetypes)
{
$ret=true;
$info = pathinfo($_FILES[$field_name]['name']);
$extn = $info['extension'];
$extn = strtolower($extn);
$arr_valid_filetypes= explode(',',$valid_filetypes);
if(!in_array($extn,$arr_valid_filetypes))
{
$this->add_error("Valid file types are: $valid_filetypes");
$ret=false;
}
return $ret;
}
function ValidateFileSize($field_name,$max_size)
{
$size_of_uploaded_file =
$_FILES[$field_name]["size"]/1024;//size in KBs
if($size_of_uploaded_file > $max_size)
{
$this->add_error("The file is too big. File size should be less than $max_size KB");
return false;
}
return true;
}
function IsFileUploaded($field_name)
{
if(empty($_FILES[$field_name]['name']))
{
return false;
}
if(!is_uploaded_file($_FILES[$field_name]['tmp_name']))
{
return false;
}
return true;
}
function ValidateFileUploads()
{
$ret=true;
foreach($this->fileupload_fields as $upld_field)
{
$field_name = $upld_field["name"];
$valid_filetypes = $upld_field["file_types"];
if(!$this->IsFileUploaded($field_name))
{
continue;
}
if($_FILES[$field_name]["error"] != 0)
{
$this->add_error("Error in file upload; Error code:".$_FILES[$field_name]["error"]);
$ret=false;
}
if(!empty($valid_filetypes) amp;amp;
!$this->ValidateFileType($field_name,$valid_filetypes))
{
$ret=false;
}
if(!empty($upld_field["maxsize"]) amp;amp;
$upld_field["maxsize"]>0)
{
if(!$this->ValidateFileSize($field_name,$upld_field["maxsize"]))
{
$ret=false;
}
}
}
return $ret;
}
function StripSlashes($str)
{
if(get_magic_quotes_gpc())
{
$str = stripslashes($str);
}
return $str;
}
/*
Sanitize() function removes any potential threat from the
data submitted. Prevents email injections or any other hacker attempts.
if $remove_nl is true, newline chracters are removed from the input.
*/
function Sanitize($str,$remove_nl=true)
{
$str = $this->StripSlashes($str);
if($remove_nl)
{
$injections = array('/(n )/i',
'/(r )/i',
'/(t )/i',
'/(
)/i',
'/(
)/i',
'/( )/i',
'/( )/i'
);
$str = preg_replace($injections,'',$str);
}
return $str;
}
/*Collects clean data from the $_POST array and keeps in internal variables.*/
function CollectData()
{
$this->name = $this->Sanitize($_POST['name']);
$this->email = $this->Sanitize($_POST['email']);
$this->ConstructionExperience = $this->Sanitize($_POST['ConstructionExperience']);
foreach ($_POST['valid_license'] as $license) {
// Append each sanitized element onto valid_license[]
$this->valid_license[] = $this->Sanitize($license) ;
}
/*newline is OK in the message.*/
$this->message = $this->StripSlashes($_POST['message']);
}
function add_error($error)
{
array_push($this->errors,$error);
}
function validate_email($email)
{
return eregi("^[_.0-9a-zA-Z-] @([0-9a-zA-Z][0-9a-zA-Z-] .) [a-zA-Z]{2,6}$", $email);
}
function GetKey()
{
return $this->form_random_key.$_SERVER['SERVER_NAME'].$_SERVER['REMOTE_ADDR'];
}
}
?>`
Все возвращаемые формы представляют собой один выбранный вариант, даже если установлено несколько флажков.
Ответ №1:
Чтобы разрешить несколько значений флажка, вы должны добавить []
к атрибуту name. Затем PHP обработает его как массив:
<input type=checkbox name="valid_license[]" id="valid_license" ... />
Затем обязательно обработайте их как массив. Ваш $this->valid_license
также становится массивом.
// Something like
foreach ($_POST['valid_license'] as $license) {
// Append each sanitized element onto valid_license[]
$this->valid_license[] = $this->Sanitize($license);
}
Обратите внимание, что вы должны предоставить разные id=
атрибуты для каждого из них. Спецификация HTML требует, чтобы атрибуты id были уникальными. Прямо сейчас у всех ваших есть id='valid_license'
. Измените их на id='valid_license1'
или аналогичные.
Обновление (функция изменения)
function ComposeFormtoEmail() {
$header = $this->GetHTMLHeaderPart();
$formsubmission = $this->FormSubmissionToMail();
$extra_info = $this->ExtraInfoToMail();
$footer = $this->GetHTMLFooterPart();
// Assign this to a variable
$licenses = implode(", ", $this->valid_license);
// Then insert that variable into `$message`
$message = $header."Job Application Submission From thermosealinsulation.ca :<p>$licenses</p><p>$formsubmission</p><hr/>$extra_info".$footer;
//---------------------------------------------------------------------------^^^^^^^^^^^^^^^^
return $message;
}
Обновление 2 функции FormSubmissionToMail()
Хорошо, я думаю, что наконец-то понял. Поля и их заголовки создаются FormSubmissionToMail()
. Итак, именно сюда вам нужно добавить implode()
вызов, а не в ComposeFormToEmail()
функцию, как мы делали ранее:
function FormSubmissionToMail()
{
$ret_str='';
foreach($_POST as $key=>$value)
{
if(!$this->IsInternalVariable($key))
{
// MOVED THIS BLOCK FROM BELOW...
// CHANGES BEGIN HERE.....
// This loop looks over all the $_POST values. Need to isolate the `valid_licenses` and do something special with it.
if ($key == "valid_license") {
$value = implode(", ", $value);
// Now $value will output as the comma-separated values list.
}
// CHANGES END HERE
$value = htmlentities($value,ENT_QUOTES,"UTF-8");
$value = nl2br($value);
$key = ucfirst($key);
$ret_str .= "<div class='label'>$key :</div><div class='value'>$value </div>n";
}
}
foreach($this->fileupload_fields as $upload_field)
{
$field_name = $upload_field["name"];
if(!$this->IsFileUploaded($field_name))
{
continue;
}
$filename = basename($_FILES[$field_name]['name']);
$ret_str .= "<div class='label'>File upload '$field_name' :</div><div class='value'>$filename </div>n";
}
return $ret_str;
}
### Now that this is the correct location, go back and remove the changes we made to `ComposeFormToEmail()`
Комментарии:
1. Я попробовал это, когда увидел в другом сообщении, но не смог заставить это работать. Я не получаю никаких значений при внесении этого изменения.
2. @Leah сделайте
print_r($_POST)
, чтобы увидеть, как значения этих флажков выглядят в PHP в их массиве.3. попробовал ‘/* Собирает чистые данные из массива $_POST и сохраняет во внутренних переменных.*/ функция CollectData() { $this->name = $this->Sanitize($_POST[‘name’]); $this->email = $this->Sanitize($_POST[’email’]); $this->construction_experience = $this->Sanitize($_POST[‘construction_experience’]); foreach ($ _POST[‘valid_license’] как $license) { // Добавьте каждый очищенный элемент в valid_license[] $this->valid_license[] = $this-> Sanitize($license); }’ но теперь это ничего не вернет. Я также изменил [] в названии???
4. что такое print_r($_POST) и куда мне его поместить? Извините, в некотором роде новичок.
5. @Leah поместите флажок в
print_r()
любом месте скрипта, где вы обрабатываете$_POST
массив. Он просто выгружает массив, чтобы вы могли видеть, как выглядит его содержимое. Затем просмотрите исходный код вашей страницы, чтобы увидеть, что он красиво оформлен с разрывами строк.