【问题标题】:HTML form passing empty $_POST data传递空 $_POST 数据的 HTML 表单
【发布时间】:2014-10-01 23:43:44
【问题描述】:

我已经为电子邮件制作了一个 HTML 表单。我用过

 if(!array_key_exists($_POST)) {
    $data = file_get_contents('php://input');
 }

使用下面的代码确定 $_POST 数组为空并且没有任何值被传递到 php 输入。这是怎么回事?

这是我的代码:

HTML:

<form id="main-contact-form" class="contact-form" name="contact-form" method="post" action="sendemail.php" role="form">
                        <div class="row">
                            <div class="col-sm-6">
                                <div class="form-group">
                                    <input type="text" class="form-control" required="required" placeholder="Name" id="name" name="name">
                                </div>
                            </div>
                            <div class="col-sm-6">
                                <div class="form-group">
                                    <input type="text" class="form-control" required="required" placeholder="Email address" id="email" name="email">
                                </div>
                            </div>
                        </div>
                        <div class="row">
                            <div class="col-sm-12">
                                <div class="form-group">
                                    <textarea name="message" id="message" required="required" class="form-control" rows="8" placeholder="Message"></textarea>
                                </div>
                                <div class="form-group">
                                    <input type="submit" class="btn btn-danger btn-lg" value="Send Message">
                                </div>
                            </div>
                        </div>
                    </form>

PHP:

<?php
header('Content-type: application/json');
$status = array(
    'type'=>'success',
    'message'=>'Email sent!'
);

$subject = "Contact from Website";

$name =  $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
if(!array_key_exists($_POST)) {
    $name= "empty";
    $email = "empty";
    $message = "empty";
    $data = file_get_contents('php://input');
}
$email_to = 'myemail@domain.com';

$body = "A message has been submitted from your website: \n" .  "Name: ". $name . "\nEmail: " . $email . "\nMessage: " . $message . "\nData: " . $data;

mail($email_to, $subject, $body, 'From: ' . $email . '\n\r'); 

echo json_encode($status);
die;
?>

【问题讨论】:

  • if(!array_key_exists($_POST)): 你读过那个函数的文档吗?你最终是怎么使用它的?
  • 我在这里读到了一些其他的 $_POST 问题解决线程,它说 isset 不应该用于数组,而应该用于单个值。我猜那是错的?
  • 这取决于您检查的内容。看我的回答。

标签: php html forms post


【解决方案1】:

我在这里阅读了其他一些 $_POST 问题解决问题,其中说 isset 不应该用于数组,而应该用于单个值。我猜那是错的?

if(!isset($_POST)) 将检查变量 $_POST 是否已被设置为任何值。

if(!array_key_exists('x', $_POST)) 将检查键 x 是否存在于数组 $_POST 中。这与if(!isset($_POST['x'])) 基本相同,除了键 x 确实存在但已明确赋予 null 值的情况。来自docs for array_key_exists 中的示例:

<?php
$search_array = array('first' => null, 'second' => 4);

// returns false
isset($search_array['first']);

// returns true
array_key_exists('first', $search_array);
?>

通常在检查 post 参数时,您的兴趣不仅在于密钥的存在,还在于它不为空。所以 isset 更有意义,即使在寻找特定的键时也是如此。但当然,当您只检查 $_POST 对象时,您应该使用 isset。

【讨论】:

    【解决方案2】:

    您严重滥用array_key_exists。还假设您不想在未发布表单时发送电子邮件,只需在顶部检查并在未设置时退出:if (!isset($_POST)) exit;

    【讨论】:

      【解决方案3】:

      尝试删除此行:

      header('Content-type: application/json');

      您是否在此处为 Ajax 输出标头?如果是这样,听起来您的问题出在 JavaScript 中。

      看在上帝的份上,请在帖子上进行健全性检查:

      if (!empty($_POST)) { // insert process code here }

      如果不是 ajax,你的操作应该是这样的:

      action="/sendemail.php"

      你的代码是相对的,sendemail.php 需要和你的 html 表单在同一个目录下,否则它不起作用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-04
        • 2013-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        相关资源
        最近更新 更多