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

Тема в разделе "Web 2.0, AJAX, Ruby, RSS технологии", создана пользователем totje, 8 янв 2011.

  1. totje

    totje Гость

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

    AlexanderC Гость

    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 ...
    Код (Text):
    <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>
     
  3. totje

    totje Гость

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

    totje Гость

    а как сделать опрос скриптом сервера на наличие новых строк в бд?
     
  5. AlexanderC

    AlexanderC Гость

    ну так вот, там есть строки 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());
    //...
     
  6. totje

    totje Гость

    не, ну это понятно, все сделал, все прекрасно вставляется в нужном месте, но обновляется ведь только при обновлении страницы.
    я посмотрел код спрашивай.ру, например, там реализовано нечто подобное:
    Код (Text):
    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-го кол-ва новых записей?
     
  7. AlexanderC

    AlexanderC Гость

    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...
     
  8. totje

    totje Гость

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

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.468
    Симпатии:
    27
    LIMIT Скакой_начиная, сколько_вывести
     
  10. totje

    totje Гость

    это тут непричем, в таком случае просто выводится одна та строка_скакой_начиная
     
  11. vital

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.468
    Симпатии:
    27
    код в студию.
     
  12. totje

    totje Гость

    да такой же, как предложил Александр вобщем-то
    Код (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);
    и сам скрипт
    Код (Text):
     $().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();

    }
    }
    });

    });
     
  13. vital

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.468
    Симпатии:
    27
    я же вам написал про лимит
    а у вас..

    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 (сколько взять)
     
  14. totje

    totje Гость

    да я же говорил, что уже пробовал все так дотошно указывать, и все равно скрипту передается одна строка. если указать это самое ОТКУДА_НАЧАТЬ, то только она и выводится, если не указывать, то последняя из таблицы..
     
  15. vital

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.468
    Симпатии:
    27
    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 строк запроса, ага), а только гемморой себе создаете. Используйте обычный квери.
     
  16. totje

    totje Гость

    исправил, и на выходе теперь undefined..
     
  17. totje

    totje Гость

    вот пишут, что с этим jsonом все так просто, а я, практически ничего не смыслящий в яваскрипте и этих делах, попробывал сделать все через XML и все строки нормально выводятся.
    Код (Text):
     $().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, поделитесь, пожалуйста:)
     
Загрузка...

Поделиться этой страницей