用AJAX和PHP处理html格式的几个输入字段



我有这个表单,但在尝试测试它时得到了http_bad_response (400)。有人能解释一下吗?

我是这个领域的新手,还在努力提高。此外,我想知道当试图在PHP脚本中捕获无线电输入时,是否应该区别对待它们。

HTML表单:

<form id="cform" action="mailer1.php" method="post">
<div class="form-row">
<div class="col">
<input type="text" class="form-control" id="name" placeholder="Nombre" name="name">
</div>
<div class="col">
<input type="text" class="form-control" id="phone" placeholder="Teléfono" name="phone">
</div>
</div>
<div class="row mt-3">
<div class="col">
<input type="text" class="form-control" id="email" placeholder="Correo" name="email" required>
</div>
</div>
<div class="row mt-3">
<div class="col">
<input type="text" class="form-control" id="dim" placeholder="Dirección de inmueble" name="dim">
</div>
</div>
<div class="row mt-3">
<div class="col">
<input type="text" class="form-control" id="diudad" placeholder="Ciudad" name="ciudad">
</div>
<div class="col">
<input type="text" class="form-control" id="poblacion" placeholder="Población" name="poblacion">
</div>
</div>
<div class="row mt-3">
<div class="col">
<input type="text" class="form-control" id="viviendas" placeholder="N° Viviendas" name="viviendas">
</div>
<div class="col">
<input type="text" class="form-control" id="garajes" placeholder="N° Garajes" name="garajes">
</div>
<div class="col">
<input type="text" class="form-control" id="trasteros" placeholder="N° Trasteros" name="trasteros">
</div>
</div>
<div class="row mt-3">
<div class="col-4">
<input type="text" class="form-control" id="viviendas" placeholder="Locales" name="locales">
</div>
<div class="col-4">
<input type="text" class="form-control" id="garajes" placeholder="Ascensores" name="ascensores">
</div>
<label class="mr-1" for="ol">Portería:</label>
<div class="col-1 custom-control custom-radio">
<input type="radio" class="custom-control-input" id="r1" name="por" value="customEx">
<label class="custom-control-label" for="r1">Sí</label>
</div>
<div class="col-1 custom-control custom-radio">
<input type="radio" class="custom-control-input" id="r2" name="por" value="customEx">
<label class="custom-control-label" for="r2">No</label>
</div>
</div>
<div class="row mt-3">
<div class="col">
<input type="text" class="form-control" id="asunto" placeholder="Asunto" name="asunto">
</div>
</div>
<div class="row mt-3">
<div class="col">
<textarea class="form-control" id="ozc" placeholder="Otras zonas comunes" name="ozc" rows="3"></textarea>
</div>
<div class="col">
<textarea class="form-control" id="mensaje" placeholder="Su Mensaje:" name="mensaje" rows="3"></textarea>
</div>
</div>   
</div>
<!-- Modal footer -->
<div class="modal-footer">
<button type="submit" class="btn btn-success">Enviar</button>
</div>
</form>

PHP:

// Only process POST reqeusts.
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// Get the form fields and remove whitespace.
$name = strip_tags(trim($_POST["name"]));
$name = str_replace(array("r","n"),array(" "," "),$name);
$email = filter_var(trim($_POST["email"]), FILTER_SANITIZE_EMAIL);
$mensaje = trim($_POST["mensaje"]);
$phone = trim($_POST["phone"]);
$dim = trim($_POST["dim"]);
$ciudad = trim($_POST["ciudad"]);
$poblacion = trim($_POST["poblacion"]);
$viviendas = trim($_POST["viviendas"]);
$garajes = trim($_POST["garajes"]);
$trasteros = trim($_POST["trasteros"]);
$locales = trim($_POST["locales"]);
$ascensores = trim($_POST["ascensores"]);
$asunto = trim($_POST["asunto"]);
$ozc = trim($_POST["ozc"]);
// Check that data was sent to the mailer.
if ( empty($name) OR empty($message) OR !filter_var($email, FILTER_VALIDATE_EMAIL)) {
// Set a 400 (bad request) response code and exit.
http_response_code(400);
echo "Oops! There was a problem with your submission. Please complete the form and try again.";
exit;
}
// Set the recipient email address.
$recipient = "mdrr5545@gmail.com";
// Set the email subject.
$subject = "New contact from $name";
// Build the email content.
$email_content = "Name: $namen";
$email_content .= "Email: $emailnn";
$email_content .= "Message:n$messagen";
// Build the email headers.
$email_headers = "From: $name <$email>";
// Send the email.
if (mail($recipient, $subject, $email_content, $email_headers)) {
// Set a 200 (okay) response code.
http_response_code(200);
echo "Thank You! Your message has been sent.";              
} else {
// Set a 500 (internal server error) response code.
http_response_code(500);
echo "Oops! Something went wrong and we couldn't send your message.";
}
}
else {
// Not a POST request, set a 403 (forbidden) response code.
http_response_code(403);
echo "There was a problem with your submission, please try again.";
}

由于您正在返回自己的http状态代码,当您看到400时,它可能意味着真实的400,即Apache表示存在客户端数据错误,也可能是您自己的PHP代码返回400。

所以,让我们先来看第二个案例。在这种情况下,PHP代码将返回400:

if (empty($name) OR empty($message) OR !filter_var($email, FILTER_VALIDATE_EMAIL)) {

扫描代码时,未定义$message,它将始终为null。这意味着empty($message)将永远是真的,并且整个测试将永远是真实的。所以,你总是会看到400的回复。

注:

  • 表单HTML无效,存在不平衡的<div>。您可以使用验证器进行检查,例如https://validator.w3.org/,或者如果您使用IDE,它们会有所帮助。

  • 我认为返回这样的http错误代码不是一个好主意,原因有二。首先,你无法判断这是一个真正的400错误,还是你的代码正在做的事情,这使得调试和维护变得更加困难。其次,根据规范,这不是400的响应。请求成功了,有效负载完全有效——只是你的应用程序拒绝了它。400应该意味着网络/数据层的技术错误。

最新更新