Форум программистов, компьютерный форум, киберфорум
Наши страницы

PHP для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 1, средняя оценка - 5.00
Vshining
62 / 62 / 19
Регистрация: 04.12.2016
Сообщений: 215
Завершенные тесты: 1
#1

AJAX - как сделать запрос к PHP-коду без перезагрузки страницы - PHP

21.12.2016, 01:36. Просмотров 6227. Ответов 20

Эта тема имеет больше общего с JavaScript, но ввиду того, как часто у новичков возникают вопросы вроде "Как выполнить функцию PHP из JavaScript-кода?" или "Как отправить форму без перезагрузки?", она напросилась в этом разделе сама самой.

Итак, AJAX - это Asynchronous Javascript And XML - асинхронный JavaScript и XML, если по-русски. Разберём каждое слово:

1) Асинхронный - это и есть то самое, чего все так хотят - выполнение действий без перезагрузки страницы. Пока JavaScript отправил запрос на сервер, пользователь продолжает выполнять действия на странице, т.к. никаких переходов при отправке запроса не происходит.

2) JavaScript - язык программирования, который используют инструменты для отправки AJAX-запросов. Т.к. статья для новичков, то подразумевается, что вы используете либо только чистый JavaScript, либо в совокупности с jQuery. Если вы не используете jQuery, то для создания такого запроса требуется создание объекта XMLHttpRequest. В jQuery всё немного проще и лаконичнее - вы пользуетесь методами $.post и $.get для отправки соответствующих запросов. Когда нужно использовать post, а когда get - чуть позже.

3) XML - в контексте этой статьи это не так важно, считайте это отсылкой к тому самому объекту XMLHttpRequest, ведь сначала появился именно этот способ.

Таким образом, AJAX - это способ отправки запросов (и данных) на сервер без перезагрузки страницы и, как следует, прерывания действий пользователя.

О методах GET и POST.

Обычно, любой запрос сопровождается некоторыми параметрами. В GET-запросах такие параметры передаются в URL, например: http://site.com/index.php?param1=value1&param2=value2. Это накладывает два ограничения:
1) Объём отправляемых данных существенно ограничен - объём классического GET-запроса находится в диапазоне от 2 до 8 килобайт по умолчанию.
2) Данные открыты - не желательно передавать чувствительные данные, например - пароли. Из-за этого, POST-запросы встречаются намного чаще.

У POST-запроса, в отличие от GET, есть тело, которое помещается после заголовка (а GET-запрос имеет только его). Данные тела явно не передаются (относительно - трафик можно прослушать, но это уже вопрос применения шифрования и защищенного канала). Объём информации, который можно передать в теле, опять же, зависит от настроек сервера. По умолчанию, этот объём порядка 20 мегабайт. И, разумеется, можно передавать GET-параметры через URL. В общем случае, POST-запросы являются более гибкими.

Теперь рассмотрим отправку этих двух видов запросов с помощью обозначенных выше методов - с помощью объекта XMLHttpRequest и методов jQuery - $.post и $.get.

GET-запрос

В качестве примера используем следующий "скрипт":

hello.php
PHP
1
2
3
<?php
$name = $_GET['name'];
echo "Hello, $name!";
1) XMLHttpRequest
Javascript
1
2
3
4
5
6
7
8
9
10
11
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
            alert(this.responseText);
        } else {
        alert('Произошла ошибка!');
    }
};
 
xmlhttp.open("GET", "hello.php?name=Webkill", true);
xmlhttp.send(null);
В строке один происходит создание объекта. Во второй мы присваиваем этому объекту свойство onreadystatechange - функцию, которая будет выполнена, когда
будет получен ответ на запрос. Такая функция называется callback (колбэк). В ней мы обрабатываем два случая - когда запрос прошел нормально, и когда произошла ошибка.

В 10-той строке мы вызываем метод, в который передаём три параметра:
1) "GET" - тип запроса
2) "hello.php?name=Webkill" - URL запроса: файл hello.php и один параметр name.
3) true - асинхронность. Если false - то браузер будет ожидать ответа (синхронность).

На 11-ой строке происходит отправка запроса, при этом мы указываем один параметр - null (позже, через этот параметр будут передаваться данные тела POST-запроса).

2) jQuery

Javascript
1
2
3
4
5
$.get("hello.php", {name: "Webkill"},
    function(data) {
        alert(data);
    }
);
Собственно, отправка GET-запроса в jQuery заключается в вызове метода $.get с тремя параметрами:
1) "hello.php" - часть URL без GET-параметров
2) {name: "Webkill"} - параметры запроса в виде ассоциативного массива (JSON)
3) Функция-обработчик, которая вызывается в случае "успеха"

POST-запрос

Допустим, нужно сделать аутентификацию без перезагрузки страницы. GET-запрос не подходит, т.к. передаётся пароль.

login.php
PHP
1
2
3
4
5
6
7
8
9
<?php
$login = 'Webkill';
$pass = 'qwerty123';
 
if($_POST['login'] == $login && $_POST['password'] == $pass) {
    echo 'Добро пожаловать!';
} else {
    echo 'В доступе отказано.';
}
1) XMLHttpRequest

Javascript
1
2
3
4
5
6
7
8
9
10
11
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
            alert(this.responseText);
        } else {
            alert('Произошла ошибка!');
        }
};
 
xmlhttp.open("POST", "login.php", true);
xmlhttp.send({login: inputLogin, pass: inputPassword});
Легко заметить, что в целом код не изменился. Поменялся только первый параметр функции open - тип запроса, и теперь мы передаём данные в метод send в формате JSON.

2) jQuery

Javascript
1
2
3
4
5
$.post('login.php', {login: inputLogin, pass: inputPassword}, 
    function(data) {
        alert(data);
    }
);

Снова, изменений немного: только название метода говорит о том, что в этот раз мы шлём POST-запрос. В случае GET-запроса параметры, которые мы передаём в JSON, закодируются в URL, а в случае POST - попадут в тело запроса. Если вы хотите использовать GET-параметры в POST-запросе, то необходимо их писать в URL вручную.

Естественно, круг задач, для которых используется AJAX намного шире - загрузка файлов, игры и т.д. Целью этой статьи является ознакомление с этим комплексом технологий. Стоит отметить, что в случае jQuery можно обрабатывать намного больше вариантов ответа сервера с помощью функций done, fail и always. Также, функции-обработчики кроме собственно ответа принимают и другие параметры.

Для дальнейшего изучения:
jQuery $.post
jQuery $.get
Русский сайт о XMLHttpRequest
8
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.12.2016, 01:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос AJAX - как сделать запрос к PHP-коду без перезагрузки страницы (PHP):

Пример простейшего калькулятора на PHP без перезагрузки страницы (чистый Ajax, без jQuery и других библиотек) - PHP
Привет. Это, в каком-то смысле, продолжение креатива http://www.cyberforum.ru/php-beginners/thread1889429.html но здесь я решил не...

Как заставить этот код работать без перезагрузки страницы (ajax) - PHP
Здравствуйте. Вопрос такой - есть страница table.html в неё подключается table.php с помощью include. В файле table.php происходит вывод...

Как выполнить PHP код без перезагрузки страницы? - PHP
У меня имеется код: &lt;?php if(isset($_POST)) { $text = $_POST; echo $text; } ?&gt; &lt;form method=&quot;post&quot; action=&quot;&quot;&gt; &lt;input...

ajax загрузка страницы без перезагрузки - PHP
ajax загрузка страницы без перезагрузки внутри контента Пример у меня есть ссылка index.php?do=rules мне нужно что бы при нажатии на эту...

Отправка формы без перезагрузки страницы Ajax - PHP
Здравствуйте! Никак не могу отправить. В чем ошибка, если есть? Файлы index.html и jquery.js находятся в папке ajax на рабочем столе....

Отправка формы без перезагрузки страницы (AJAX) - PHP
Все работает нормально, но почему то дублируются поля ввода ИМЯ и СООБЩЕНИЕ после нажатия на кнопку отправить &lt;!DOCTYPE html PUBLIC...

20
Kerry_Jr
Модератор
Эксперт PHP
2206 / 2002 / 701
Регистрация: 14.05.2014
Сообщений: 5,867
Записей в блоге: 1
Завершенные тесты: 5
21.12.2016, 09:28 #2
Цитата Сообщение от Vshining Посмотреть сообщение
В jQuery всё немного проще и лаконичнее - вы пользуетесь методами $.post и $.get
Единственное, что хочется добавить, - это еще один удобный метод $.ajax(), который может использоваться для отправки как GET, так и POST-запроса.
0
ProCode
30 / 30 / 4
Регистрация: 11.12.2016
Сообщений: 387
Записей в блоге: 6
26.12.2016, 20:00 #3
По существу: Исполнение PHP-скрипта без перезагрузки страницы и без знания JavaScript(!) - Xajax - решил запостить отдельной темой, бо Xajax - это особая большая тема (ожидаю много вопросов там). Ко всему прочему, это как раз и есть практически чистое PHP. Т.е. JavaScript там разумеется есть, но он упакован внутрь PHP-обертки настолько плотно, что кодеру при написании Ajax-скрипта нужно написать не более 1-2 простейших строчек на JavaScript.
1
полудух
154 / 138 / 29
Регистрация: 15.03.2016
Сообщений: 782
30.12.2016, 13:11 #4
забыли описать, как из формы передать данные
Javascript
1
data: $(form_id).serialize()
(для $.ajax)
0
DJestin
0 / 0 / 0
Регистрация: 29.12.2016
Сообщений: 156
Завершенные тесты: 1
09.01.2017, 13:13 #5
Что-то у меня не получаается.. страница все равно перезагружается..
Делаю так:

index.php
PHPHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<form id="form_id" name="form_id" method="post">
<input type="login" name="login" value="<?php echo $_POST['login'];?>"><br>
<input type="text" name="password" value="<?php echo $_POST['password'];?>"><br>
<input type="submit" value="New">
</form>
<script type="text/javascript">
$data: $(form_id).serialize();
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
alert(this.responseText);
} else { alert('Произошла ошибка!'); } };
xmlhttp.open("POST", "login.php", true);
xmlhttp.send({login: inputLogin, pass: inputPassword});
</script>
login.php
PHP
1
2
3
4
5
if($_POST['login'] && $_POST['password'] ) {
echo 'Добро пожаловать!<br>';
} else {
echo 'В доступе отказано.<br>';
}
Работает, но при нажатии на кнопку , страница перезагружается.. А как сделать что бы не перезагружалась страница???
Может я конечно что то не так делаю, подскажите, пожалуйста!!
0
полудух
154 / 138 / 29
Регистрация: 15.03.2016
Сообщений: 782
09.01.2017, 13:53 #6
а что это, собственно, за лажа?
Цитата Сообщение от DJestin Посмотреть сообщение
$data: $(form_id).serialize();
и XMLHttpRequest() уже не нужна, когда юзается jQuery (не забываем подключать)

изучаем: http://ruseller.com/lessons.php?rub=32&id=1452


Javascript
1
2
3
4
5
6
7
8
9
Пример 2
 
Передаем пользовательские данные PHP скрипту.
$.ajax({
        type:'POST',
        url:'response.php?action=sample2',
        data:'name=Andrew&nickname=Aramis',
        success:function(data){$('.results').html(data);}
});
здесь вместо data:'блаблабла' - вставляем
Javascript
1
data: $(form_id).serialize()
где form_id это some_id из <form id='some_id'>...</form>

для отладки в скрипте ловите: var_dump($_POST);exit;
0
DJestin
0 / 0 / 0
Регистрация: 29.12.2016
Сообщений: 156
Завершенные тесты: 1
09.01.2017, 15:14 #7
Сделала так:
index.php
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<form id="form_id" name="form_id" method="post">
            <input type="login" name="login" value="<?php echo $_POST['login']; ?>"><br>
            <input type="text" name="password" value="<?php echo $_POST['password']; ?>"><br>
  <input type="submit" value="New">
</form>
 <script>
 $.ajax({
             type: 'POST',
             url: 'index.php?action=sample2',
             data: $(form_id).serialize(),
             success: function (data) {
             $('.results').html(data);
            }
       });
 </script>
 <?php    var_dump($_POST);exit;  ?>
После того как нажата кнопка делается перезагрузка страницы и выдает:
array(2) { ["login"]=> string(5) "blala" ["password"]=> string(9) "blablabla" }
Как сделать без перезагрузки??

И вот эта ссылка не работает
0
полудух
154 / 138 / 29
Регистрация: 15.03.2016
Сообщений: 782
09.01.2017, 16:25 #8
<form id="form_id" method="post" onsubmit='return false;'>
ну или заменить type="submit" на type="button" (хотя правильнее использовать просто <button ...>)

$('.results').html(data);
а где блок с class='results' ?

Цитата Сообщение от DJestin Посмотреть сообщение
И вот эта ссылка не работает
печальненько ( видимо, ничто не вечно
0
DJestin
0 / 0 / 0
Регистрация: 29.12.2016
Сообщений: 156
Завершенные тесты: 1
09.01.2017, 16:38 #9
Вот так вот надо??
index.php
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<form id="form_id" name="form_id" method="post" >
           <input type="login" name="login1" value="<?php echo $_POST['login1']; ?>"><br>
           <input type="text" name="password" value="<?php echo $_POST['password']; ?>"><br>
      <button>Ok</button>
</form>
<script>
$.ajax({
         type: 'POST',
         url: 'login.php',
         data: $(form_id).serialize(),
         success: function (data) {
         $('.results').html(data);
         }
     });
</script>
<div class='results'></div>
<?php var_dump($_POST);   exit; ?>
вот только при нажатии на кнопку страница перезагружается
0
полудух
154 / 138 / 29
Регистрация: 15.03.2016
Сообщений: 782
09.01.2017, 16:48 #10
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
#var_dump($_POST);exit; // это раскомментить после загрузки страницы и до нажатия кнопки
# ваш скрипт пока ещё ничего путного не возвращает на AJAX-запрос, он лишь вернёт дубль формы.
# Надо так:
if (!empty($_POST{'what'}) && $_POST{'what'} === 'ajax')
{
    echo 'AJAX приехал! '.$_POST{'login1'};
    exit;
}
 
 
<form id="form_id" method="post" onsubmit='return false;'>
<input name='what' value='ajax'>
<input type="login" name="login1" value="<?php echo $_POST['login1']; ?>"><br>
<input type="text" name="password" value="<?php echo $_POST['password']; ?>"><br>
<button onclick='ajaxPOST("form_id");return false;'>Ok</button>
</form>
 
<script>
function ajaxPOST(form_id)
{
$.ajax({
type: 'POST',
url: 'login.php',
data: $(form_id).serialize(),
success: function (data) {
$('.results').html(data);
}
});
 
} // ajaxPOST
</script>
 
<div class='results'></div>
?>
0
DJestin
0 / 0 / 0
Регистрация: 29.12.2016
Сообщений: 156
Завершенные тесты: 1
09.01.2017, 17:14 #11
Сделала как ты сказал.., ни чего не происходит
Цитата Сообщение от полудух Посмотреть сообщение
# ваш скрипт пока ещё ничего путного не возвращает на AJAX-запрос, он лишь вернёт дубль формы.
А как сделать что бы он вернут мне то что пользователь напишет в login и password ??
0
полудух
154 / 138 / 29
Регистрация: 15.03.2016
Сообщений: 782
09.01.2017, 18:01 #12
сказал же jQuery подключить

PHPHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
#var_dump($_POST);exit; // это раскомментить после загрузки страницы и до нажатия кнопки
# ваш скрипт пока ещё ничего путного не возвращает на AJAX-запрос, он лишь вернёт дубль формы.
# Надо так:
 
if (!empty($_POST{'what'}) && $_POST{'what'} === 'ajax')
{
    echo 'AJAX приехал! '.$_POST{'login1'};
    exit;
}
?>
 
<!DOCTYPE html>
<html>
<head>
<script src='https://code.jquery.com/jquery-3.1.1.min.js'></script>
</head>
 
<body>
<form id="form_id" method="post" onsubmit='return false;'>
<input type=hidden name='what' value='ajax'>
<input type="login" name="login1" value=''><br>
<input type="text" name="password" value=''><br>
<button onclick='ajaxPOST("#form_id");'>Ok</button>
</form>
 
<script>
function ajaxPOST(form_id)
{
//alert($(form_id).serialize());exit;
 
$.ajax({
type: 'POST',
url: 'index.php',
data: $(form_id).serialize(),
success: function (data) {
    $('.results').html(data);
}
});
 
} // ajaxPOST
</script>
 
<div class='results'></div>
 
</body>
</html>
2
Dimon3x
2 / 2 / 1
Регистрация: 24.03.2013
Сообщений: 266
10.01.2017, 16:31 #13
Это вопрос или статья?
0
fanatikus
1018 / 1015 / 321
Регистрация: 17.11.2012
Сообщений: 4,457
10.01.2017, 18:45 #14
Цитата Сообщение от DJestin Посмотреть сообщение
А как сделать что бы он вернут мне то что пользователь напишет в login и password ??
PHPHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    <script type="text/javascript">
        $(function () {
            $('#form_id').submit(function(e){
                e.preventDefault();//отменяем действие по умолчанию(отправка формы)
                var data = $(this).serialize();// получаем данные из формы
                $.ajax({
                    url:'ajax.php',//адрес обработчика
                    type:'post',//метод передачи данных
                    data:data,
                    success:function(res){
                        $('#result').html(res);//выводим ответ с сервера в контейнер с id='result'
                    }
                })
            })
        })
    </script>
    <form id="form_id" method="post">
        <input type="login" name="login" value=''><br>
        <input type="text" name="password" value=''><br>
        <button type="submit" name="sub">Ok</button>
    </form>
    <div id="result"></div><!--тут выведем ответ с сервера-->
файл ajax.php
PHP
1
echo 'login-'.$_POST['login'].'<br>'.'password- '.$_POST['password'];
1
And82
3 / 3 / 1
Регистрация: 15.01.2016
Сообщений: 134
11.01.2017, 13:36 #15
Спасибо за статью. Но я не нашёл ответа на свой вопрос. У меня 1 функция в php файле. Он находится в той же папке, что и html файл с кнопкой, при нажатии на которую должна вызываться эта 1 функция.

Javascript
1
2
3
4
5
function tra(){
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.open( "GET", "Api.php", false );
    xmlHttp.send( null );
};
только консоль пишет ошибку Api.php 404 - not found.
0
11.01.2017, 13:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2017, 13:36
Привет! Вот еще темы с ответами:

Как по ссылке PHP направить в нужный мне блок без перезагрузки страницы. - PHP
Создаю сайт только на PHP, не сильно силен, но хочу сделать его немного динамическим. На сайте имеется Блок шапки, слева меню, которое с...

Исполнение PHP-скрипта без перезагрузки страницы и без знания JavaScript(!) - Xajax - PHP
Приветствую! Решил запостить отдельной темой, а в прилепленной (про Ajax) просто разместить на нее ссылку. Так будет структурно правильнее,...

Проверка на xmlhttprequest для ajax, динамическое обновление контента без перезагрузки страницы - PHP
Доброго времени суток уважаемые форумчане, Облазил и перерыл весь интернет но конкретного ответа на свой вопрос не нашел, объяснений и...

Вызвать PHP функцию без перезагрузки страницы - PHP
Вообщем задача такая: Есть input с email нужно что бы при нажатии на кнопку без перезагрузки страницы отправилось email, как это можно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru