JavaScript с открытым методом XMLHttpRequest: использование post и его параметров - PullRequest
0 голосов
/ 14 сентября 2009

Пользователи моего сайта, в идеале, будут отправлять несколько сотен сообщений на сервер БД в течение примерно часа (в основном это онлайн-эксперимент). Эксперимент реализован в js, поэтому я пытаюсь использовать объект XMLHttpRequest для публикации данных, которые собирает сценарий.

В чем я не уверен, так это в том, как использовать параметр POST. Я хочу установить около 8 различных пар ключ / значение для переменной $ _POST, чтобы она была доступна странице .php для обработки перед отправкой на сервер БД. Меня не интересует получение какой-либо информации с самого сервера, только ее отправка (вот почему, и я не уверен, что это правильный подход, я устанавливаю условное состояние readyState в '1' / open).

Вот скрипт, с которым я сейчас работаю:

function postData(dataList) {

 var xmlhttp = new XMLHttpRequest();
 var processingUrl = "process_exercise_data.php";
 var POSTBody = "";
 POSTBody+="block_type="+encodeURIComponent(dataList[0]);
 POSTBody+="&block_number="+encodeURIComponent(dataList[1]);
 POSTBody+="&trial_type="+encodeURIComponent(dataList[2]);
 POSTBody+="&trial_number="+encodeURIComponent(dataList[3]);
 POSTBody+="&input_value="+encodeURIComponent(dataList[4]);
 POSTBody+="&output_value="+encodeURIComponent(dataList[5]);
 POSTBody+="&prediction_value="+encodeURIComponent(dataList[6]);
 POSTBody+="&error="+encodeURIComponent(dataList[7]);


 xmlhttp.open("POST",processingUrl,true);
 if (xmlhttp.readyState==4) {
  xmlhttp.send(POSTBody);
 }

}

Основная цель - отправить пары ключ / значение на страницу .php, используя POST, оставаясь на текущей странице (простой запрос AJAX, если я не ошибаюсь). Любые комментарии или предложения очень ценятся!

Помните, все, что я пытаюсь сделать, - это заставить пользователя, когда он / она действует определенным образом при определенном условии (вне области действия этой функции), вызывать эту функцию и ЗАПИСАТЬ эти данные в сервер. Текст ответа сервера не требуется.

EDIT:

Теперь мой вопрос таков: смогу ли я по-прежнему обращаться к массиву $ _POST на странице обработки php? Вот пример:

$block_type = $_POST['block.type'];

Ответы [ 3 ]

2 голосов
/ 14 сентября 2009

Подумайте об использовании jQuery, это значительно облегчит вашу задачу. Используя метод jQuery.post, вам нужно только предоставить хэш data, вам не нужно беспокоиться о сериализации, правильном экранировании или readyState.

2 голосов
/ 14 сентября 2009

Вы не хотите устанавливать заголовки запроса. Вам нужно отправить запрос body . И тело должно быть как

'block_type='+encodeURIComponent(dataList[0])+'&block_number='+encodeURIComponent(dataList[1])

и т.д.. Думаю, у тебя есть идея. Тело - это то, что вы передаете методу send() объекта XMLHTTPRequest.

0 голосов
/ 14 сентября 2009

Вы должны позвонить, прежде чем readyState изменится.

Заменить

xmlhttp.open("POST",processingUrl,true);
if (xmlhttp.readyState=4) {
  xmlhttp.send(POSTBody);
}

с

xmlhttp.open("POST", processingUrl, false);
xmlhttp.send(POSTBody);

Если вы хотите обработать ответ, добавьте определение xmlhttp.onreadystatechange:

xmlhttp.open("POST", processingUrl, false);
xmlhttp.onreadystatechange = function () {
  if (this.readyState === 4) {
    // handle response
  }
};
xmlhttp.send(POSTBody);

Редактировать: Я также хотел бы отметить, что = это не оператор равенства JavaScript, это оператор присваивания. Используйте === для проверки на равенство и == для проверки на равенство при преобразовании типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...