我的jQuery和PHP在同一个东西上给出了不同的结果?

时间:2010-06-03 20:07:18

标签: php javascript jquery strlen

恼人的大脑麻木问题。

我有两个函数来检查字符串的长度(主要是,js一个截断)继承Javascript中的一个:

$('textarea#itemdescription').keyup(function() {
    var charLength = $(this).val().length;
    // Displays count
    $('span#charCount').css({'color':'#666'});
    $('span#charCount').html(255 - charLength);

    if($(this).val().length >= 240){
        $('span#charCount').css({'color':'#FF0000'});
    }
    // Alerts when 250 characters is reached
    if($(this).val().length >= 255){
        $('span#charCount').css({'color':'#FF0000'});
        $('span#charCount').html('<strong>0</strong>');

        var text = $('textarea#itemdescription').val().substring(0,255)
        $('textarea#itemdescription').val(text);
    }
});

这是我的PHP要仔细检查:

if(strlen($_POST["description"])>255){
    echo "Description must be less than ".strlen($_POST["description"])." characters";
    exit();
}   

我正在使用jQuery Ajax发布textarea中的值。但是我的php验证说strlen()比我的js实际上要长。所以例如,如果我输入一个实心字符串,它会说0或3个字符留到255.然后我点击保存,php给我的长度为261。

有什么想法吗?

是否与特殊字符有关,js读取的位大小不同或未命中?或者是否与其他事情有关?今天也许病了!...:P

更新 我添加了var_dump($_POST['description']) 看看传递了什么,它正在返回逃逸斜线,例如这是怎么回事?我试过添加stripslashes();无济于事......他们来自哪里?

更新2 - 解决了问题

基本上我认为我刚刚意识到我的服务器已启用魔术报价... grr 所以我现在处理之前已经删除了斜线。有点烦人,但它必须要做!!

感谢您的帮助!

谢谢, 斯特凡

5 个答案:

答案 0 :(得分:4)

调试此问题的最简单方法是使用PHP脚本,方法是: var_dump($_POST['description']

我建议您在浏览器中使用查看源查看任何转义码,特殊字符代码等...

答案 1 :(得分:1)

如果您发布了更多的前端代码,尤其是在您进行实际POST的情况下,这将有所帮助。那就是说,你确定每次调用keyup吗?如果用户只是将文本粘贴到框中,您确认它仍然被调用吗?

另请注意,JavaScript不足以保证字符串小于给定长度。用户可以禁用JavaScript,精明的“用户”可以发送超过255个字符的POST请求。

答案 2 :(得分:1)

我怀疑使用javascript验证时忽略的几个字符是换行符(你说你使用的是textarea)。

答案 3 :(得分:1)

我看到可能导致问题的两件事。

  • 首先substring(0,255)返回256个字符
  • 其次magic_quotes可能在php.ini中打开,PHP尝试为您提供转义字符串,但不会一直正确

修改

doh没有重新读取子字符串定义,忽略第一个,但magic_quotes可能会检查一个

答案 4 :(得分:1)

如果使用UTF-8编码,PHP strlen()会计算字节数,而不是字符数。如果你有任何非ASCII,这将发生。使用mb_strlen()。魔术引号也可以添加几个字符。