я хочу отправлять / передавать данные от клиента к серверу с помощью (ajax на php), но когда я пробую этот код
<script src = "http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script type = "text/javascript">
$.ajax({
type: 'post',
url: 'loo.php',
data: { data: 'some data' },
success: function(response,w) {
console.info(w);
}
});
</script>
<?php
echo $_POST['data'];
?>
в моем браузере я получил распечатку success, что означает, что код javascript работает нормально, я думаю, в php я получил Undefined index
p.s мое имя файла - loo.php, весь код находится в том же файле
изменить: я пытался разделить свои файлы следующим образом:
my loo.php file:
<script src = "http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script type = "text/javascript">
$.ajax({
type: 'post',
url: 'test.php',
data: {data: 'some data'},
success: function (response, w) {
console.info(w);
}
});
</script>
my test.php file:
<?php
echo $_POST['data'];
?>
все еще есть неопределенный индекс
p.s. Я перехожу в руководство к файлу test.php после запуска файла loo.php
Возможный дубликат jQuery Ajax передает значение на той же странице php
Вы должны разделить свой код на 2 разных файла. Ваш undefined index, скорее всего, происходит при начальной загрузке страницы, когда ваши данные POST не установлены
Я только что отредактировал вопрос. Думаю, я понял, что с тобой происходит



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Попробуй это.
<?php
$data = json_decode(file_get_contents('php://input'), true);
echo $data['data'];
?>
jQuery исправляет сообщение, поэтому переменная $_POST будет заполнена. Нет необходимости извлекать что-либо из входного потока вручную и самостоятельно его декодировать.
Попробуй это
HTML файл
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id = "data_value"></div>
<script type = "text/javascript">
$( document ).ready(function() {
$.ajax({
type: 'post',
url: 'loo.php',
data: { data: 'some data' },
success: function(response,w) {
$("#data_value").html(response);
}
});
});
Файл PHP (loo.php)
<?php
print_r($_POST);
?>
попробуйте изменить обработчик таким образом:
if (isset($_POST['data'])){
function return_data() {
die(json_encode($_POST['data'])));
}
return_data();
}
Зачем вам 1. создавать для этого функцию? 2. json_encode данные, когда это строка?
Ваши вопросы справедливы. 1) Для приведенного выше примера создавать отдельную функцию не нужно. Но, возможно, это стоит сделать, если вам нужно создать ОДИН обработчик для ВСЕХ запросов Ajax. 2) Не проводить дополнительную проверку типа данных, если мы не знаем тип входящих данных.
1. Конечно, но тогда вы бы не создавали его внутри оператора if, поскольку тогда он будет существовать только в том случае, если этот конкретный оператор if будет оценен как истинный. Тогда вы не сможете повторно использовать ту же функцию. 2. Проблема с json-кодировкой строки заключается в том, что, хотя это действительный json, javascript не сможет правильно ее проанализировать. Javascript принимает объекты и массивы только как json.
Ответьте после редактирования вопроса:
$ _POST - это массив, отправленный запросом HTTP Post. поэтому, если запрос к странице с именем test.php или что-то еще не является запросом HTTP POST, массив $ _POST будет пустым. но массив $ _GET может содержать некоторые данные, если вы их отправили. а переход на страницу - это запрос на получение этой страницы, если вы не использовали форму с method = "post". так что то, что вы делаете с вызовом ajax, правильно. но переход к test.php вручную без формы с методом post не заполнит массив $ _POST. потому что, когда вы выполняете вызов Ajax, он выполняется, он просто выполняет пост-вызов правильно, и все в порядке, но когда вы переходите на эту страницу, это запрос на получение, и он не заполняет массив $ _POST. для этого вам вообще не нужен ajax. вы можете получить эту форму
<form method = "POST" action = "test.php">
<input type = "text" name = "data" value = "some data" />
<input type = "submit" value = "submit" />
</form>
поэтому либо вы используете ajax, либо обрабатываете все, что хотите, в методе успеха ajax. или используйте форму и отправьте запрос на страницу и обработайте его там.
ответ на вопрос перед редактированием
Если они находятся в одном файле, это не сработает., потому что, когда файл загружается, $ _POST ['data'] вообще не существует, и после того, как вы запустите вызов ajax, он существует внутри этого вызова, а не в окне вашего браузера.
поэтому вы можете проверить, существует ли $ _POST ['data'], поэтому вы отправляете его из вызова ajax, чтобы вы могли вернуть его и использовать в своей функции успеха ajax.
вывод:
вы не можете поместить их в один и тот же файл и ожидать, что ajax загрузится до фактического php. сначала он загрузит весь файл, а затем запустит ajax. неопределенный индекс взят с сервера еще до того, как вы увидите HTML-страницу.
Решение могло быть таким:
Файл с вашими функциями html и ajax index.html
<script src = "http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script type = "text/javascript">
$.ajax({
type: 'post',
url: 'loo.php',
data: { data: 'some data' },
success: function(response,w) {
// use the response here
console.info(w);
}
});
</script>
а другой с вашей логикой loo.php
<?php
header("Content-Type: text/plain"); // if you want to return a plain text
// if you want to return json it could be header('Content-type: application/json');
echo isset($_POST['data'])? $_POST['data']: ''
?>
Вы получаете эту ошибку, потому что при загрузке страницы запрос POST еще не был отправлен. Поэтому показывайте представленный data только в том случае, если он существует, в противном случае показывайте код JavaScript.
<?php
if (isset($_POST['data'])) {
die($_POST['data']);
}
?>
<script src = "http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script type = "text/javascript">
$.ajax({
type: 'post',
url: 'loo.php',
data: {data: 'some data'},
success: function (response, w) {
console.info(w);
}
});
</script>
данные всегда не существуют, это моя главная проблема.
@ R3ter Где именно вы это проверяете? Если делать это с помощью console.info(w) - неправильно. Вам следует использовать console.info(response).
Ваш вопрос такой же. Пожалуйста, проверьте это отвечать.