1

Тема: Скрипт php через ajax.

И снова здравствуйте! big_smile

У меня вопрос. Вот есть довольно большой скрипт на php (большой не в смысле кода, а в смысле долгий по выполнению).
Он выполняется при отправки формы. Но форма ajax. И мне хочется узнать, можно ли чтобы скрипт выводил не сразу всю работу, а построчно. Например:

echo "Первая строчка";
//пауза
echo "Вторая строчка";
//пауза
echo "Третья строчка";
//пауза
echo "Четвертая строчка";

Надо чтобы в div-е, куда ссылается форма, отображалось так-же: первая строчка (пауза), вторая строчка (пауза) и т.д.

Надеюсь, Вы поможете) Заранее спасибо)

2

Re: Скрипт php через ajax.

JavaScript отправляет PHP скрипту запрос на выполнение через Ajax, затем PHP скрипт должен отправить клиенту JavaScript данные и уровень выполнения операции, например количество выведенных строк, и затем JavaScript опять отправляет запрос на PHP скрипт, чтобы тот начал выборку данных начиная с определенной строки. Таким образом можно сделать постепенный вывод на страницу данных по определенному количеству строк.

3

Re: Скрипт php через ajax.

Hanut сказал:

затем PHP скрипт должен отправить клиенту JavaScript данные и уровень выполнения операции, например количество выведенных строк

Для этого есть определенная функция в php? Я просто ни разу не сталкивался с этим и поэтому не знаю как такое сделать. Все равно спасибо за ответ...

И как отправить данные в скрипт без какого-нибудь события?

4

Re: Скрипт php через ajax.

Hase сказал:

Для этого есть определенная функция в php?

Нет, PHP просто формирует результат в виде Json или XML данных.

Hase сказал:

И как отправить данные в скрипт без какого-нибудь события?

Первый раз событие можно осуществить по открытию страницы, например.

5

Re: Скрипт php через ajax.

Не получается у меня(
Через XML не умею, а через json не получается. В скрипте делаю вызов json, а в основном коде страницы скрипт вывода этого результата. Ноя не знаю как отследить, передал ли php скрипт значение или нет. Когда вызывать функцию $.get('result',"json")?

Если у Вас есть время, я бы посмотрел простейший пример такой связки, в интернете я не нашел то, что мне надо.

Спасибо.

6

Re: Скрипт php через ajax.

Должны получиться часы с 5 секундной задержкой на стороне клиента.

HTML

<script>

function showTime() {
  $.ajax({
    url: 'test.php',
    type: "POST",
    success: function(data) {
      $('#time').html(data);
      window.setTimeout(showTime, 5000);
    }
  });
}

showTime();

</script>

<div id="time"></div>

test.php

<?php

echo date('h:i:s');

?>

7

Re: Скрипт php через ajax.

Спасибо, но это же с задержкой... У меня вот какая ситуация:

HTML:

<head>
                        $('document').ready(function() {
                $('#emails').ajaxForm( {
                    target: '#window', 
                    success: function() { 
                        //without anything spec...
                    } 
                }); 
            });
</head>
<div id="window"></div>
                <form id="emails" method="POST" action="php_scripts/admin_emails.php">
                    <table style="width:100%">
                        <tr>
                            <td style="width:50%">
                                Первая часть рассылки
                            </td>
                            <td style="width:50%">
                                    Вторая часть рассылки
                            </td>
                        </tr>
                        <tr>
                                <td style="width:50%">
                                <input type="radio" name="check" value="1">
                            </td>
                            <td style="width:50%">
                                <input type="radio" name="check" value="2">
                            </td>
                        </tr>
                        <tr>
                            <td colspan="2">
                                <input id="emails-submit" type="image" src="images/project/submit.png">
                            </td>
                        </tr>
                    </table>
                </form>

PHP:

<?php
include "functions.php";
echo "<br><div style='max-width:390px; height:430px; overflow-y:scroll;background:#fff; margin:auto; border-top-left-radius:35px 34px; border-bottom-left-radius:35px 34px; -moz-box-shadow: 0 0 10px rgba(0,0,0,0.5); -webkit-box-shadow: 0 0 10px rgba(0,0,0,0.5); box-shadow: 0 0 10px rgba(0,0,0,0.5);'><table>";
//////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\
/////////////////////FIRST PART\\\\\\\\\\\\\\\\\\\\\\\
//////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\
if(isset($_POST['check'])) {
    if($_POST['check'] == '1') {
        $time = date("H:i:s");
        echo "<tr><td>$time</td><td><h3>Рассылка первой части e-mail началась</h3></td></tr>";
        $id = 0;
        while($id<=3000) {
            $col = 1;
            $email = "";
            while($col<=20) {
                $query = "SELECT * FROM emails WHERE id='$id'";
                $result = queryMysql($query);
                if (mysql_num_rows($result)) {
                    $row = mysql_fetch_row($result);
                    $res = stripslashes($row[1]);
                    if($col<20) {
                        $email .= "$res,";
                    }
                    else {
                        $email .= "$res";
                    }
                }
                $col = $col+1;
                $id = $id+1;
            }
            $time = date("H:i:s");
            echo "<tr><td>$time</td><td>Рассылка стартовала</td></tr>";
            if(5<9) {
                $time = date("H:i:s");
                echo "<tr><td>$time</td><td><center style='color:green'>Рассылка с успешно завершена</center></td></tr>";
            }
            else {
                $time = date("H:i:s");
                echo "<tr><td>$time</td><td><center style='color:red'>Ошибка! Неудалось отправить рассылку!</center></td></tr>";
            }
        }
        $time = date("H:i:s");
        echo "<tr><td>$time</td><td><h3>Рассылка первой части e-mail завершена</h3></td></tr>";
    }
    else if($_POST['check'] == '2') {
    //////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    /////////////////////SECOND PART\\\\\\\\\\\\\\\\\\\\\\
    //////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\
        $time = date("H:i:s");
        echo "<tr><td>$time</td><td><h3>Рассылка второй части e-mail началась</h3></td></tr>";
        $id = 3001;
        while($id<=6047) {
            $col = 1;
            $email = "";
            while($col<=20) {
                $query = "SELECT * FROM emails WHERE id='$id'";
                $result = queryMysql($query);
                if (mysql_num_rows($result)) {
                    $row = mysql_fetch_row($result);
                    $res = stripslashes($row[1]);
                    if($col<20) {
                        $email .= "$res,";
                    }
                    else {
                        $email .= "$res";
                    }
                }
                $col = $col+1;
                $id = $id+1;
            }
            $time = date("H:i:s");
            echo "<tr><td>$time</td><td> Рассылка стартовала</td></tr>";
            if(5<9) {
                $time = date("H:i:s");
                echo "<tr><td>$time</td><td> <center style='color:green'>Рассылка успешно завершена</center></td></tr>";
            }
            else {
                $time = date("H:i:s");
                echo "<tr><td>$time</td><td> <center style='color:red'>Ошибка! Неудалось отправить рассылку</center></td></tr>";
            }
            $id = $id+1;
        }
        $time = date("H:i:s");
        echo "<tr><td>$time</td><td> <h3>Рассылка второй части e-mail завершена</h3></td></tr>";
    } 
}
else {
    $time = date("H:i:s");
    echo "<tr><td>$time</td><td> <center style='color:red'>Ошибка! Не выбран тип рассылки!</center></td></tr>";
}
echo "<script> document.getElementById('ajaxloader-admin').style.display='none';document.getElementById('emails-submit').style.display='block' </script>";
echo "</table></div>";
?>

На условие 5<9 не обращайте внимание. На его месте потом будет условие отправилось письмо или нет.

На этом примере видно, что на стороне клиента нельзя заранее узнать, через сколько времени скрипт выдаст результат. Скрипт надо как-то остановить и вывести результата, а потом запустить снова. Я видел в интернете функцию flush(), но не знаю, относится ли на к этому случаю или нет... И как с ней работать тоже не разобрался, так как в мануале примеров не оказалось sad

8

Re: Скрипт php через ajax.

Hase сказал:

на стороне клиента нельзя заранее узнать, через сколько времени скрипт выдаст результат.

Нельзя.

Посмотрите еще раз строки примера:
$('#time').html(data); // Выводит полученные через Ajax данные на форме сайта.
window.setTimeout(showTime, 5000); // Запускает функцию showTime() через 5 секунд после вывода данных.
Это означает, что скрипт test.php запускается не через каждые 5 секунд, а через каждые 5 секунд после получения данных. Для остановки рекурсии достаточно обернуть строку в условие:
if (...) window.setTimeout(showTime, 5000);
Условие может быть как на стороне клиента (переменная счетчик), так и передаваться через данные в Ajax (<input type="hidden" value="stop" id="stop" />).

9

Re: Скрипт php через ajax.

А-а-а, спасибо, сразу не понял, сейчас попробую реализовать!)

10

Re: Скрипт php через ajax.

Ну у меня все равно выводится весь результат сразу, но обновляется каждые 5 секунд... Ничего не выходит(

11

Re: Скрипт php через ajax.

Hase сказал:

Ну у меня все равно выводится весь результат сразу, но обновляется каждые 5 секунд... Ничего не выходит(

Смысл в том, что вы должны выбрать из БД ограниченное количество строк по (LIMIT 0, 10) например. Во вторую загрузку скрипта уже будет LIMIT 10, 10. Соответственно, для этого необходимо через Ajax передать позицию с которой будет продолжена выборка из БД.

12

Re: Скрипт php через ajax.

Хорошо, спасибо за ответ, завтра попробую реализовать)

13

Re: Скрипт php через ajax.

У меня получилось, но скрипт получился довольно не эффективным. Тормозит работу примерно в 3-4 раза.
У меня появилась идея - записывать все выводы в базу данных, а на сайте с интервалом в 1 секунду считывать с нее данные...
Попробую сделать так...