【问题标题】:PHP contact form with dropdown to change e-mail带有下拉列表的 PHP 联系表单以更改电子邮件
【发布时间】:2013-11-05 01:23:00
【问题描述】:

我正在制作一个带有下拉菜单的联系表,用于选择特定医生的电子邮件地址。我正在使用模板工作,我在 PHP 方面没有太多经验。当我将表单上传到服务器时,我收到“警告:array_key_exists() 的参数计数错误”,但我无法查明问题所在。

<link href="css/contactform.css" rel="stylesheet" type="text/css" />
<?php

// Set email variables
$email_to = array('phys1' => 'phys1@xxxxxx.xxx', 'phys2' => 'phys2@xxxxxx.xxx');
if(array_key_exists($_POST['dropdown']))
{
$recipient = $emails[$_POST['dropdown']];
//send email to $recipient
}

$email_subject = 'Form submission';

// Set required fields
$required_fields = array('fullname','email','comment');

// set error messages
$error_messages = array(
'fullname' => 'Please enter a Name to proceed.',
'email' => 'Please enter a valid Email Address to continue.',
'comment' => 'Please enter your Message to continue.'
);

// Set form status
$form_complete = FALSE;

// configure validation array
$validation = array();

// check form submittal
if(!empty($_POST)) {
// Sanitise POST array
foreach($_POST as $key => $value) $_POST[$key] = remove_email_injection(trim($value));

// Loop into required fields and make sure they match our needs
foreach($required_fields as $field) {       
    // the field has been submitted?
    if(!array_key_exists($field, $_POST)) array_push($validation, $field);

    // check there is information in the field?
    if($_POST[$field] == '') array_push($validation, $field);

    // validate the email address supplied
    if($field == 'email') if(!validate_email_address($_POST[$field])) array_push($validation, $field);
    }

// basic validation result
if(count($validation) == 0) {
    // Prepare our content string
    $email_content = 'New Website Comment: ' . "\n\n";

    // simple email content
    foreach($_POST as $key => $value) {
        if($key != 'submit') $email_content .= $key . ': ' . $value . "\n";
    }

    // if validation passed ok then send the email
    mail($email_to, $email_subject, $email_content);

    // Update form switch
    $form_complete = TRUE;
}
}

function validate_email_address($email = FALSE) {
return (preg_match('/^[^@\s]+@([-a-z0-9]+\.)+[a-z]{2,}$/i', $email))? TRUE : FALSE;
}

function remove_email_injection($field = FALSE) {
   return (str_ireplace(array("\r", "\n", "%0a", "%0d", "Content-Type:", "bcc:","to:","cc:"), '', $field));
}

?>

<script type="text/javascript">
    var nameError = '<?php echo $error_messages['fullname']; ?>';
    var emailError = '<?php echo $error_messages['email']; ?>';
    var commentError = '<?php echo $error_messages['comment']; ?>';
</script>

</head>
<div id="formWrap">
<div id="form">
<?php if($form_complete === FALSE): ?>
<form action="/contact.php" method="post" id="comments_form">
    <div class="row">
    <div class="label">Name</div>
    <div class="input">
    <input type="text" id="fullname" class="detail" name="fullname" value="<?php echo isset($_POST['fullname'])? $_POST['fullname'] : ''; ?>" /><?php if(in_array('fullname', $validation)): ?><span class="error"><?php echo $error_messages['fullname']; ?></span><?php endif; ?>
    </div>
    <div class="context"></div>

    <div class="row">
    <div class="label">Your E-mail</div>
    <div class="input"><input type="text" id="email" class="detail" name="email" value="
<?php echo isset($_POST['email'])? $_POST['email'] : ''; ?>" />
<?php if(in_array('email', $validation)): ?><span class="error"><?php echo $error_messages['email']; ?></span><?php endif; ?>
    </div>
    <div class="context"></div>

    <div class="row">
    <div class="label">Select Physician</div>
    <div class="input"><select name='dropdown' >
<option value=''>

    --Select--</option>
<option value='phys1'>

    phys1</option>
<option value='phys2'>

    phys2</option>
<option value='phys3'>

    phys3</option>
</select>       </div>
    <div class="context"></div>


    <div class="row">
    <div class="label">

     Your Message</div>
    <div class="input">
    <textarea id="comment" name="comment" class="mess"><?php echo isset($_POST['comment'])? $_POST['comment'] : ''; ?></textarea><?php if(in_array('comment', $validation)): ?><span class="error"><?php echo $error_messages['comment']; ?></span><?php endif; ?>
    </div>
    </div>  
    <div class="submit"></div>
    <input type="submit" id="submit" name="submit" value="Send Message" />
</div>
</form>
<?php else: ?>
<p>

    Thank you for your message!</p>
 <?php endif; ?>
</div>
</div>
</div>
</div>
</div>
</div>  
</div>  
</body>
</html>

表格上传到这里:http://endotest.zxq.net/contact_test.php

【问题讨论】:

  • if(array_key_exists($_POST['dropdown'])) - 不是需要两个参数吗?

标签: php forms email contact-form


【解决方案1】:

如果您查看array_key_exists 的文档,您会注意到该函数接受两个参数。一个键(数组键)和一个数组(您要搜索相关数组键/索引的数组)。

您的代码:

if(array_key_exists($_POST['dropdown']))

是问题所在。您可能的意思是:

if(array_key_exists($_POST['dropdown'], $emails))

【讨论】:

    【解决方案2】:

    尝试将array_key_exists 替换为isset,看看是否适合您

    if(isset($_POST['dropdown']))
    {
        $recipient = $emails[$_POST['dropdown']];
        //send email to $recipient
    }
    

    【讨论】:

    • array_key_exists 通常用于将用户输入列入白名单。将其更改为 isset() 可能会引入漏洞。
    • 嗯...不。它们的工作方式相同,唯一的区别是 isset 将返回 false 如果密钥存在但有 NULL 作为其值(没有 $_POST 将有)
    • 如果 $_POST['dropdown'] 作为变量存在,isset() 将返回 TRUE。如果在上面的代码中引入了 isset(),您仍然不能确定 $_POST['dropdown'] 的值是否代表 $emails 数组中的有效键。 isset($emails[$_POST['dropdown']]) 会起作用,而不是isset($_POST['dropdown'])
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 2011-10-07
    • 1970-01-01
    • 2014-06-09
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多