За последние 24 часа нас посетили 20458 программистов и 1648 роботов. Сейчас ищут 1072 программиста ...

Валидация

Тема в разделе "JavaScript и AJAX", создана пользователем Panich, 29 дек 2011.

  1. Panich

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

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    html:
    HTML:
    1. <td class="td_left_red" valign="top">
    2. <div id="indicator"></div>
    php:
    PHP:
    1. <?php
    2. if (isset($_POST['name']))
    3. {
    4. $name = $_POST['name'];
    5. $name = stripslashes($name);
    6. $name = htmlspecialchars($name);
    7. $name = trim($name);  
    8.    if ($name == '')
    9.    {
    10.    unset($name);
    11.    }
    12.    else
    13.    {
    14.       if(!preg_match("/^[а-яА-Я]+$/",$name))
    15.       {
    16.       $html = '<div>Только русские символы!</div>';
    17.       echo $html;
    18.       }
    19.       else
    20.       {
    21.       $sql9 = "UPDATE users SET name='$name' WHERE id='$id'";
    22.       $result9 = mysql_query($sql9, $db)or die("Ошибка в запросе: " . mysql_error());
    23.          if (!$result9)
    24.          {
    25.          echo "ошибка - ".mysql_error()."<br>";
    26.          echo $sql9;
    27.          exit();
    28.          }
    29.          else
    30.          {
    31.          $_SESSION['name'] = $name;
    32.          }
    33.       }
    34.    }
    35. }
    36. ?>
    Квери:
    [js]val = $('#name_red').val();
    $.ajax({
    type: "POST",
    url: "php.php",
    data: "name="+val,
    success: function(html){
    if (html(html)=true)//тут косяк,но как реализовать?
    {
    $("#indicator").html(html);
    $('.btn_modal').click(function(e) {
    e.preventDefault();
    });
    }
    }
    });
    });[/js]
    Замысел такой:
    Я ввожу в поле инпут цифры,то выскакивает сообщение:"только русские буквы" и отключается кнопка!
    А если я русскими буквами-то ваще ничего не происходит.Не работает ничего(((Подтолкните с горы,что бы в цель попал...
     
  2. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    HTML:
    1. <script type="text/javascript">
    2.     function checkInput() {
    3.         if(!/^[а-яА-Я]*$/.test(document.getElementById('myinput').value))
    4.             alert('Неправильный ввод');
    5.     }
    6. <input type="text" name="name" id="myinput" onkeyup="javascript:checkInput()" />
    Вот простой пример на JS. Разберись как работает, исправь под свои нужды. На всякий случай напомню, что наличие проверок на JS не отменяет обязательность проверок на сервере.
     
  3. Михаил

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

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    sobachnik
    а-яА-Я сомнительный реджекс нужно вводить в виде \001В диапазоны символов + не забыть букву Ё которая вне диапазона.
     
  4. Panich

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

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    Интересно...а почему нельзя организовать проверку по средствам php и яваскрипт!?Или так как Вы указали более рационально-меньше кода!?
     
  5. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Именно так лучше и делать - сперва проверка на JS, потом повторная проверка всего на PHP.
    JS можно просто отключить или сгенерировать поддельный запрос, по этому без повторной проверки на PHP не обойтись.
     
  6. Panich

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

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    Сделал так:
    PHP:
    1. <?php
    2. if (isset($_POST['name']))
    3. {
    4. $name = $_POST['name'];
    5. $name = stripslashes($name);
    6. $name = htmlspecialchars($name);
    7. $name = trim($name);  
    8.    if ($name == '')
    9.    {
    10.    unset($name);
    11.    }
    12.    else
    13.    {
    14.        if(strlen($name) > 20 or strlen($name) < 6)
    15.        {
    16.        $html = "<div>Не менее 6 и не более 20 символов</div>";
    17.        echo $html;
    18.        }
    19.        else
    20.        {
    21.           if(!preg_match("/^[А-Яа-я]+$/",$name))
    22.           {
    23.           $html = '<div>Только русские символы!</div>';
    24.           echo $html;
    25.           }
    26.           else
    27.           {
    28.           $sql9 = "UPDATE users SET name='$name' WHERE id='$id'";
    29.           $result9 = mysql_query($sql9, $db)or die("Ошибка в запросе: " . mysql_error());
    30.              if (!$result9)
    31.              {
    32.              echo "ошибка - ".mysql_error()."<br>";
    33.              echo $sql9;
    34.              exit();
    35.              }
    36.              else
    37.              {
    38.              $_SESSION['name'] = $name;
    39.              }
    40.           }
    41.        }
    42.    }
    43. }
    44. ?>
    И:
    [js]$('#name_red').keyup(function () {
    nameval = $('#name_red').val();
    $.ajax({
    type: "POST",
    url: "php.php",
    data: "name="+nameval,
    success: function(html){
    $("<div id='indicator'></div>").insertAfter('#name_red').html(html);
    $('.btn_modal').click(function(e) {
    e.preventDefault();
    });
    }
    });
    });[/js]
    У меня не зависимо от того ввожу я цифры или буквы-сразу высвечивается,что можно только русские буквы вводить...
    Помогите разобраться в причине...заранее спасибо!
     
  7. Михаил

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

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    думаю нужно preg_match("/^([А-Яа-я])+$/",$name)
     
  8. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    А мне кажется, что скрипт, в котором это:
    if(!preg_match("/^[А-Яа-я]+$/",$name))

    сохранён не в той кодировке, в которой в него поступают данные...
     
  9. Panich

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

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    Решил убрать:
    PHP:
    1. else
    2.            {
    3.            $sql9 = "UPDATE users SET name='$name' WHERE id='$id'";
    4.            $result9 = mysql_query($sql9, $db)or die("Ошибка в запросе: " . mysql_error());
    5.              if (!$result9)
    6.              {
    7.              echo "ошибка - ".mysql_error()."<br>";
    8.              echo $sql9;
    9.              exit();
    10.              }
    11.              else
    12.              {
    13.              $_SESSION['name'] = $name;
    14.              }
    15.            }
    так как делаю эту замену через php,к которому обращается форма,т.е. получилось:
    PHP:
    1.  <?php
    2.  if (isset($_POST['name']))
    3.  {
    4.  $name = $_POST['name'];
    5.  $name = stripslashes($name);
    6.  $name = htmlspecialchars($name);
    7.  $name = trim($name);
    8.    if ($name == '')
    9.    {
    10.    unset($name);
    11.    }
    12.    else
    13.    {
    14.        if(strlen($name) > 20 or strlen($name) < 6)
    15.        {
    16.        $html = "<div>Не менее 6 и не более 20 символов</div>";
    17.        echo $html;
    18.        }
    19.        else
    20.        {
    21.            if(!preg_match("/^[А-Яа-я]+$/",$name))
    22.            {
    23.            $html = '<div>Только русские символы!</div>';
    24.            echo $html;
    25.            }
    26.        }
    27.    }
    28.  }
    29.  ?>
    после чего сколько бы символов я не ввёл выводится,что предупреждение о ненадлежащем кол-ве символов!
    П.С.Ваш совет не помог к сожалению...(((
     
  10. Panich

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

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    sobachnik - МЕГА-МОЗГ!!!Млин!

    Через notepad проверил-написано кодировать в ANSI на всех файлах...

    Я так понимаю,что ajax работает только в utf-8?Или не обязательно?
    Как быть подскажите...!?!?!?
     
  11. Михаил

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

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    а слабо в браузере посмотреть кодировку отсылаемую и присылаемую?
     
  12. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Не зависимо от того, в какой кодировке сама страница - хоть Windows-1251, хоть KOI какой-нибудь, JavaScript будет отправлять Ajax-запросы на сервер в кодировке UTF-8...

    Panich
    Если тебе нужно, чтобы PHP обязательно работал в кодировке Windows-1251 (ANSI), то конвертируй кодировку данных, получаемых от JS из UTF-8 в Windows-1251. В твоём примере - как-то примерно так:

    PHP:
    1. <?php
    2. // ...
    3. $name = $_POST['name'];
    4. $name = stripslashes($name);
    5. $name = htmlspecialchars($name);
    6. $name = trim($name);
    7. $name = iconv('UTF-8', 'Windows-1251', $name);
    8. // ...
    9. ?>
     
  13. Panich

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

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    У меня мазила-как сделать подскажите-буду знать!

    Совсем забыл про этот способ,хотя недавно совсем использовал.
    Всё исправил как Вы подсказали-спасибо,только вот проблема-как только начинаю вводить символы в поле-сразу выдаёт сообщение,что можно ввести от 6 до 20 символов!!А ещё если я убираю данные из поля,то сообщение об ошибке не исчезает,а остаётся висеть на экране хотя теперь поле ввода имени пустое...попробовал выводить name сразу после ввода данных и от выдаёт много окошек(где должны быть сообщения об ошибках) с введёнными данными примерно по три символа-и у них аналогичная ситуация,что если стираешь данные в поле,то всё отсаётся!!!Что делать прикажете в этой ситуации!?

    Подсказали,что вся причина в keyup-попробовал использовать blur,но проблему не решило-те же проблемы,только когда поле теряет фокус...(((
    На что исправить-как правильнее будет?
    П.С.Чувствую близок к ПОБЕДЕ!!!)))
     
  14. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    А зачем ты вообще эту проверку делаешь средствами PHP с использованием AJAX? Всё же запросто решается на одном JS... Регулярки есть в JavaScript, аналог strlen - тоже есть...
     
  15. Panich

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

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    Я хочу так сделать,что бы разобраться на простом и потом для поля mail вытаскивать из базы значения и сравнивать его с введённым,или с паролями поиграть...тут если добьюсь результата,то смогу более сложные проверки организовать...
    Мне тут помогли и вот,что получилось:
    [js]$('#name_red').blur(function () {
    nameval = $('#name_red').val();
    $.ajax({
    type: "POST",
    url: "php.php",
    data: "name="+nameval,
    success: function(html){
    $("<div id='indicator'></div>").insertAfter('#name_red').html(html);
    $('.btn_modal').click(function(e) {
    e.preventDefault();
    });
    if($('#name_red').val() == '')
    {
    $("<div id='indicator'></div>").hide(1000);
    }
    }
    });
    });[/js]
    Но теперь не могу организовать исчезновение ошибки,когда всё правильно или пустое поле...
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    переводи все на utf-8 раз есть время для игр =)
     
  17. Panich

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

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    Да я тут пробовал на днях-три дня копался и тут постил,но у меня вообще перестало всё корректно отображаться-больше за это браться нет особого желания.А времени не много,но хочу всё доскональна понять,что бы потом в секунды решать проблемы!
     
  18. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Не знаю, как там у тебя свёрстано, но суть примерно такая - рядом с инпутом добавь пустой div и задай ему атрибут id. Когда нужно что-то вывести рядом с этим инпутом - записывай это в div (на JS это innerHTML). Когда нужно убрать всё рядом с тем инпутом - записывай в div, например, пустую строку.

    На стороне сервера - там тоже лишнего много в твоём примере. Достаточно такого:

    PHP:
    1. <?php
    2. $name = isset($_POST['name']) ? trim($_POST['name']) : '';
    3. $name = iconv('UTF-8', 'Windows-1251', $name);
    4. $html = '';
    5. if(!preg_match('/^[А-Яа-яЁё]{6,20}$/', $name))
    6.     $html = '<div>Используйте только от 6-ти до 20-ти символов русского алфавита!</div>';
    7. echo($html);
    8. ?>
     
  19. Panich

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

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    Вот как реализовал опираясь на ваши подсказки:
    PHP:
    1. <?php
    2. if (isset($_POST['name']))
    3. {
    4. $name = $_POST['name'];
    5. $name = stripslashes($name);
    6. $name = htmlspecialchars($name);
    7. $name = $name ? trim($name) : '';
    8. $name = iconv('UTF-8', 'Windows-1251', $name);
    9. $html = '';
    10.    if(!preg_match('/^[А-Яа-яЁё]{2,20}$/', $name))
    11.    {
    12.    $html = '<div>Используйте только от 2-х до 20-ти символов русского алфавита!</div>';
    13.    echo($html);
    14.    }
    15.    else
    16.    {
    17.    $html = '';
    18.    echo($html);
    19.    }
    20. }
    21. ?>
    22.  
    И:
    //тут беру значение,что в поле по умолчанию.
    [js]var oneName = $('#name_red').val();
    $('#name_red').blur(function () {
    nameval = $('#name_red').val();
    $.ajax({
    type: "POST",
    url: "php.php",
    data: "name="+nameval,
    success: function(html){
    //здесь проверяю постое поле или оно идентично значению по умолчанию и убираю подсказку
    if($('#name_red').val() == '' || $('#name_red').val() == 'oneName')
    {
    $("<div id='indicator'></div>").hide(1000);
    }
    else
    {
    //иначе вывожу ошибку,если она есть в php файле
    $("<div id='indicator'></div>").insertAfter('#name_red').html(html);
    $('.btn_modal').click(function(e){
    e.preventDefault();
    });
    }
    }
    });
    });[/js]

    Естественно опять ошибка появляется,после ввода правильного значения не исчезает.
    Помогите поправить...
     
  20. Denis.Y

    Denis.Y Активный пользователь

    С нами с:
    8 авг 2011
    Сообщения:
    145
    Симпатии:
    0
    Адрес:
    Россия, Самарская область
    вот что я использую на js.
    передаём id элемента, который проверяем и тип проверки. 1 - на число, остальное - для мыла.
    на этом примере можно многое сделать.

     
  21. Panich

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

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    А я в Вашем коде не понимаю многое-книжных знаний не хватает...если не затруднит закоментить...
     
  22. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Panich,
    stripslashes и htmlspecialchars конкретно в данном примере - бессмысленны. Регулярка /^[а-яА-ЯёЁ]{2,20}$/ и так не допустит никаких спецсимволов, кроме букв русского алфавита. Соответственно, сбрасывать слэши (stripslashes) - незачем, потому как никаких спец.символов, которые могут быть экранированы слэшами - нет (буквы русского алфавита не экранируются). И никаких спец.символов HTML - тоже нет, так как буквы русского алфавита также не являются спец.символами HTML. И ещё:

    По поводу stripslashes: использовать эту функцию имеет смысл вместе с проверкой, включена ли директива magic_quotes, поскольку если она выключена, то никаких автоматических слэшей - не будет и сбрасывать их не нужно. А использование stripslashes в этом случае может сбросить нужные слэши: например некий пользователь писал комментарий и в тексте написал \' - ну вот понадобилось ему зачем-то такое написать в своём комменте - и он удивиться, куда же пропал его слэш. В коде это может выглядеть примерно так:

    PHP:
    1. <?php
    2. // ...
    3.     $name = stripslashes($name);
    4. // ...
    5. ?>
    По поводу htmlspecialchars: использовать эту функцию имеет смысл при выводе данных из б.д. на страницу. При составлении запроса - нужно использовать либо mysql_real_escape_string(), либо mysqli_real_escape_string, либо PDO::quote (в зависимости от используемой библиотеки для работы с б.д.). В базе данных лучше хранить пользовательский ввод "как есть" - что написал пользователь - то и записывать, заэкранировав спец.символы одной из вышеперечисленных функций. А спец.символы HTML преобразовывать в "сущности" уже при выводе, т.е. при генерации HTML-страниц. Это, конечно, не является обязательным, но обычно делают так. Кроме того, htmlspecialchars ничего не делает с одинарными кавычками по-умолчанию, а это означает, что возможна SQL-инъекция. Т.е. если ты при составлении запроса используешь только htmlspecialchars, то хотя бы уж передавай ей в качестве второго параметра константу ENT_QUOTES, чтобы она преобразовывала в HTML-сущности одинарные кавычки.

    Это тоже, в общем-то, лишнее. Достаточно просто на 4-й строчке твоего кода написать
    PHP:
    1. <?php
    2. // ...
    3. $name = trim($_POST['name']);
     
  23. Denis.Y

    Denis.Y Активный пользователь

    С нами с:
    8 авг 2011
    Сообщения:
    145
    Симпатии:
    0
    Адрес:
    Россия, Самарская область
    Код (Text):
    1.  
    2. /* Проверка поля на коректность вводимых данных */
    3. function check_input(type,id)
    4. {
    5.    /* регулярное выражение для проверки на число */
    6.    var cmp_int_string = /^([0-9_])+$/i;
    7.    /* регулярное выражение для проверки валидности e-mail'a */
    8.    var cmp_str_string = /^([a-z0-9_\-]+\.)*[a-z0-9_\-]+@([a-z0-9][a-z0-9\-]*[a-z0-9]\.)+[a-z]{2,4}$/i;
    9.  
    10.    if (type == 1)
    11.    {
    12.       /* если тип проверки = 1, то берём регулярку для числа */
    13.       var cmpstring = cmp_int_string;
    14.    }
    15.    else
    16.    {
    17.       /* в противном случае берём регулярку для проверки мыла */
    18.       var cmpstring = cmp_str_string;
    19.    }
    20.  
    21.    /* получаем значение поля ввода по айдишнику переданному в функцию */  
    22.    var chkstring = $('#' + id).val();
    23.  
    24.    /* если полученное значение поля ввода не проходит проверку */      
    25.    if (cmpstring.test(chkstring) === false)
    26.    {
    27.       /* меняем стиль поля ввода на обозначающий ошибку ( у меня был красноватый бэкграунд и рамка ) */
    28.       $('#' + id).attr('class','definput_err');
    29.    }
    30.    else
    31.    {
    32.       /* когда всё хорошо введено - меняем стиль поля ввода на обычный */
    33.       $('#' + id).attr('class','definput');
    34.    }
    35. }
    имеем:

    Код (Text):
    1. <input class="definput" type="text" name="a" size="10" id="inpid" onKeyUp="javascript:check_input(1,'inpid');">
    эта проверка чисто на стороне клиента, но ни в коем случае не доверяйте только её все проверки, такие очень легко обходятся. это лишь для удобства обычного пользователя, чтобы он заполнил форму корректно с первого раза, а не прыгал по страницам туда сюда, пока всё корректно не заполнит.
     
  24. Panich

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

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    Извиняюсь,что долго не отвечал(в командировку гонял на выходные) выкладываю своё решение:
    Код (Text):
    1. $('#name_red').val();
    2.     if(nameVal ==''){
    3.     $(this).val($(this).attr('defaultValue'));
    4.     }
    5.     else
    6.     {
    7.     $.ajax({
    8.     type: "POST",
    9.     url: "php.php",
    10.     data: "name="+nameVal,
    11.         success: function(html){
    12.         $("<div id='indicator'></div>").insertAfter('#name_red').html(html);
    13.         $('.btn_modal').click(function(e){
    14.         e.preventDefault();
    15.         });
    16.         }
    17.     });
    18.     }
    19. });
    20. $('#name_red').focus(function(){
    21.     $('#indicator').fadeOut(1000);                       
    22.     if($(this).val() == $(this).attr('defaultValue'))
    23.     {
    24.     $(this).val('');
    25.     }
    26. });
    Только вот пара проблем возникла:
    1. Вопрос как можно разблокировать кнопку-какая команда в квери для этого существует?
    2. Сообщение об ошибке исчезает как и должно быть,да вот только из-за того,что всё равно по условию выводится html,то появляется пустая рамка под сообщение под ошибку-как избавиться?Вот я думаю-может там можно сделать проверку типа:если html='',то удалить <div>,а если нет,то высветить-но как это реализовать!?
     
  25. Denis.Y

    Denis.Y Активный пользователь

    С нами с:
    8 авг 2011
    Сообщения:
    145
    Симпатии:
    0
    Адрес:
    Россия, Самарская область
    1. .removeAttr()
    2. .css() .attr() и оные, display:none; по условию.