【问题标题】:PHP Issue with isset functionisset 函数的 PHP 问题
【发布时间】:2020-10-25 06:37:49
【问题描述】:

我正在为我的网站制作一个联系表格,该表格使用 php 将输入的信息发送到我的电子邮件。

我的问题是isset php 函数返回false。我不确定这是为什么。

这是我的php代码(输出结果是“未发送”)

<?php

if (isset($_POST['submit'])){
    $name = $_POST['name'];
    $subject = $_POST['subject'];
    $mailFrom = $_POST['mail'];
    $message = $_POST['message'];

    $mailTo = "btrorapps@gmail.com";
    $headers = "From: " .$mailFrom;
    $txt = "You have received an email from " .$name.".\n\n".$message;

    if (mail($mailTo, $subject, $txt, $headers)){
        echo "<h1>sent successfully</h1>";
    } else {
        echo "<h1>something went wrong</h1>";
    }
} else {
    echo "not sent";
}

?>

这是我的表单代码

<form action="contactform.php" method="post" enctype="text/plain">
     <label for="name">Name</label>
     <input type="text" name="name" placeholder="Full name.." maxlength="20" required>

     <label for="mail">Email</label>
     <input type="text" name="mail" placeholder="Your email.." 
      pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z{2,}$" required>

     <label for="subject">Subject</label>
     <input type="text" name="subject" maxlength="25" placeholder="Subject..">

     <label for="message">Message</label>
     <input type="text" name="message" placeholder="Message.." style="height:170px" 
      maxlength="150" required>

     <input type="submit" value="submit" name="submit">
</form>

【问题讨论】:

  • 去掉表单标签中的enctype会发生什么?
  • die('&lt;pre&gt;'.print_r($_POST).'&lt;/pre&gt;'); ...
  • 我认为您需要删除 enctype ,请阅读此内容 (stackoverflow.com/questions/7628249/…)
  • 是什么让您认为isset 返回错误?

标签: php html forms isset


【解决方案1】:

不要使用引用提交按钮的isset($_POST['submit']),以防表单上有多个提交按钮,因为按钮并不总是被按下。这在过去给我带来了问题。

在任何字段上按 enter 将提交带有第一个可用提交按钮的表单。

使用其中一个字段。在您的情况下,您可以使用if (isset($_POST['name'])){

【讨论】:

  • 这是不正确的。以任何方式提交表单应发送其所有输入元素,包括 type=input output.jsbin.com/havison
  • 好吧,我明白你的意思了。我将行更改为 if (isset($_POST['name']))。我明白你在说什么,但不幸的是它不起作用。结果还是“未发送”
  • @SaidbakR 这是不正确的。如果未单击提交按钮,即在文本字段上按下输入,则不会发送提交按钮。试试吧。将发送所有其他字段。不会有提交按钮。参见例如stackoverflow.com/questions/22579616/…
  • @SaidbakR 您的 jsbin 有错误,但我测试正确,您是对的,第一次提交已发送。我发布了这个答案,因为我使用了多个提交按钮并且遇到了这个问题。当第一个提交按钮被发送时,我的答案是错误的,我已经更新了它,但现在它已经不相关了,所以我会把它留给版主离开或删除。
【解决方案2】:

isset 函数没有任何问题。这甚至不是 PHP 相关的问题。

这都是关于表单提交编码的。表单有 3 种有效的编码类型:

  1. application/x-www-form-urlencoded(默认)
  2. multipart/form-data
  3. text/plain

您正在使用第三个,记录如下:

使用text/plain 格式的有效负载旨在为人类 可读。它们不能被计算机可靠地解释,因为 格式不明确(例如,无法区分 值末尾的换行符中的文字换行符)。

您没有得到任何 POST 变量,因为 PHP 在使用 enctype="text/plain" 时不会填充 $_POST

$_POST superglobal 的文档中:

通过 使用 application/x-www-form-urlencoded 时的 HTTP POST 方法或 multipart/form-data 作为请求中的 HTTP Content-Type。


话虽如此,您仍然可以从请求正文中读取原始数据。

$data = file_get_contents('php://input');

但您会以字符串(纯文本)的形式获取整个数据。

最后但同样重要的是,请注意,php://input 不适用于 enctype="multipart/form-data"

【讨论】:

  • 我从 text/plain 更改为 multipart/form-data 并且它运行良好。谢谢!!!
猜你喜欢
  • 2017-10-25
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-18
相关资源
最近更新 更多