html: HTML: <td class="td_left_red" valign="top"> <div id="indicator"></div> php: PHP: <?php if (isset($_POST['name'])) { $name = $_POST['name']; $name = stripslashes($name); $name = htmlspecialchars($name); $name = trim($name); if ($name == '') { unset($name); } else { if(!preg_match("/^[а-яА-Я]+$/",$name)) { $html = '<div>Только русские символы!</div>'; echo $html; } else { $sql9 = "UPDATE users SET name='$name' WHERE id='$id'"; $result9 = mysql_query($sql9, $db)or die("Ошибка в запросе: " . mysql_error()); if (!$result9) { echo "ошибка - ".mysql_error()."<br>"; echo $sql9; exit(); } else { $_SESSION['name'] = $name; } } } } ?> Квери: [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] Замысел такой: Я ввожу в поле инпут цифры,то выскакивает сообщение:"только русские буквы" и отключается кнопка! А если я русскими буквами-то ваще ничего не происходит.Не работает ничего(((Подтолкните с горы,что бы в цель попал...
HTML: <script type="text/javascript"> function checkInput() { if(!/^[а-яА-Я]*$/.test(document.getElementById('myinput').value)) alert('Неправильный ввод'); } </script> <input type="text" name="name" id="myinput" onkeyup="javascript:checkInput()" /> Вот простой пример на JS. Разберись как работает, исправь под свои нужды. На всякий случай напомню, что наличие проверок на JS не отменяет обязательность проверок на сервере.
sobachnik а-яА-Я сомнительный реджекс нужно вводить в виде \001В диапазоны символов + не забыть букву Ё которая вне диапазона.
Интересно...а почему нельзя организовать проверку по средствам php и яваскрипт!?Или так как Вы указали более рационально-меньше кода!?
Именно так лучше и делать - сперва проверка на JS, потом повторная проверка всего на PHP. JS можно просто отключить или сгенерировать поддельный запрос, по этому без повторной проверки на PHP не обойтись.
Сделал так: PHP: <?php if (isset($_POST['name'])) { $name = $_POST['name']; $name = stripslashes($name); $name = htmlspecialchars($name); $name = trim($name); if ($name == '') { unset($name); } else { if(strlen($name) > 20 or strlen($name) < 6) { $html = "<div>Не менее 6 и не более 20 символов</div>"; echo $html; } else { if(!preg_match("/^[А-Яа-я]+$/",$name)) { $html = '<div>Только русские символы!</div>'; echo $html; } else { $sql9 = "UPDATE users SET name='$name' WHERE id='$id'"; $result9 = mysql_query($sql9, $db)or die("Ошибка в запросе: " . mysql_error()); if (!$result9) { echo "ошибка - ".mysql_error()."<br>"; echo $sql9; exit(); } else { $_SESSION['name'] = $name; } } } } } ?> И: [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] У меня не зависимо от того ввожу я цифры или буквы-сразу высвечивается,что можно только русские буквы вводить... Помогите разобраться в причине...заранее спасибо!
А мне кажется, что скрипт, в котором это: if(!preg_match("/^[А-Яа-я]+$/",$name)) сохранён не в той кодировке, в которой в него поступают данные...
Решил убрать: PHP: else { $sql9 = "UPDATE users SET name='$name' WHERE id='$id'"; $result9 = mysql_query($sql9, $db)or die("Ошибка в запросе: " . mysql_error()); if (!$result9) { echo "ошибка - ".mysql_error()."<br>"; echo $sql9; exit(); } else { $_SESSION['name'] = $name; } } так как делаю эту замену через php,к которому обращается форма,т.е. получилось: PHP: <?php if (isset($_POST['name'])) { $name = $_POST['name']; $name = stripslashes($name); $name = htmlspecialchars($name); $name = trim($name); if ($name == '') { unset($name); } else { if(strlen($name) > 20 or strlen($name) < 6) { $html = "<div>Не менее 6 и не более 20 символов</div>"; echo $html; } else { if(!preg_match("/^[А-Яа-я]+$/",$name)) { $html = '<div>Только русские символы!</div>'; echo $html; } } } } ?> после чего сколько бы символов я не ввёл выводится,что предупреждение о ненадлежащем кол-ве символов! П.С.Ваш совет не помог к сожалению...(((
sobachnik - МЕГА-МОЗГ!!!Млин! Через notepad проверил-написано кодировать в ANSI на всех файлах... Я так понимаю,что ajax работает только в utf-8?Или не обязательно? Как быть подскажите...!?!?!?
Не зависимо от того, в какой кодировке сама страница - хоть Windows-1251, хоть KOI какой-нибудь, JavaScript будет отправлять Ajax-запросы на сервер в кодировке UTF-8... Panich Если тебе нужно, чтобы PHP обязательно работал в кодировке Windows-1251 (ANSI), то конвертируй кодировку данных, получаемых от JS из UTF-8 в Windows-1251. В твоём примере - как-то примерно так: PHP: <?php // ... $name = $_POST['name']; $name = stripslashes($name); $name = htmlspecialchars($name); $name = trim($name); $name = iconv('UTF-8', 'Windows-1251', $name); // ... ?>
У меня мазила-как сделать подскажите-буду знать! Совсем забыл про этот способ,хотя недавно совсем использовал. Всё исправил как Вы подсказали-спасибо,только вот проблема-как только начинаю вводить символы в поле-сразу выдаёт сообщение,что можно ввести от 6 до 20 символов!!А ещё если я убираю данные из поля,то сообщение об ошибке не исчезает,а остаётся висеть на экране хотя теперь поле ввода имени пустое...попробовал выводить name сразу после ввода данных и от выдаёт много окошек(где должны быть сообщения об ошибках) с введёнными данными примерно по три символа-и у них аналогичная ситуация,что если стираешь данные в поле,то всё отсаётся!!!Что делать прикажете в этой ситуации!? Подсказали,что вся причина в keyup-попробовал использовать blur,но проблему не решило-те же проблемы,только когда поле теряет фокус...((( На что исправить-как правильнее будет? П.С.Чувствую близок к ПОБЕДЕ!!!)))
А зачем ты вообще эту проверку делаешь средствами PHP с использованием AJAX? Всё же запросто решается на одном JS... Регулярки есть в JavaScript, аналог strlen - тоже есть...
Я хочу так сделать,что бы разобраться на простом и потом для поля 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] Но теперь не могу организовать исчезновение ошибки,когда всё правильно или пустое поле...
Да я тут пробовал на днях-три дня копался и тут постил,но у меня вообще перестало всё корректно отображаться-больше за это браться нет особого желания.А времени не много,но хочу всё доскональна понять,что бы потом в секунды решать проблемы!
Не знаю, как там у тебя свёрстано, но суть примерно такая - рядом с инпутом добавь пустой div и задай ему атрибут id. Когда нужно что-то вывести рядом с этим инпутом - записывай это в div (на JS это innerHTML). Когда нужно убрать всё рядом с тем инпутом - записывай в div, например, пустую строку. На стороне сервера - там тоже лишнего много в твоём примере. Достаточно такого: PHP: <?php $name = isset($_POST['name']) ? trim($_POST['name']) : ''; $name = iconv('UTF-8', 'Windows-1251', $name); $html = ''; if(!preg_match('/^[А-Яа-яЁё]{6,20}$/', $name)) $html = '<div>Используйте только от 6-ти до 20-ти символов русского алфавита!</div>'; echo($html); ?>
Вот как реализовал опираясь на ваши подсказки: PHP: <?php if (isset($_POST['name'])) { $name = $_POST['name']; $name = stripslashes($name); $name = htmlspecialchars($name); $name = $name ? trim($name) : ''; $name = iconv('UTF-8', 'Windows-1251', $name); $html = ''; if(!preg_match('/^[А-Яа-яЁё]{2,20}$/', $name)) { $html = '<div>Используйте только от 2-х до 20-ти символов русского алфавита!</div>'; echo($html); } else { $html = ''; echo($html); } } ?> И: //тут беру значение,что в поле по умолчанию. [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] Естественно опять ошибка появляется,после ввода правильного значения не исчезает. Помогите поправить...
вот что я использую на js. передаём id элемента, который проверяем и тип проверки. 1 - на число, остальное - для мыла. на этом примере можно многое сделать.
Panich, stripslashes и htmlspecialchars конкретно в данном примере - бессмысленны. Регулярка /^[а-яА-ЯёЁ]{2,20}$/ и так не допустит никаких спецсимволов, кроме букв русского алфавита. Соответственно, сбрасывать слэши (stripslashes) - незачем, потому как никаких спец.символов, которые могут быть экранированы слэшами - нет (буквы русского алфавита не экранируются). И никаких спец.символов HTML - тоже нет, так как буквы русского алфавита также не являются спец.символами HTML. И ещё: По поводу stripslashes: использовать эту функцию имеет смысл вместе с проверкой, включена ли директива magic_quotes, поскольку если она выключена, то никаких автоматических слэшей - не будет и сбрасывать их не нужно. А использование stripslashes в этом случае может сбросить нужные слэши: например некий пользователь писал комментарий и в тексте написал \' - ну вот понадобилось ему зачем-то такое написать в своём комменте - и он удивиться, куда же пропал его слэш. В коде это может выглядеть примерно так: PHP: <?php // ... if(get_magic_quotes_gpc()) $name = stripslashes($name); // ... ?> По поводу htmlspecialchars: использовать эту функцию имеет смысл при выводе данных из б.д. на страницу. При составлении запроса - нужно использовать либо mysql_real_escape_string(), либо mysqli_real_escape_string, либо PDO::quote (в зависимости от используемой библиотеки для работы с б.д.). В базе данных лучше хранить пользовательский ввод "как есть" - что написал пользователь - то и записывать, заэкранировав спец.символы одной из вышеперечисленных функций. А спец.символы HTML преобразовывать в "сущности" уже при выводе, т.е. при генерации HTML-страниц. Это, конечно, не является обязательным, но обычно делают так. Кроме того, htmlspecialchars ничего не делает с одинарными кавычками по-умолчанию, а это означает, что возможна SQL-инъекция. Т.е. если ты при составлении запроса используешь только htmlspecialchars, то хотя бы уж передавай ей в качестве второго параметра константу ENT_QUOTES, чтобы она преобразовывала в HTML-сущности одинарные кавычки. Это тоже, в общем-то, лишнее. Достаточно просто на 4-й строчке твоего кода написать PHP: <?php // ... $name = trim($_POST['name']);
Код (Text): /* Проверка поля на коректность вводимых данных */ function check_input(type,id) { /* регулярное выражение для проверки на число */ var cmp_int_string = /^([0-9_])+$/i; /* регулярное выражение для проверки валидности e-mail'a */ var cmp_str_string = /^([a-z0-9_\-]+\.)*[a-z0-9_\-]+@([a-z0-9][a-z0-9\-]*[a-z0-9]\.)+[a-z]{2,4}$/i; if (type == 1) { /* если тип проверки = 1, то берём регулярку для числа */ var cmpstring = cmp_int_string; } else { /* в противном случае берём регулярку для проверки мыла */ var cmpstring = cmp_str_string; } /* получаем значение поля ввода по айдишнику переданному в функцию */ var chkstring = $('#' + id).val(); /* если полученное значение поля ввода не проходит проверку */ if (cmpstring.test(chkstring) === false) { /* меняем стиль поля ввода на обозначающий ошибку ( у меня был красноватый бэкграунд и рамка ) */ $('#' + id).attr('class','definput_err'); } else { /* когда всё хорошо введено - меняем стиль поля ввода на обычный */ $('#' + id).attr('class','definput'); } } имеем: Код (Text): <input class="definput" type="text" name="a" size="10" id="inpid" onKeyUp="javascript:check_input(1,'inpid');"> эта проверка чисто на стороне клиента, но ни в коем случае не доверяйте только её все проверки, такие очень легко обходятся. это лишь для удобства обычного пользователя, чтобы он заполнил форму корректно с первого раза, а не прыгал по страницам туда сюда, пока всё корректно не заполнит.
Извиняюсь,что долго не отвечал(в командировку гонял на выходные) выкладываю своё решение: Код (Text): $('#name_red').val(); if(nameVal ==''){ $(this).val($(this).attr('defaultValue')); } else { $.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(); }); } }); } }); $('#name_red').focus(function(){ $('#indicator').fadeOut(1000); if($(this).val() == $(this).attr('defaultValue')) { $(this).val(''); } }); Только вот пара проблем возникла: 1. Вопрос как можно разблокировать кнопку-какая команда в квери для этого существует? 2. Сообщение об ошибке исчезает как и должно быть,да вот только из-за того,что всё равно по условию выводится html,то появляется пустая рамка под сообщение под ошибку-как избавиться?Вот я думаю-может там можно сделать проверку типа:если html='',то удалить <div>,а если нет,то высветить-но как это реализовать!?