Вопрос был:
Как вернуть ответ от асинхронного вызова?
blockquote>, который может быть интерпретирован как:
Как сделать синхронный асинхронный код синхронным?
blockquote>Решение будет состоять в том, чтобы избежать обратных вызовов и использовать комбинацию Promises и async / await.
Я хотел бы привести пример для запроса Ajax.
(Хотя он может быть записан в Javascript, я предпочитаю писать его на Python и компилировать его в Javascript, используя Transcrypt . Это будет достаточно ясно.)
Позволяет сначала включить использование JQuery, чтобы
$
был доступен какS
:__pragma__ ('alias', 'S', '$')
Определить функцию, которая возвращает Promise, в этом случае вызов Ajax:
def read(url: str): deferred = S.Deferred() S.ajax({'type': "POST", 'url': url, 'data': { }, 'success': lambda d: deferred.resolve(d), 'error': lambda e: deferred.reject(e) }) return deferred.promise()
Использовать асинхронный код, как если бы он был синхронным:
async def readALot(): try: result1 = await read("url_1") result2 = await read("url_2") except Exception: console.warn("Reading a lot failed")
Как уже упоминалось выше, ваша кнопка отправки ДОЛЖНА иметь атрибут name="submit"
, иначе ваш if (isset($_POST['submit'])){...
не будет работать. Тем не менее, у меня была эта точная проблема в последнее время и почему-то наткнулся на упоминание о том, что <input name="name">
виноват. В вашем случае <input name="Name">
. Как только я обновил атрибут name до «username», форма функционировала отлично. Хотя я не смог найти точных аргументов в пользу этой причуды, он определенно поднял понимание того, что я назвал моими атрибутами, селекторами, переменными и т. Д. ...
Здесь кое-что не так.
Давайте начнем с вершины и с вашим условным утверждением ( и проделаем свой путь вниз ).
if (isset($_POST['submit'])){...}
Ваша кнопка отправки <input type="submit" value="submit" id="submit">
не имеет для нее атрибута имени.
Измените его так, чтобы он читался как:
<input type="submit" name="submit" value="submit" id="submit">
Затем вы используете mysqli_real_escape_string()
, которые теоретически требуют, чтобы соединение было передано этой функции.
Ie:
$Name = mysqli_real_escape_string($connection,$Name);
и сделать то же самое для остальных; предполагая, что вы взаимодействуете с базой данных.
Однако неясно, действительно ли вы взаимодействуете с вашей базой данных или нет, поэтому, если вы не взаимодействуете с ней, удалите все из них mysqli_real_escape_string
из вашего POST массивы.
Т.е.:
$Name = $_POST['Name'];
и сделайте то же самое для остальных.
Вы также пропускаете POST в качестве метода в вашей форме:
<form action="action_page.php" name="myform">
, который по умолчанию GET при пропуске. Поэтому измените его на:
<form action="action_page.php" name="myform" method="post">
Чтобы затем проверить, была ли отправлена почта, измените
mail($webEmail,$email_subject,$email_body,$headers);
на
if(mail($webEmail,$email_subject,$email_body,$headers)){
echo "Sent";
}
Если вы видите «Отправлено», тогда почта выполнила бы свою работу. Если почта не получена, проверьте свой спам. Или ваш сервер может быть внесен в черный список.
Убедитесь, что у вас есть доступ к использованию mail()
.
Вы также должны убедиться, что все входы были заполнены с помощью условного empty()
.
Ie:
if(!empty($_POST['Name'])){
// $Name = mysqli_real_escape_string($Name);
$Name = $_POST['Name'];
}
Добавьте сообщение об ошибке в начало вашего файла (ов), который поможет найти ошибки.
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// rest of your code
Sidenote: Сообщение об ошибках должно выполняться только в стадии постановки и никогда не производить.
Сноски:
Я не знаю, что они используются для onfocus="this.value='';"
, поэтому, если у вас где-то есть JS / Ajax, вам нужно проверить их.
Вы также должны попробовать удалить value="Name"
и для других также на всякий случай.
Sidenote:
Если вы все еще получаете ошибку 404, попробуйте поместить ваш PHP сверху и вашу HTML-форму ниже этого и внутри того же файла с расширением .php
и выполните:
<form action="" name="myform" method="post">
с использованием action=""
в качестве действия, которое должно выполняться на на этой же странице.
Дополнительная сноска:
Я заметил в комментарии, который вы разместили в другом ответе:
"I добавленный заголовок ('Местоположение: lizbethmcgee.com/pages/Contact.php'; );
blockquote>Сначала убедитесь, что вы не выводите его перед заголовком.
Кроме того, вы должны также включить полный вызов
http://
иexit;
:header("Location: http://www.lizbethmcgee.com/pages/Contact.php"); exit;
, чтобы избежать дальнейшего выполнения кода, который может присутствовать ниже этого, если он есть.
Как AdamT заявил в комментарии:
Отправка почты с помощью команды php