Апостроф в вызове автозаполнения JQuery - PullRequest
4 голосов
/ 26 октября 2011

Приведенный ниже код работает при поиске любого имени, не содержащего апострофа. Когда вы пытаетесь найти кого-то с апострофом в имени, это не удается (возвращает ошибку). Как я могу позволить найти людей с апострофами?

function autoComplete() {
$(document).ready(function () {
    $(".AutoCompleteClass").autocomplete({
        source: function (request, response) {
            $.ajax({
                url: "/Service/NomineeWebService.asmx/GetMatchingActiveDirectoryUsers",
                data: "{ 'SearchCharacters': '" + request.term + "' }",
                dataType: "json",
                type: "POST",
                contentType: "application/json; charset=utf-8",
                dataFilter: function (data) { return data; },
                success: function (data) {
                    response($.map(data.d, function (item) {
                        return {
                            id: item.NomineeUserName,
                            value: item.NomineeLastNameFirstName + " - " + item.NomineeDomainAndUserName,
                            data: item
                        }
                    }))
                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                    alert(textStatus);
                }
            });
        },            
        delay: 150,
        minLength: 3,            
        select: function (event, ui) {
            $('.SelectedUserNameWrapper input[type=hidden]').val(ui.item.id);
        }       
    });
});
$('#AutoCompleteTextBox').keypress(function (event) {
    if (event.which == '13') {
        alert('test');
        $('#AutoCompleteButton').click();
    }

Ответы [ 3 ]

7 голосов
/ 22 ноября 2011

Я нашел решение этой проблемы, мы должны заменить все "" "на escape-символы.Код выглядит как ниже

    function autoComplete() {
$(document).ready(function () {
    $(".AutoCompleteClass").autocomplete({
        source: function (request, response) {
request.term = request.term.replace(/'/gi,"\\'"); // replace globally
4 голосов
/ 26 октября 2011

Кажется вероятным, что одинарные кавычки (в ваших входных данных) должны быть экранированы перед использованием для запроса к базе данных. Попробуйте заменить часть данных вашего вызова AJAX на что-то вроде этого:

data: "{ 'SearchCharacters': '" + request.term.replace("'", "''")  + "' }",

Мой синтаксис jQuery может быть немного неправильным, но, надеюсь, это передает то, что я пытаюсь сказать.

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

Примечание: Дополнительная одиночная кавычка - это "escape-символ" для одинарных кавычек в mySQL и SQL Server. Вы не упомянули, какую СУБД вы используете, поэтому она может отличаться для вас.

Обязательный: Возможно, вы это знаете, но, надеюсь, вы не объединяете это значение "request.term" с SQL-запросом на стороне сервера. Это сделало бы вас уязвимыми для SQL-инъекции =)

2 голосов
/ 26 октября 2011

Довольно странно, но в итоге я заменил это так:используя апостроф: SearchCharacters = SearchCharacters.Replace ("% 27", "'");и передать это в мой вызов базы данных.

Это работает.Это что-то из плагина автозаполнения или jquery.Так как это работает, я буду использовать его и двигаться дальше.

Спасибо за все предложения.Кстати, у меня не получилось сбежать ...

Еще раз спасибо ...

...