Обновление без перезагрузки при изменении данных в поле БД
Собственно тема содержит весь вопрос
Есть БД images(id, img, time) Вопрос состоит в том как обновить блок div на странице при изменении в БД поля time Просто очень плохо знаю AJAX Нагуглил, что нужно пользоваться Long-Polling, но как это делать не смог разобраться |
Цитата:
http://habrahabr.ru/post/128535/ |
на это натыкался, но статья просто как на php написать этот метод. Про БД ничего не сказано. Да и про обновление без перезагрузки
|
Цитата:
|
Sn9,
по сути можно обойтись и без Long-Polling в том понимании как он есть. Например как можно организовать чат на странице - это посылать запросы с клиента и, если есть новости получать их. Если клиент получая страницу имеет время Т для ID записи, то запросы клиента, это проверять время Т на сервере, и если оно не равно Т, то обновить информацию в DIV. |
Цитата:
Цитата:
|
Я поковырялся и сделал, но криво
Файл со скриптом <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 текст? |
Цитата:
Цитата:
|
Цитата:
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; ?> |
Цитата:
|
Sn9,
Странные у вас однако запрос - суть вопроса темы, это обновление содержимого на клиенте в случае изменения значения на сервере, а запрос же просто делает выборку всех записей. |
Цитата:
Теперь просто при изменении картинки в БД всё остальное обновляет, а её - нет. Так что можно сказать что суть вопроса осталась актуальной |
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 это будет почти в три раза больший объем. Может стоит задуматься над тем, если ли необходимость грузить изображения в базу, так ли это критично в вашем случае? |
Цитата:
Подскажите тогда как реализовать если, к примеру, изображения будут храниться на сервере? Ведь опять же нужно будет использовать src, который ajax`ом не будет нормально обновлять? |
Цитата:
Просто в 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; ?> |
<img src="run.php?id=2" alt="" width="200px"/>
По этому адресу php-скриптом и нужно отдавать содержимое файлов - получать из базы, передавать заголовок, ну и сам собственно вывод. Ajax для этого не нужен. Даже LONGBLOB, не хило, и для чего? |
Цитата:
Вот на этом сайте должны выводиться изображения без перезагрузки страницы и инфа. Всё это уже как понятно обновляется в базе данных Просто изначально была задача написать средствами PHP,CSS Но как обычно бывает, во время работы новые условия (!обновление информации без перезагрузки!) добавляются, а сроки те же( |
Я не спрашиваю о задаче, я спрашиваю зачем файлы хранить в базе, а не в каталоге, причину этого назвать можете? LONGBLOB это 2 в степени 32, это какие же изображения у вас в базе хранятся?
|
Цитата:
Такую БД дали с такой и работаю |
Размер имеет значение, это же насколько большие изображения, что требуется такой размер поля. Ну накачали вы в базу изображений, ну раздули ее в размерах, и что дальше?
Изображения в базе хранят в том случае, если в этом есть необходимость, например постоянно изменяющиеся. Но чтобы загонять в базу изображения больших размеров, ну так это какие причины для этого нужно иметь, даже и не представляю. По уму, так выгрузите их из базы в каталоги, и отдавайте их браузеру по прямой ссылке. В базе же можно хранить только признак наличия изображения, комментарии к нему, размеры при необходимости. Имя изображения в каталоге связать и ID записи. Изменение изображения при этом, без перезагрузки страницы, но без изменения имени файла, это подстановка к имени файла случайного числа как параметра запроса, а в случае изменения имени указания нового имени. И не грузите базу лишним, пользы от этого нет ни какой, кроме дополнительной нагрузки. |
в том то и дело, что постоянно изменяющееся изображения
|
Какой минимальный размер изображений?
|
в зависимости от настроек камеры. пусть будет 1мб.
|
Это много, если это размер одного, а запрос возвращает несколько (сколько ?) записей, что-то сомнительно, что у такой галереи будут посетители.
|
Спасибо, решил уже проблему
|
Часовой пояс GMT +3, время: 20:43. |