Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Обновление без перезагрузки при изменении данных в поле БД (https://javascript.ru/forum/misc/55622-obnovlenie-bez-perezagruzki-pri-izmenenii-dannykh-v-pole-bd.html)

Sn9 07.05.2015 11:24

Обновление без перезагрузки при изменении данных в поле БД
 
Собственно тема содержит весь вопрос
Есть БД images(id, img, time)
Вопрос состоит в том как обновить блок div на странице при изменении в БД поля time
Просто очень плохо знаю AJAX
Нагуглил, что нужно пользоваться Long-Polling, но как это делать не смог разобраться

ksa 07.05.2015 11:39

Цитата:

Сообщение от Sn9
Нагуглил, что нужно пользоваться Long-Polling, но как это делать не смог разобраться

А так?
http://habrahabr.ru/post/128535/

Sn9 07.05.2015 11:48

на это натыкался, но статья просто как на php написать этот метод. Про БД ничего не сказано. Да и про обновление без перезагрузки

ksa 07.05.2015 13:10

Цитата:

Сообщение от Sn9
но статья просто как на php написать

У тебя какой серверный язык?

laimas 07.05.2015 13:11

Sn9,
по сути можно обойтись и без Long-Polling в том понимании как он есть.
Например как можно организовать чат на странице - это посылать запросы с клиента и, если есть новости получать их.
Если клиент получая страницу имеет время Т для ID записи, то запросы клиента, это проверять время Т на сервере, и если оно не равно Т, то обновить информацию в DIV.

ksa 07.05.2015 13:11

Цитата:

Сообщение от Sn9
Про БД ничего не сказано. Да и про обновление без перезагрузки

Т.е. вот такое пошаговое описание процесса тебе ни чего не говорит
Цитата:

Итак, что же из себя представляет Long Polling?
Выглядит это примерно следующим образом:
1) Клиент отсылает на сервер обычный ajax-запрос
2) Сервер, вместо того, чтобы быстро обработать этот запрос и отправить ответ клиенту, запускает цикл, в каждой итерации которого следит за возникновением событий (другой клиент добавил запись или удалил).
3) При возникновении события сервер генерирует ответ и отсылает его клиенту, таким образом завершая запрос.
4) Клиент, получив ответ от сервера, запускает обработчик события и параллельно отправляет очередной «длинный» запрос серверу.

То есть всё довольно просто и понятно.

Sn9 07.05.2015 13:56

Я поковырялся и сделал, но криво
Файл со скриптом
<script>
    function show()
    {
        $.ajax({
            url: "run.php",
            cache: false,
            success: function(html){
                $("#content").html(html);
            }
        });
    }

    $(document).ready(function(){
        show();
        setInterval('show()',1000);
    });
</script>


А в run.php запара:
if ( isset( $_GET['id'] ) ) {
    // Здесь $id номер изображения
    $id = (int)$_GET['id'];
    if ( $id > 0 ) {
        $query = "SELECT * FROM video_observation WHERE `id`=".$id;
        // Выполняем запрос и получаем файл
        $res = mysql_query($query);
        if ( mysql_num_rows( $res ) == 1 ) {
            $image = mysql_fetch_array($res);
            // Отсылаем браузеру заголовок, сообщающий о том, что сейчас будет передаваться файл изображения
            header("Content-type: image/*");
            // И  передаем сам файл
            echo $image['im'];
        }
    }

}
?>

<img src="run.php?id=1" alt="" width="200px"/><br><br><br>
<img src="run.php?id=2" alt="" width="200px"/><br>


Немного переименовал БД саму
теперь таблица video_observation(id, im, timeRecord)

Вот выводит только само изображение, а как сделать, что бы выводило из поля timeRecord текст?

ksa 07.05.2015 14:58

Цитата:

Сообщение от Sn9
Вот выводит только само изображение, а как сделать, что бы выводило из поля timeRecord текст?

По твоему скрипту полагается получать html
Цитата:

Сообщение от Sn9
success: function(html){
                $("#content").html(html);
            }

Вот его и шли...

Sn9 07.05.2015 15:43

Цитата:

Сообщение от ksa (Сообщение 369784)
По твоему скрипту полагается получать html

Вот его и шли...

Я переделал еще удобней, но теперь изображение вообще не шлет

run.php
$sql = "SELECT * FROM $tbl_name"; //выборка всего
        $result = mysql_query($sql) or die(mysql_error());
        while ($rows = mysql_fetch_array($result)):
            echo 'формат изображения в пикселях: '.$rows['formatImage']. '<br>';
            echo 'время снятия изображения: '.$rows['timeRemove']. '<br>';
            echo 'время занесения снимка в базу в миллисекундах: '.$rows['timeRecordMillisec']. '<br>';
            echo 'время занесения снимка в базу в нормальном формате: '.$rows['timeRecord']. '<br><br><br>';
            /*ВОТ ЗДЕСЬ НЕ ЗНАЮ КАК ВЫВЕСТИ ИЗОБРАЖЕНИЕ ИЗ BLOB-поля*/
            ?>
            <? endwhile; ?>

ksa 07.05.2015 15:49

Цитата:

Сообщение от Sn9
ВОТ ЗДЕСЬ НЕ ЗНАЮ КАК ВЫВЕСТИ ИЗОБРАЖЕНИЕ ИЗ BLOB-поля

Я не пхпист... :no: Т.ч. не вкурсе как там хранятся картинки и как их выводить "из полей БД"...

laimas 07.05.2015 16:05

Sn9,
Странные у вас однако запрос - суть вопроса темы, это обновление содержимого на клиенте в случае изменения значения на сервере, а запрос же просто делает выборку всех записей.

Sn9 07.05.2015 17:01

Цитата:

Сообщение от laimas (Сообщение 369807)
Sn9,
Странные у вас однако запрос - суть вопроса темы, это обновление содержимого на клиенте в случае изменения значения на сервере, а запрос же просто делает выборку всех записей.

Просто по мере ответов которые давались уже немного доходить начало.
Теперь просто при изменении картинки в БД всё остальное обновляет, а её - нет. Так что можно сказать что суть вопроса осталась актуальной

laimas 07.05.2015 19:09

header("Content-type: image/*"); - это не заголовок для изображения. При передаче такого заголовка браузер будет предлагать скачать неизвестный тип. Не зная истинного типа изображения, можно указывать тип как image/jpg.

Но у вас Ajax запрос, а не запрос браузера на получение изображения, и нужно получить бинарные данные, и таким образом как это вы делаете не получится. Это более сложный процесс. Но можно поступить проще - возвращать клиенту не $image['im'], base64_encode($image['im']), а на клиенте присваивать это значение src изображения, например:
$('<img src="data:image/jpg;base64,'+im+'" >').appendTo('body');

где im, это и есть возвращенное сервером изображение кодированное в base64.

Но если получать таким образом содержимое изображений, то в
<img src="run.php?id=2" alt="" width="200px"/><br>
на странице логики нет. Как и нет логики держать при таком запросе изображения в базе, перекладывая на плечи SQL работу, которую бы браузер выполнил сам.
Если BLOB данные изображений большие, то base64 это будет почти в три раза больший объем. Может стоит задуматься над тем, если ли необходимость грузить изображения в базу, так ли это критично в вашем случае?

Sn9 07.05.2015 19:24

Цитата:

Сообщение от laimas (Сообщение 369841)
header("Content-type: image/*"); - это не заголовок для изображения. При передаче такого заголовка браузер будет предлагать скачать неизвестный тип. Не зная истинного типа изображения, можно указывать тип как image/jpg.

Но у вас Ajax запрос, а не запрос браузера на получение изображения, и нужно получить бинарные данные, и таким образом как это вы делаете не получится. Это более сложный процесс. Но можно поступить проще - возвращать клиенту не $image['im'], base64_encode($image['im']), а на клиенте присваивать это значение src изображения, например:
$('<img src="data:image/jpg;base64,'+im+'" >').appendTo('body');

где im, это и есть возвращенное сервером изображение кодированное в base64.

Но если получать таким образом содержимое изображений, то в
<img src="run.php?id=2" alt="" width="200px"/><br>
на странице логики нет. Как и нет логики держать при таком запросе изображения в базе, перекладывая на плечи SQL работу, которую бы браузер выполнил сам.
Если BLOB данные изображений большие, то base64 это будет почти в три раза больший объем. Может стоит задуматься над тем, если ли необходимость грузить изображения в базу, так ли это критично в вашем случае?

Спасибо за такой обширный ответ :thanks:
Подскажите тогда как реализовать если, к примеру, изображения будут храниться на сервере? Ведь опять же нужно будет использовать src, который ajax`ом не будет нормально обновлять?

Sn9 07.05.2015 19:38

Цитата:

Сообщение от laimas (Сообщение 369841)
Если BLOB данные изображений большие, то base64 это будет почти в три раза больший объем. Может стоит задуматься над тем, если ли необходимость грузить изображения в базу, так ли это критично в вашем случае?

Ну а если всё таки продолжить извращаться и нагружать сервер, то правильно ли я реализую?
Просто в JS вообще не соображаю, а задача стоит именно LONGBLOB выгружать
<?
        $query = "SELECT * FROM $tbl_name WHERE checked = '1'"; //вывод всех отмеченых камер
        $result = $result = mysql_query($query) or die(mysql_error()); ?>
        <? while ($show = mysql_fetch_array($result)): ?>
                    Камера номер: <?= $show['id'] ?><br>
                    Температура: <?= $show['temperature'] ?> C <br>
                    Источник изображения: <?= $show['host'] ?><br>
                    Формат изображения в пикселях: <?= $show['formatImage'] ?><br>
                    Время снятия изображения: <?= $show['timeRemove'] ?><br>
                    Время занесения снимка в базу в миллисекундах: <?= $show['timeRecordMillisec'] ?><br>
                    Время занесения снимка в базу в нормальном формате: <?= $show['timeRecord'] ?><br>

               <script>
                   $('<img src="data:image/jpg;base64,'+im+'" >').appendTo('body');
               </script>
                
        <? endwhile; ?>

laimas 07.05.2015 21:07

<img src="run.php?id=2" alt="" width="200px"/>
По этому адресу php-скриптом и нужно отдавать содержимое файлов - получать из базы, передавать заголовок, ну и сам собственно вывод. Ajax для этого не нужен.

Даже LONGBLOB, не хило, и для чего?

Sn9 07.05.2015 21:23

Цитата:

Сообщение от laimas (Сообщение 369865)

Даже LONGBLOB, не хило, и для чего?

Ну если в двух словах, то есть сайт, связанный с БД, в котором находятся изображения из шахты(LONGBLOB), время разное(занесения в разных форматах)
Вот на этом сайте должны выводиться изображения без перезагрузки страницы и инфа.
Всё это уже как понятно обновляется в базе данных
Просто изначально была задача написать средствами PHP,CSS
Но как обычно бывает, во время работы новые условия (!обновление информации без перезагрузки!) добавляются, а сроки те же(

laimas 07.05.2015 22:09

Я не спрашиваю о задаче, я спрашиваю зачем файлы хранить в базе, а не в каталоге, причину этого назвать можете? LONGBLOB это 2 в степени 32, это какие же изображения у вас в базе хранятся?

Sn9 07.05.2015 22:18

Цитата:

Сообщение от laimas (Сообщение 369872)
LONGBLOB это 2 в степени 32, это какие же изображения у вас в базе хранятся?

А разве поменяется метод решения в зависимости от BLOB или LONGBLOB?
Такую БД дали с такой и работаю

laimas 07.05.2015 22:56

Размер имеет значение, это же насколько большие изображения, что требуется такой размер поля. Ну накачали вы в базу изображений, ну раздули ее в размерах, и что дальше?

Изображения в базе хранят в том случае, если в этом есть необходимость, например постоянно изменяющиеся. Но чтобы загонять в базу изображения больших размеров, ну так это какие причины для этого нужно иметь, даже и не представляю.

По уму, так выгрузите их из базы в каталоги, и отдавайте их браузеру по прямой ссылке. В базе же можно хранить только признак наличия изображения, комментарии к нему, размеры при необходимости. Имя изображения в каталоге связать и ID записи. Изменение изображения при этом, без перезагрузки страницы, но без изменения имени файла, это подстановка к имени файла случайного числа как параметра запроса, а в случае изменения имени указания нового имени.

И не грузите базу лишним, пользы от этого нет ни какой, кроме дополнительной нагрузки.

Sn9 07.05.2015 23:14

в том то и дело, что постоянно изменяющееся изображения

laimas 08.05.2015 00:01

Какой минимальный размер изображений?

Sn9 08.05.2015 00:11

в зависимости от настроек камеры. пусть будет 1мб.

laimas 08.05.2015 12:23

Это много, если это размер одного, а запрос возвращает несколько (сколько ?) записей, что-то сомнительно, что у такой галереи будут посетители.

Sn9 08.05.2015 13:20

Спасибо, решил уже проблему


Часовой пояс GMT +3, время: 20:43.