Мой jQuery и PHP дают разные результаты по одному и тому же вопросу?


Раздражающая проблема с отупением мозга.

У меня есть две функции для проверки длины строки (в первую очередь, 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 для публикации значений из текстовой области. Однако моя проверка php говорит, что strlen() длиннее, чем, по сути, говорит мой js. Так, например, если я введу сплошную строку, и в ней будет указано 0 или 3 символа, оставшихся до 255. Затем я нажимаю Сохранить и php дает мне длину 261.

Есть идеи?

Связано ли это со специальными символами, размерами битов, которые js читает по-другому или пропускает? Или это связано с чем-то другим? Может быть, сегодня он болен!... : P

Обновление: Я добавил var_dump($_POST['description']) , чтобы посмотреть, что было передано, и это возвращало косые черты, например, что происходит? Я пытался добавить полосатые косые черты(); безрезультатно... откуда они берутся?

ОБНОВЛЕНИЕ 2 - ПРОБЛЕМА РЕШЕНО:

В принципе, я думаю, что только что понял, что на моем сервере включены волшебные кавычки... grr Поэтому я удалил косые черты перед обработкой сейчас. Немного раздражает, но это придется сделать!!

Спасибо за вашу помощь!

Спасибо, Стефан

Author: gevorg, 2010-06-04

5 answers

Самый простой способ отладить это просто из вашего PHP-скрипта, используя: var_dump($_POST['description']

Я предлагаю вам также использовать просмотр исходного кода в вашем браузере, чтобы увидеть любой escape-код, специальные коды символов и т. Д.

 4
Author: loginx, 2010-06-03 20:14:19

Было бы полезно, если бы вы опубликовали больше своего внешнего кода, особенно там, где вы делаете фактическую публикацию. Тем не менее, вы уверены, что этот ключ вызывается каждый раз? Если пользователь просто вставляет текст в поле, вы подтвердили, что он все еще называется?

Также имейте в виду, что JavaScript недостаточно хорош, чтобы гарантировать, что строка будет меньше заданной длины. Пользователь может отключить JavaScript, а опытный "пользователь" может отправить свой собственный запрос на публикацию с более чем 255 символами.

 1
Author: Justin Ethier, 2010-06-03 20:12:48

Я подозреваю, что несколько символов являются разрывами строк (вы говорите, что используете текстовую область), которые игнорируются при проверке с помощью javascript.

 1
Author: a1ex07, 2010-06-03 20:12:50

Я вижу 2 вещи, которые могут быть причиной вашей проблемы.

  • во-первых, substring(0,255) возвращает 256 символов
  • во-вторых, magic_quotes может быть включен в php.ini, PHP пытается выдать вам экранированные строки, но не всегда делает это правильно

редактировать

Doh не перечитывал определение подстроки, игнорируйте первое, но magic_quotes может быть проверено, что одно

 1
Author: Geek Num 88, 2010-06-03 20:38:56

Если вы используете кодировку UTF-8, PHP strlen() считает байты, а не символы. Если у вас есть что-то, не относящееся к ASCII, это произойдет. Используйте mb_strlen(). Волшебные кавычки также могут добавить несколько символов.

 1
Author: ZZ Coder, 2010-06-03 20:48:23