То, как корректно иметь дело с неудавшейся будущей функцией (__ будущее __) импортирует из-за старой версии интерпретатора?

MySQL: У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, для правильного синтаксиса для использования рядом с ... at line ...

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

Пример того, что не делать («Плохая идея»):

$query = "UPDATE `posts` SET my_text='{$_POST['text']}' WHERE id={$_GET['id']}";
mysqli_query($db, $query);

Этот код может быть включен в страницу с формой для отправки с URL-адресом например http://example.com/edit.php?id=10 (для редактирования сообщения n ° 10)

Что произойдет, если представленный текст содержит одинарные кавычки ? $query закончится:

$query = "UPDATE `posts` SET my_text='I'm a PHP newbie' WHERE id=10';

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

Чтобы избежать таких ошибок, вы ДОЛЖНЫ всегда избегать данных перед использованием в запросе.

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

Документация:

68
задан Ciro Santilli 新疆改造中心法轮功六四事件 18 August 2016 в 14:05
поделиться

2 ответа

"Я хотел бы сообщить пользователю, что они должны повторно выполнить программу с Python> = 2.6 и возможно предоставлять некоторые инструкции относительно того, как сделать так".

Не это, для чего файл README?

Вот Ваша альтернатива. "Обертка": немного блоба Python, который проверяет среду прежде, чем выполнить Вашу цель aop.

Файл: <час> appwrapper.py

import sys
major, minor, micro, releaselevel, serial = sys.version_info
if (major,minor) <= (2,5):
    # provide advice on getting version 2.6 or higher.
    sys.exit(2)
import app
app.main()

, Что "означает прямой импорт". Можно исследовать содержание __future__. Вы все еще связываетесь фактом from __future__ import print_function, информация к компилятору, но можно ввести по абсолютному адресу вокруг прежде, чем импортировать модуль, который делает реальную работу.

import __future__, sys
if hasattr(__future__, 'print_function'): 
    # Could also check sys.version_info >= __future__. print_function.optional
    import app
    app.main()
else:
    print "instructions for upgrading"
60
ответ дан Bruno Bronosky 24 November 2019 в 14:12
поделиться

Довольно хитрый, но простой метод, который я использовал раньше, - это использовать тот факт, что байтовые литералы были введены в Python 2.6, и использовать что-то вроде этого в начале файла:

b'This module needs Python 2.6 or later. Please do xxx.'

Это безвреден в Python 2.6 или новее, но SyntaxError в любых более ранних версиях. Любой, кто пытается скомпилировать ваш файл, все равно получит сообщение об ошибке, но он также получит любое сообщение, которое вы хотите передать.

Вы можете подумать, что, поскольку вам потребуется эта строка после вашего from __future__ import print_function , то это будет импорт, который генерирует SyntaxError , и вы не получите см. полезное сообщение об ошибке, но, как ни странно, более поздняя ошибка имеет приоритет. Я подозреваю, что, поскольку ошибка при импорте на самом деле не является синтаксической ошибкой сама по себе, она не возникает на первом проходе компиляции, и поэтому сначала возникают реальные синтаксические ошибки (но я предполагаю).

Это может не соответствовать вашим критериям «изящности», и это очень специфично для Python 2.6, но это быстро и легко.

46
ответ дан 24 November 2019 в 14:12
поделиться
Другие вопросы по тегам:

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