За последние 24 часа нас посетили 59739 программистов и 1763 робота. Сейчас ищут 878 программистов ...

Проверка на дубли без перезагрузки

Тема в разделе "JavaScript и AJAX", создана пользователем naive, 24 июн 2010.

  1. naive

    naive Активный пользователь

    С нами с:
    24 июн 2010
    Сообщения:
    7
    Симпатии:
    0
    Тема банальна, но для меня нова... Пытаюсь сделать проверку логина на дубли, без перезагрузки страницы.
    js-код таков:

    [js]<script type="text/javascript">

    function checker(log)
    {

    var xmlhttp;
    try {
    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
    try {
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (E) {
    xmlhttp = false;
    }
    }
    if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
    xmlhttp = new XMLHttpRequest();
    }


    xmlhttp.onreadystatechange = function()
    {
    if (xmlhttp.readyState == 4)
    {
    if (xmlhttp.status == 200)
    {
    var reply=xmlhttp.responseText;
    document.getElementbyid("nck").value=reply;
    };
    };
    };

    xmlhttp.open('GET', 'check.php?login='+log, true);
    xmlhttp.send(null);

    }
    </script>
    [/js]

    эта функция висит на обработчике onblur текстовой строке в html'е, вызывается как onblur="checker(this.value)"

    php-скрипт таков:
    PHP:
    1. <?
    2. mysql_connect("localhost", "abc", "cba") or die("Error connect!");
    3.  
    4.  
    5. $sql = "SELECT count(*) FROM users WHERE log='".$_GET['log']."'";
    6.  
    7. $query = mysql_query($sql);
    8.  
    9. $res = mysql_fetch_array($query);
    10.  
    11. if ($res[0] == 0)
    12. {
    13.     return 'OK';
    14. }
    15. else
    16. {
    17.     return 'Error';
    18. };
    19.  
    в результате, нет никакого ответа от серверного скрипта. если поставить алерт в куске проверки readystate == 4, то он выдаёт, что status 0, алерт на responsetext выдаёт просто текст php-скрипта. не понимаю, в чём ошибка.
     
  2. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    а если return echo 'OK'; ? можно даже просто echo 'OK'; у вас же не функция, чтобы передавать управление
     
  3. naive

    naive Активный пользователь

    С нами с:
    24 июн 2010
    Сообщения:
    7
    Симпатии:
    0
    без толку
    мне ещё непонятно, почему ответ от сервера приходит (readystate 4), а вот status 200 не наступает
     
  4. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    обязательно со своим XMLHttpRequest делать, может подключит jquery например? если к php скрипту на прямую передать логин то нормально все? обычно во всех примерах сначала делают open потом onreadystatechange определяют
     
  5. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Поставь HTTP live header и посмотри, что отсылает AJAX.
     
  6. naive

    naive Активный пользователь

    С нами с:
    24 июн 2010
    Сообщения:
    7
    Симпатии:
    0
    Похоже на то, что js ничего не отсылает.
    Да, нужен свой XMLHttpRequest. Лучше один раз самому сделать и потом пользоваться обёртками с большей степенью понимания.
    Если open ставить вперёд, то тоже самое. Да и, в общем-то, мы же просто вешаем функцию на событие готовности, так что без разницы, где открыть соединение, мне кажется.
     
  7. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Попробуй заменить:
    [js]# var xmlhttp;
    # try {
    # xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    # } catch (e) {
    # try {
    # xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    # } catch (E) {
    # xmlhttp = false;
    # }
    # }
    # if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
    # xmlhttp = new XMLHttpRequest();
    # } [/js]
    На:
    [js]
    var xmlhttp= (window.XMLHttpRequest) ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
    [/js]
     
  8. naive

    naive Активный пользователь

    С нами с:
    24 июн 2010
    Сообщения:
    7
    Симпатии:
    0
    бесполезно(
     
  9. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Похоже или точно не отсылает? LiveHTTPheader, Firebug ничего не говорят? Может в php-скрипте ошибка?
     
  10. naive

    naive Активный пользователь

    С нами с:
    24 июн 2010
    Сообщения:
    7
    Симпатии:
    0
    Не отсылает, потому что при переходе фокуса с элемента, в который пишется логин, плагин ничего не выдаёт. php-скрипт работает точно, он протестен на заданных в нём значениях.
     
  11. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Я запутался. А JS вообще срабатывает? Может onchange поставить?
     
  12. naive

    naive Активный пользователь

    С нами с:
    24 июн 2010
    Сообщения:
    7
    Симпатии:
    0
    Срабатывает. если поставить алерт на выведение параметра функции - содержимое текстового поля с логином, то выдаётся значение.
     
  13. naive

    naive Активный пользователь

    С нами с:
    24 июн 2010
    Сообщения:
    7
    Симпатии:
    0
    в общем, проблема именно в том, что js не отсылает get-запрос. потестил ещё одним перехватчиком http-пакетов. но в чём ошибка в скрипте, не могу понять. браузеру никаких запрещений, конечно, нет.
     
  14. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    [js]<script type="text/javascript">
    function Check(log)
    {
    var xmlhttp;
    try {
    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
    try {
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (E) {
    xmlhttp = false;
    }
    }
    if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
    xmlhttp = new XMLHttpRequest();
    }


    xmlhttp.open('GET', "check.php?login="+log, true);
    xmlhttp.onreadystatechange = function(){
    if ((xmlhttp.readyState == 4) && (xmlhttp.status == 200)){
    document.getElementById("nck").value=xmlhttp.responseText;
    }
    };
    xmlhttp.send(null);
    }
    </script>[/js]