вывод последних строк с бд, как на РуТвите

  • Автор темы totje
  • Дата начала
T

totje

Гость
#1
нужно, чтобы в одном из мест страницы происходил вывод последних строк из базы данных. чтобы если проходил пост от одного из юзеров, то все остальные тоже это видели. ну вообще понятно, наверное)
с jquery и с ajax тем более я пока еще на большое ВЫ и собственно, прошу подсказать, с чего начать вообще, а если есть, то урок какой-нибудь..
 
A

AlexanderC

Гость
#2
nu v obshhem snachala php :
PHP:
// db connect
$db = mysql_connect('localhost', 'user', 'password');
if (!$db)
{
die(mysql_error());
}
mysql_select_db('name'); 

$proverka_zaprosa = $_POST["chtoto_tipo_md5"]; // chtob bezopasnee ibo fail otkryt dlkja dostupa

if ( $proverka_zaprosa == "tvoia stroka/paroli idt..." ){
$query_post = mysql_unbuffered_query(" SELECT * FROM table_name ORDER BY column DESC LIMIT 1 ") or die(mysql_error()); //
$array = mysql_fetch_array($query_post);
echo json_encode($array);
}
// javascript ...
Код:
<script>
$().ready(function(){
var str = "chtoto_tipo_md5=chtoto_tipo_md5";

$.ajax({
url: "puti_k_failu.php",
data: str,
type: "POST",
dataType: "json",
async: true, // stoit po umolcjaniju, no ja privyk vkljuchati o_O
success: function( json ){
if ( json == null ){
alert ("libo ne vernaja stroka proverki zaprosa, libo chtoto ne tak s php...ili db, prosmotri logi");
}
else {
var author = json['author']; // esli v db author zapisan kak author
var title = json['title']; // takzhe kak pri avtore, v db takzhe znacitsja...
var text = json['text']; // takzhe
$("#last_here").append("<h1>"+title+" ("+author+")</h1><br/><span>"+text+"</span>"); 
}
}
});
});
</script>
 
T

totje

Гость
#3
AlexanderC
спасибо, выглядит довольно просто и понятно. попробую реализовать в ближайшее время, если будут вопросы или результаты, обязательно отпишусь)
 
T

totje

Гость
#4
а как сделать опрос скриптом сервера на наличие новых строк в бд?
 
A

AlexanderC

Гость
#5
а как сделать опрос скриптом сервера на наличие новых строк в бд?
ну так вот, там есть строки ORDER BY ... DESC LIMIT 1, это дело будет выводить последнюю( одну !!!) запись(в зависимости заданного значения column), можно сделать с помощью нумровс:
PHP:
$query_num = mysql_query(" SELECT * FROM table_name ") or die(mysql_error());
$num = mysql_num_rows($query_num) - 1;
// i dal'she uzhe
$query_post = mysql_unbuffered_query(" SELECT * FROM table_name LIMIT ".$num.", 1 ") or die(mysql_error());
//...
 
T

totje

Гость
#6
не, ну это понятно, все сделал, все прекрасно вставляется в нужном месте, но обновляется ведь только при обновлении страницы.
я посмотрел код спрашивай.ру, например, там реализовано нечто подобное:
Код:
function refreshLive()
{
//var curtime = '1296228136';
var block = '';
$.ajax({
type: "POST",
url: '/live/load/',
data: 'curtime=' + $('#curtime').val() + '&type=' + 'questions&limit=4',
dataType: "json",
success: function(data) {

if(data.status == 'ok')
{
$('#curtime').val(data.curdate);
for(i = 0; i < data.live.length; ++i)
{
block = '<div id="live-block-'+data.live[i].id+'" class="live-block" style="display: none; width: 730px; background: #f5f4de;"><div id="live-avatar"><a href="/'+data.live[i].username+'" style="border: 0;"><img src="'+data.live[i].photo+'" class="ava40" width="60" height="60" /></a></div>';

if(data.live[i].type == 's')
{		
block += '<div id="live-arrow-s" style="top: 13px;"><img src="/media/images/ui/live_arr_s.png?1" /> </div><div id="live-status">'+data.live[i].status+'</div><div class="ago" style="float: left; margin-left: 75px;">'+data.live[i].added+'</div>';
}else if(data.live[i].type == 'q')
{
block += '<div id="live-arrow-q"><img src="/media/images/ui/live_arr_q.png" /> </div><div id="live-question" style="width: 610px;"><div class="question">'+data.live[i].question+'</div><div>'+data.live[i].answer+'</div></div><div class="ago" style="float: left; margin-left: 75px;">'+data.live[i].added+'</div>';
}else if(data.live[i].type == 'p')
{
$('#live-photo-block-' + data.live[i].username).remove();
block += data.live[i].html + '<div class="ago" style="float: left; margin-left: 75px;">'+data.live[i].added+'</div>';
}else if(data.live[i].type == 'cp')
{
block += data.live[i].html + '<div class="ago" style="float: left; margin-left: 75px;">'+data.live[i].added+'</div>';
}

block += '</div>';
$('#live').prepend(block);
$('#live-block-'+data.live[i].id).css('display', 'block');
$('#live-block-'+data.live[i].id).animate({ backgroundColor: "#ffffff" }, 1500);
//curtime = data.live[i].curdate;
$('#live div.live-block:last-child').remove();
}
}else if(data.status == 'nochanges') $('#curtime') = data.curdate;

}
});
setTimeout('refreshLive()', 6000);
}

$('document').ready(function(){
setTimeout('refreshLive()', 5000);
});
чтобы этот блок, выводимый через аякс, сам обновлялся каждые несколько секунд, достаточно setTimeout ?
ну если да, то тут все просто очень и тогда другой вопрос - как реализовать обновление этого блока именно по мере поступления N-го кол-ва новых записей?
 
A

AlexanderC

Гость
#7
sdelat' mozhno hitrost'ju ))) , kogda postupaet zapis' v bd v tablicu(bd) zapisyvaetsja nekij "counter" kotoryj inkremntiruetsja s postupleniem zapisej... Dal'she delo tehniki: Tem zhe javascript(ajax) (na etot raz nuzhno setInterval) otpravljajutsja zaprosy serveru- kotoryj schityvaet "counter" iz bazy, i esli "counter" raven nuzhnomu chislu server otpravljaet "signal" klientu, i javascript zapuskaet drugoj ajax zapros(funktiju) na obnovlenie zapisi...
 
T

totje

Гость
#8
ну это на десерт оставлю)
а пока чет понять не могу, как вывести более одной строки, 5 например. в запросе лимит 5 поставил, но выводит только последнюю все равно..
 
T

totje

Гость
#10
это тут непричем, в таком случае просто выводится одна та строка_скакой_начиная
 
T

totje

Гость
#12
да такой же, как предложил Александр вобщем-то
PHP:
 $query_post = mysql_unbuffered_query("SELECT `pole1`,`pole2` FROM `table`WHERE `pole3` = 1 ORDER BY `pole2` DESC LIMIT 5 ") or die(mysql_error()); //
$array = mysql_fetch_assoc($query_post);
echo json_encode($array);
и сам скрипт
Код:
 $().ready(function(test){
var str = "chtoto_tipo_md5=chtoto_tipo_md5";

$.ajax({
url: "test.php",
data: str, 
type: "POST",
dataType: "json",
async: false, 
success: function( json ){			
if ( json == null ){
alert ("error");
}
else {
var raz= json['pole1']; 
var dva= json['pole2']; 

row = '<div><a href="/'+raz+'"><img src="'+dva+'" /></a></div>';						 
$('#lefthere').prepend(row);						  
$('#lefthere div:last-child').remove();

}
}
});

});
 

vital

Больной Компом Детектед
29.01.2006
2 432
40
codeby.net
#13
я же вам написал про лимит
а у вас..

SELECT `pole1`,`pole2` FROM `table`WHERE `pole3` = 1 ORDER BY `pole2` DESC LIMIT 5
сделайте так
SELECT `pole1`,`pole2` FROM `table`WHERE `pole3` = 1 ORDER BY `pole2` DESC LIMIT ОТКУДА_НАЧАТЬ,10 (сколько взять)
 
T

totje

Гость
#14
я же вам написал про лимит
а у вас..

SELECT `pole1`,`pole2` FROM `table`WHERE `pole3` = 1 ORDER BY `pole2` DESC LIMIT 5
сделайте так
SELECT `pole1`,`pole2` FROM `table`WHERE `pole3` = 1 ORDER BY `pole2` DESC LIMIT ОТКУДА_НАЧАТЬ,10 (сколько взять)
да я же говорил, что уже пробовал все так дотошно указывать, и все равно скрипту передается одна строка. если указать это самое ОТКУДА_НАЧАТЬ, то только она и выводится, если не указывать, то последняя из таблицы..
 

vital

Больной Компом Детектед
29.01.2006
2 432
40
codeby.net
#15
1. Лимиту указывайте 2 параметра. Обязательно в вашем случае. иначе не будет пагинации.
2. Прочитайте любую книжку по пхп и исправьте это
$query_post = mysql_unbuffered_query("SELECT `pole1`,`pole2` FROM `table`WHERE `pole3` = 1 ORDER BY `pole2` DESC LIMIT 5 ") or die(mysql_error()); //
$array = mysql_fetch_assoc($query_post);
echo json_encode($array);
на что-то в таком духе

PHP:
$query_post = mysql_query("SELECT `pole1`,`pole2` FROM `table`WHERE `pole3` = 1 ORDER BY `pole2` DESC LIMIT 5 ") or die(mysql_error()); //
$result_array=array();
while ( $array = mysql_fetch_assoc($query_post))
{
array_push($result_array,$array);
}
echo json_encode($result_array);
И да, нафига анбафферед квери?
В вашем случае вы не память сэкономите(10 строк запроса, ага), а только гемморой себе создаете. Используйте обычный квери.
 
T

totje

Гость
#17
вот пишут, что с этим jsonом все так просто, а я, практически ничего не смыслящий в яваскрипте и этих делах, попробывал сделать все через XML и все строки нормально выводятся.
Код:
 $().ready(function(qrefresh){
var req;

if (window.XMLHttpRequest) req = new XMLHttpRequest();
else if (window.ActiveXObject) {
try {
req = new ActiveXObject('Msxml2.XMLHTTP');
} catch (e){}
try {
req = new ActiveXObject('Microsoft.XMLHTTP');
} catch (e){}
}

if (req) {
req.onreadystatechange = function() {
if (req.readyState == 4 && req.status == 200) { $('#lefthere').prepend(req.responseText); }
};
req.open("POST", test.php', true);
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
req.send('param=1&ajax=1');
}
else alert("nea");
});
и не надо ничего мудрить с массивами в обработчике, просто можно организовать вывод в цикле
да и вообще мне как-то понятней этот способ, а именно то, как реализована проверка)

если возможно таким же образом выводить инфу через JSON, поделитесь, пожалуйста:)