Как указать ввод в Python MySQL LIKE Query? [Дубликат]

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

13
задан MPelletier 18 January 2014 в 18:27
поделиться

3 ответа

Лучше всего отделить параметры от sql, если сможете. Затем вы можете позволить модулю db заботиться о правильном цитировании параметров.

sql='SELECT x FROM myTable WHERE x LIKE %s'
args=[beginningOfString+'%']
cursor.execute(sql,args)
20
ответ дан unutbu 19 August 2018 в 18:20
поделиться
  • 1
    @ ~ unutbu: спасибо, это гвозди. Не передумал просто добавить% к самой строке до , передав ее как arg через db-api. – laramichaels 20 January 2010 в 11:17

Обратите внимание на документацию Sqlite3 :

Обычно ваши операции SQL должны использовать значения из переменных Python. Вы не должны собирать свой запрос с помощью строковых операций Python, потому что это небезопасно; это делает вашу программу уязвимой для атаки SQL-инъекции.

Вместо этого используйте замену параметров DB-API. Положил ? как местозаполнитель везде, где вы хотите использовать значение, а затем предоставить кортеж значений в качестве второго аргумента методу execute () курсора. (Другие модули базы данных могут использовать другой заполнитель, например% s или: 1). Например:

# Never do this -- insecure!
symbol = 'IBM'
c.execute("... where symbol = '%s'" % symbol)

# Do this instead
t = (symbol,)
c.execute('select * from stocks where symbol=?', t)

# Larger example
for t in [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
          ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00),
          ('2006-04-06', 'SELL', 'IBM', 500, 53.00),
         ]:
    c.execute('insert into stocks values (?,?,?,?,?)', t)

Я думаю, что вы хотите это:

cursor.execute('SELECT x FROM myTable WHERE x LIKE '%?%', (beginningOfString,) )
-1
ответ дан Brian 19 August 2018 в 18:20
поделиться
  • 1
    Нет, это пойдет не так. – Thomas Wouters 19 January 2010 в 23:44
  • 2
    @ Томас: Почему? Кроме того, что я использовал '%?%' вместо '?%' (он не был полностью последователен в запросе, который он хотел), я не вижу проблемы. – Brian 19 January 2010 в 23:50
  • 3
    Проблема в том, что? заменяется на quoted версию фактического аргумента, который вы передаете. Так дается, например, «'; DROP TABLE x; SELECT' & quot; (обратите внимание на одиночные кавычки и ), вы получите этот явно плохой запрос: SELECT x FROM myTable WHERE x LIKE '%'; DROP TABLE x; ВЫБРАТЬ '%' – Thomas Wouters 19 January 2010 в 23:58
  • 4
    Я не следую. Не заменяет ли замена DB-API? – Brian 20 January 2010 в 02:04

EDIT:

Как отметил Брайан и Томас, гораздо лучшим способом сделать это будет использование:

beginningOfString += '%'
cursor.execute("SELECT x FROM myTable WHERE x LIKE ?", (beginningOfString,) )

, поскольку первый метод дает вам возможность открыть SQL-инъекцию Атаки.


Слева за историей:

Попробуйте:

cursor.execute("SELECT x FROM myTable WHERE x LIKE '%s%%'" % beginningOfString)
2
ответ дан Sean Vieira 19 August 2018 в 18:20
поделиться
  • 1
    -1 "SELECT x FROM myTable WHERE x LIKE '%s%%'" % "doom' ; drop table x; select '" К сожалению? – Brian 19 January 2010 в 23:11
  • 2
    @Брайан; очень действительная точка! Я сосредоточился на синтаксической ошибке; Я не должен был предполагать, что beginning - это чистые данные. Спасибо за улов! – Sean Vieira 19 January 2010 в 23:24
  • 3
    -1 удалено. Тем не менее, у вас все еще есть синтаксическая ошибка. Используйте двойные кавычки для своей строки, и вам не нужно будет избегать одиночных кавычек. – Brian 19 January 2010 в 23:49
  • 4
    Отредактировано исправление ошибки синтаксиса и ошибка, которую указал Томас. – Sean Vieira 20 January 2010 в 00:10
Другие вопросы по тегам:

Похожие вопросы: