Создание оператора SQLite в JS, и я не получаю полную команду, которую хочу

Итак, я создаю оператор SQLite в JS. Проблема в том, что кажется, что %" превращается в "undefined"+ экранирование следующего символа. Вот точный код:

Часть оператора sql, которая испортилась, такова:

"and s.plainText like '%"+searchText+"%'";

До этого есть еще, но все строится правильно. Итак, в программе, если я введу в качестве searchText следующее:

foo

Затем, когда я вывожу встроенный оператор sql в консоль, я получаю следующее:

and s.plainText like 'undefinedoo%'

Таким образом, получается, что %" превращается в неопределенное и приводит к экранированию первой буквы searchText.

Как я могу правильно построить эту часть инструкции sql? Я должен использовать «потому что оператор содержит». И я должен использовать %, потому что мне нужен подстановочный знак для поиска строки текста.


person user785178    schedule 29.06.2011    source источник
comment
Вы никогда не должны создавать подобные запросы.   -  person Rafe Kettler    schedule 29.06.2011


Ответы (2)


Если под JS вы подразумеваете JavaScript, то это не то, что происходит. Вот jsfiddle:

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

Предположим, что если вы используете PHP и (s)printf, то отправка %f (где f исходит из foo примера, который вы использовали) будет означать, что он ожидает число с плавающей запятой - однако это будет отображать ошибку.

В качестве примечания кажется, что вы отправляете SQL с клиента на сервер. Если это так, вероятно, это очень плохая идея, особенно если вы не выполняете экранирование SQL, как указано выше. Посмотрите здесь:

для основных деталей.

Я не знаком с webOS, но проверьте этот SOq на предмет того, что правильно обрабатывает параметры SQL:

Определенно стоит провести дополнительное исследование того, как это правильно сделать в webOS - Google вам в помощь.

person icyrock.com    schedule 29.06.2011
comment
Во-первых, JS Fiddle — это КРУТО. Я добавлю это в закладки. Тем не менее, это все на webOS (ОС для мобильных телефонов), поэтому, насколько я знаю, клиент и сервер являются одним целым. Во всяком случае, я не знаю другого способа справиться с этим. Наконец, у меня есть команда ведения журнала для вывода построенного SQL-статанта в качестве самого следующего оператора в коде, поэтому в это время с ним ничего не происходит. Возможно, эта проблема более специфична для webOS? - person user785178; 29.06.2011
comment
jsfiddle действительно очень хорош. Что касается webOS, я не знаком с ней, чтобы помочь вам больше. В общем, отправка SQL (или частей SQL) с клиента на сервер без экранирования/проверки очень опасна — проверьте ссылку в Википедии. Так что не делай этого. Для проверки попробуйте поставить %% или \% вместо %, может поможет. И еще раз — не допускайте SQL-инъекций, они вас укусят в будущем. - person icyrock.com; 29.06.2011

Команды Mojo.Log обрабатывают переданную вами строку примерно так же, как функция printf в C. То есть вы можете указать некоторые заполнители, которые будут заполнены значениями переданных параметров. Пример - тысяча слов так:

Mojo.Log.info("My string is '%s' and my number is '%f'", strData, numData);

будет печатать

My string is 'aaa' and my number is '1'

если strData равно 'aaa', а numData равно 1.

Поэтому, скорее всего, ваша строка построена правильно, но при ее печати будет предпринята попытка заменить %f из %foo% параметром. Параметр никогда не передается, поэтому он не определен. Вы должны увидеть правильный вывод, если для проверки используете что-то другое, а не «foo» (попробуйте «bbb»).

Для получения дополнительной информации ознакомьтесь с документацией для Mojo.Log.

PS При этом не рекомендуется создавать операторы SQL таким образом, поэтому я не рекомендую это делать. Легко сделать, но трудно читать и поддерживать позже :)

person rslite    schedule 27.07.2011