Arhn - архитектура программирования

Anorm возвращает 0 результатов, в то время как psql возвращает 2 результата

Я включаю панель поиска через AJAX, который передает выбранный фильтр (переключатель), относящийся к столбцу базы данных, и строку поиска для всего, что введено в строку поиска. Код scala/play/anorm, который я использую, таков:

def searchDB(searchString: String, filter: String): List[DatabaseResult] = {
DB.withConnection { implicit c =>
  SQL(
    """
      SELECT name, email, emailsecondary, picture, linkedin, title, company, companylink, companydesc, location, github, stackoverflow, twitter, blog
      FROM mailinglistperson
      WHERE {filter} LIKE '%{searchString}%'
    """).on(
          'filter -> filter,
          'searchString -> searchString
    ).as(databaseResultParser.*)
}

}

Когда я запускаю запрос к базе данных (PostgreSQL), используя psql, который изоморфен приведенному выше коду анормы, он возвращает 2 результата, то есть:

select id, name, email from mailinglistperson where company like '%kixer%';

Но код anorm возвращает 0 результатов при передаче одних и тех же значений (я проверил значения через println)

РЕДАКТИРОВАТЬ: Когда я переключаю код anorm на использование интерполяции строк, я получаю:

[error] - play.core.server.netty.PlayDefaultUpstreamHandler - Cannot invoke the action
 java.lang.RuntimeException: No parameter value for placeholder: 3

РЕДАКТИРОВАТЬ 2: я также попытался передать «%...%» вместе с searchString в LIKE и все равно получил 0 результатов.

22.09.2015

  • возможный дубликат предложения Anorm LIKE с интерполяцией строк 22.09.2015
  • Что касается значения фильтра: вы пробовали LIKE {searchString} вместе с searchString = '%...%" ? Это означает отсутствие одиночных тиков в команде SQL (они должны обрабатываться автоматически) и передавать % вместе с searchString 22.09.2015
  • Что касается имени столбца: вообще говоря, невозможно передать имя столбца с использованием именованных параметров в SQL. Похоже, Anorm каким-то образом поддерживает это, но результирующая команда SQL содержит одиночные галочки (поскольку имя является строковым параметром). Поэтому вам, вероятно, придется встроить имя столбца, например SQL(s"... where $column like {searchString} (это простая интерполяция строк, уязвимая для SQL-инъекций) 22.09.2015
  • Смешанная интерполяция Anorm SQL"... WHERE #$column = $searchString" не уязвима для SQL-инъекций. 22.09.2015
  • @cchantep Я только прокомментировал, что обычная интерполяция строк уязвима. Спасибо за подсказку, я не знал о смешанной интерполяции. Но быстрый тест с использованием Play 2.4.0 и 2.5.0 показал, что он уязвим к SQL-инъекциям?! 22.09.2015
  • Что касается #$expressions, вы правы, я имел в виду $parameters. 22.09.2015

Ответы:


1

Есть две проблемы: имя столбца и значение фильтра.


Что касается значения фильтра: вы должны опустить одиночные галочки в команде SQL и передать заполнитель % в аргументе. Галочки обрабатываются автоматически в случае строки.


Что касается имени столбца: это похоже на строковый параметр, поэтому тики также обрабатываются автоматически:

[отладка] c.j.b.PreparedStatementHandle - выберите... из... где "фильтр", например "% aaa%"

Одно решение: используйте обычную интерполяцию строк s"""... $filter ...""".


Все вместе:

SQL(
  s"""
    SELECT name, email, ...
    FROM mailinglistperson
    WHERE $filter LIKE {searchString}
  """).on(
      'searchString -> "%" + searchString + "%"
  ).as(databaseResultParser.*)

но это должно сопровождаться проверкой перед чем-то вроде

val validColumns = List("name", "email")
if (validColumns.contains(filter)) == false) {
  throw new IllegalArgumentException("...")
}

для защиты от SQL-инъекций.


Обновить

Как указал cchantep: если используется Anorm ›= 2.4, можно использовать смешанную интерполяцию (как для имен столбцов, так и для значений):

SQL"... WHERE #$filter LIKE $searchString"

В этом случае это частично защищает от SQL-инъекций: только покрывает значения, а не имя столбца.

Обновление 2

Что касается регистрации операторов SQL, см. Где посмотреть зарегистрированные операторы sql в play2?

Но поскольку вы используете PostgreSQL, я предлагаю окончательный источник: Журнал PostgreSQL: В postgresql.conf:

log_statement = 'all' # нет, ddl, мод, все

то вы увидите в файле журнала PostgreSQL что-то вроде этого:

ЖУРНАЛ: выберите * из test50, где имя похоже на $1

ПОДРОБНО: Параметр: $1 = '%aaa'

22.09.2015
  • Это сработало! Было бы неплохо, если бы у anorm был способ распечатать скомпилированный код SQL, который передается в базу данных для отладки... не так ли? 22.09.2015
  • Я добавил в ответ дополнительную информацию о регистрации команд SQL. 22.09.2015
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..