2013-08-29 3 views
1

Я собираю данные формы, отправляя их скрипту проверки PHP через вызов AJAX. Проблема связана с специальными символами, скрипт проверки подлинности php работает не так, как ожидалось.Передача специальных символов на PHP через AJAX

HTML:

<input type="text" name="firstName" class="firstName" 
     placeholder="[first name]" required autofocus maxlength="25" size="25" /> 

JS:

$(".button").click(function() { 
    var firstName = encodeURIComponent($("input.firstName").val()); 
    var datastring = "firstName=" + firstName; 

    $.ajax({ 
     type: "POST", 
     url: "/scripts/validateSignup.php", 
     data: datastring, 
     cache: false, 
     success: function (errorMessage) { 
      //print to screen 
     } 
    }); 
}); 

PHP Validation

$postData = $_POST; 

if (Filter::validateString($postData['firstName']) == false) { 
    echo "Oops! Some characters used in your first name are not valid."; 
} 

PHP Filter

//Returns true if string is good, false otherwise 
public static function validateString($string) { 
    $string = trim($string); 

    if ($string == null || $string == "") { 
     return false; 
    } else { 
     if (preg_match("/[^\.\,\-\_\'\"\@\?\!\:\;\$\#\%\&\+\= a-zA-Z0-9()]/", $string) == true) { 
      return false; 
     } else { 
      return true; 
     } 
    } 
} 

На пустой строке он печатает ошибку на экран просто отлично. Но если я делаю что-то вроде ~ ~! @ # $%^& *() ", то он принимает строку как хорошую и не бросает и не ошибается, хотя результат preg_match == false.

+1

[docs] (http://php.net/manual/en/function.preg-match.php): _preg_match() возвращает 1, если шаблон соответствует данному предмету, 0, если это не так, или FALSE, если возникла ошибка._ вы пытались сравнить значение '! = 0' вместо? – davidkonrad

+0

@davidkonrad: полезно знать, но все же не ожидаемый результат. Я уверен, что validateString возвращает false, но условие if isn t acceptign it ... – TimNguyenBSM

+0

Из документа pregmatch Эта функция может возвращать Boolean FALSE, но также может возвращать небулево значение, которое оценивает как FALSE. Пожалуйста, прочитайте раздел о Booleans для получения дополнительной информации. Используйте оператор === для проверки возвращаемого значения этой функции. Попробуйте использовать === вместо == –

ответ

0
$string = trim($string); 

if ($string == null || $string == "") { 
    return false; 
} else { 
    if (preg_match("/[^\.,\-_'\"@?!:;\$#&\+=\sa-zA-Z0-9\(\)]/", $string) == true) { 
     return false; 
    } else { 
     return true; 
    } 
} 

Это больше действует регулярное выражение, но не результат, который вы хотите: вы проверяете для почти всех входных данных, так что это будет соответствовать «ABCD» и вернуться ложным, а также. Есть 11 символов со специальными значениями в регулярных выражениях, только те, и "должны быть экранированы:.^$ []() | * + -

0

Попробуйте это: -

<?php 
$string = "tes$%tname"; // invalid string 
//$string = "testname"; // valid string 

if(test($string) == false) 
{ 
    echo "String is invalid"; 
} 


function test($string){ 
    $string = trim($string); 

    if ($string == null || $string == "") { 
     return false; 
    } else { 
     if (preg_match("/[^\.,\-_'\"@?!:;\$#&\+=\sa-zA-Z0-9\(\)]/",$string) == true) { 
      return false; 
     } else { 
      return true; 
     } 
    } 
} 

?> 

PHPFiddle здесь : - http://phpfiddle.org/main/code/cdu-xg2