Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Валидация работает, но форма отправляется. (https://javascript.ru/forum/jquery/54673-validaciya-rabotaet-no-forma-otpravlyaetsya.html)

Влад_имир 27.03.2015 10:52

Валидация работает, но форма отправляется.
 
Всем здравствуйте.
Как отменить отправку формы , если валидация не пройдена? У меня форма отсылается в любом случае.
Ниже часть индексного файла
<link rel="stylesheet" type="text/css" href="style.css" />
    <script type="text/javascript" src="js/jquery-1.5.2.min.js"></script>
    <script type="text/javascript" src="js/jquery.validate.min.js"></script>
	<script type="text/javascript" src="js/myscripts.js"></script> 
	<script src="http://jqueryvalidation.org/files/dist/additional-methods.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
    $("#formdata").on("click",function () { //это обработчик нажатия кнопки ОТПРАВИТЬ
       $("#formdata").validate();
        var data = $(this).serialize(); 
        $.ajax({// инициализируем ajax запрос
            type: 'POST', // отправляем в POST формате
            url: 'obrabot.php', // путь до обработчика, у нас он лежит в той же папке
			data: data, // данные для отправки
			cache: false,
			target: '#p1', 
            success: function (data) { 
			if (data ){
				alert ("OKyjyuj");
				$("#p1").text(data);
					}
					else
					{
						alert("no ok");			
					}
						
					}  	
           
			
        });
		return false;
	});
});

</script>


</head>
<body>
<div style="display: flex;">
<p>Введите чило: </p>
<form id="formdata"  method="POST" action='obrabot.php' style="margin: 16px;">

   <input name='int' type='int'  />  <br /><br /><br />
  
<input type='submit' name='Submit' id="submitsend" value='Отправить'  />
 </form>
<p id="p1"></p>

</body>
</html>

Использую jQuery Validation Plugin
Ниже файл myscript.js с правилами и сообщениями
$(document).ready(function(){
	jQuery.validator.addMethod(
    'regexp',
    function(value, element, regexp) {
        var re = new RegExp(regexp);
        return this.optional(element) || re.test(value);
    },
    ""
);
   

    $("#formdata").validate({
	
	rules: {
            int: {
                required: true,
                minlength: 4,
                maxlength: 4,
		number : true,
		regexp: '^[1-9]{1}[0-9]*$'
            }

        },
        messages:{
            int:{
                required: "поле не заполнено или заполнено не верно",
                minlength: "в поле должно быть минимум 4 символа",
                maxlength: "В поле должно быть максимум 4 символа",
		number : "В поле должны быть только цифры",
		regexp: "Число не должно начинаться на ноль!!"
			    
            }
        }
       

    });

});


С английским туго )).

рони 27.03.2015 11:21

Влад_имир,
$("#formdata").validate({submitHandler : тут ваш ajax должен быть

http://jqueryvalidation.org/validate

Влад_имир 27.03.2015 11:24

Решил , надо было $("#formdata").validate(); сразу после $(document).ready(function(){
вставить.

рони 27.03.2015 11:25

Влад_имир,
строки 8 и 9 в первом коде лишние

Влад_имир 27.03.2015 11:47

а без submitHandler не обойтись?

Влад_имир 27.03.2015 11:49

Цитата:

Сообщение от рони (Сообщение 363525)
Влад_имир,
строки 8 и 9 в первом коде лишние

удалил, работает )) только на странице обработчике остается, но и после моих манипуляций там же останавливается.

Влад_имир 27.03.2015 11:53

ниже часть файла- обработчика
<? 
require 'function.php';
header("Content-type: text/plain; charset=utf-8");
/* header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false); */
$errors = array();
$str='';
$a=3456;

/* $zifra=0; */
if (isset($_POST['int'])) {$str = $_POST['int'];}
if (isset($_POST['int'])) {$zifra =(int) $_POST['int'];}

/* echo "Переменная \$zifra имеет тип - ". (gettype($zifra)). "<br/>"; */
if ($zifra <= 1000)
{
	$errors[] = "Нельзя вводить число начинающееся с нуля!!";
	 /* echo "Нельзя вводить число начинающееся с нуля!!"; */
} 

$arr1 = str_split($str);
print_r ($arr1);

$length_arr1=count($arr1);
print_r($lenght_arr1);

$result = array_unique($arr1);

$length_result=count($result);
/* print_r($result);
print_r($length_result); */
if ($length_result<$length_arr1)
{
	$errors[] = "Нельзя вводить повторяющиеся цифры!!";
	/* echo "Нельзя вводить повторяющиеся цифры!!"; */
}

 if(isset($errors)){

     
         foreach($errors as $msg){
            echo $msg;
         }
     
   return false;
 }

не пойму почему print_r($lenght_arr1); null? print_r($length_result); - работает

рони 27.03.2015 11:56

Влад_имир,
ждите php специалистов

Влад_имир 27.03.2015 11:58

Цитата:

Сообщение от рони (Сообщение 363531)
Влад_имир,
ждите php специалистов

они здесь бывают?

Влад_имир 27.03.2015 12:05

если в браузере http://localhost:63342/as/index.php то останавливается на странице обработчика,зато валидация работает на клиенте.
а если http://as/ то без перезагрузки и форма все равно отправляется. В чем прикол РОНИ?

рони 27.03.2015 12:46

Влад_имир,
поиск по форуму validate может на какие мысли натолкнёт и если вы отправили данные с помощью ajax почему страница должна перезагрузится (если всё правильно и submit самой формы отменён)

laimas 27.03.2015 13:13

echo "Переменная \$zifra имеет тип - ". (gettype($zifra)). "<br/>"; */
if ($zifra <= 1000)
{
    $errors[] = "Нельзя вводить число начинающееся с нуля!!";
     /* echo "Нельзя вводить число начинающееся с нуля!!"; */
}


Влад_имир, зачем так проверять? Что вообще ожидается?

Влад_имир 27.03.2015 13:33

Цитата:

Сообщение от laimas (Сообщение 363544)
echo "Переменная \$zifra имеет тип - ". (gettype($zifra)). "<br/>"; */
if ($zifra <= 1000)
{
    $errors[] = "Нельзя вводить число начинающееся с нуля!!";
     /* echo "Нельзя вводить число начинающееся с нуля!!"; */
}


Влад_имир, зачем так проверять? Что вообще ожидается?

Серверная валидация. Вариантов масса , это пока не интересует. Этот код можно вообще выкинуть

laimas 27.03.2015 13:39

Ну если не интересует, а это ведь полнейшая профанация, тогда вопросов нет.

Влад_имир 27.03.2015 21:29

Цитата:

Сообщение от laimas (Сообщение 363551)
Ну если не интересует, а это ведь полнейшая профанация, тогда вопросов нет.

Здесь проверка на ввод 4 -х значного числа, которое не должно начинаться на ноль. Ниже еще проверка, чтобы цифры не повторялись, на jquery validation эту проверку не сделать, поэтому делаю на пхп. А цифра не ноль, просто начинал когда , не хотел связываться с регулярками.

laimas 27.03.2015 22:21

>Здесь проверка на ввод 4 -х значного числа, которое не должно начинаться на ноль.

То есть $zifra <= 1000 означает, что число начинается на 0? У вас ведь далее именно эта ошибка и выводится. Так вы ведь вообще не проверяется что это, действительно ли цифра, ибо gettype($zifra) определенно вернет вам string, хотя пользователь введет цифры, так как все что не пришло в полях формы, это строки. А значит надо:

if($num = (int)$_POST['key']) {
    //$num это integer и не равно 0
} else //не соответствует услвоию


У вас диалог с сервером асинхронный, а так как в любом случае сервер обязан проверять данные извне, то на клиенте эту проверку можно и не делать. Для современных браузеров можно добавить новые возможности формы, которые и будут делать проверку, а старые браузеры идут лесом, сервер проверит все равно. И как раз на сервер нужно грамотный иметь скрипт и удобный тип данных для обмена с клиентом. А на клиентской стороне продумать отображение сообщений.

laimas 27.03.2015 23:09

Ну вроде может быть, а вот на самом деле там бог весь что написано.

print_r() - в удобном виде просмотреть структуру массива, вы же используете его для вывода количества элементов массива.

Ошибки помещаете в массив, но вместо того чтобы передать их массивом клиенту, для их отображения или сразу оформить их для клиента (implode с тегами), выплевываете их в цикле по одной.

К чему return false вообще не понять.

Влад_имир 27.03.2015 23:14

Цитата:

Сообщение от laimas (Сообщение 363634)
>Здесь проверка на ввод 4 -х значного числа, которое не должно начинаться на ноль.

То есть $zifra <= 1000 означает, что число начинается на 0? У вас ведь далее именно эта ошибка и выводится. Так вы ведь вообще не проверяется что это, действительно ли цифра, ибо gettype($zifra) определенно вернет вам string, хотя пользователь введет цифры, так как все что не пришло в полях формы, это строки. А значит надо:

if($num = (int)$_POST['key']) {
    //$num это integer и не равно 0
} else //не соответствует услвоию


У вас диалог с сервером асинхронный, а так как в любом случае сервер обязан проверять данные извне, то на клиенте эту проверку можно и не делать. Для современных браузеров можно добавить новые возможности формы, которые и будут делать проверку, а старые браузеры идут лесом, сервер проверит все равно. И как раз на сервер нужно грамотный иметь скрипт и удобный тип данных для обмена с клиентом. А на клиентской стороне продумать отображение сообщений.

Integer - это число из множества ℤ = {..., -2, -1, 0, 1, 2, ...}.
https://php.net/manual/ru/language.types.integer.php я от этого плясал. а максимальное 4-хзначное число с нулем в первом знаке -0999

laimas 27.03.2015 23:21

А что вам мешает добавить проверку еще и на меньше нуля, если важны только положительные? А если для базы, и определить полю только положительные значение, так ли страшно это будет? А еще проще взять абсолютное значение if($num = abs((int)$_POST['key'])) ....

Влад_имир 27.03.2015 23:25

У меня проверка на 4 знака есть.

Влад_имир 27.03.2015 23:28

laimas , Вы лучше подскажите вот по этому вопросу #7 (permalink)

laimas 27.03.2015 23:40

Так я вам о вашем РНР коде и говорю, тот что в посте #7 - ни к черту не годится. Ну вы же пишите на РНР, следовательно должны понимать, что к примеру, неудачное представление данных породит неэффективный код их обработки, неудачный html-код отображающий эти данные, а значит и на клиенте для его обработки придется делать лишние телодвижения.

У вас ну совсем простая задача, но она не продумана на сервере, а значит и на клиенте не понять что будет и что надо. Ну представьте задачу визуально, определитесь с тем что потребуется, нужно ли там и там проверять, или же определиться с приоритетами...
Вот тогда появится и логика, и не будет лишнего.

А я высказал свое мнение по #7, а как вы будете делать, это уже не мне решать.

Влад_имир 27.03.2015 23:44

спасибо

guestalex 15.10.2015 01:53

А у меня наоборот не отправляется форма... валидация работает, а форма ни гу-гу... фигня какая-то.... Может кто поможет?


Часовой пояс GMT +3, время: 11:03.