Плавание Python к Десятичному преобразованию

Несколько рекомендаций по экранированию специальных символов в операторах SQL.

Не используйте MySQL , это расширение устарело, используйте MySQLi или PDO .

MySQLi

Для ручного экранирования специальных символов в строке вы можете использовать функцию mysqli_real_escape_string .

Пример:

$mysqli = new mysqli( 'host', 'user', 'password', 'database' );
$mysqli->set_charset( 'charset');

$string = $mysqli->real_escape_string( $string );
$mysqli->query( "INSERT INTO table (column) VALUES ('$string')" );

Для автоматического экранирования значений с помощью подготовленных операторов , используйте mysqli_prepare и mysqli_stmt_bind_param , где для соответствующего преобразования должны быть указаны типы для соответствующих переменных связывания:

Пример:

$stmt = $mysqli->prepare( "INSERT INTO table ( column1, column2 ) VALUES (?,?)" );

$stmt->bind_param( "is", $integer, $string );

$stmt->execute();

Независимо от того, используете ли вы подготовленные операторы или mysqli_real_escape_string, вам всегда нужно знать тип входных данных, с которыми вы работаете.

Итак, если вы используете подготовленный оператор, вы должны указать типы переменных для функции mysqli_stmt_bind_param.

И использование mysqli_real_escape_string для, как сказано в названии, означает экранирование специальных символов в строке, поэтому оно не сделает целые числа безопасными. Цель этой функции - предотвратить разрыв строк в операторах SQL и повреждение базы данных, которое она может вызвать. mysqli_real_escape_string - полезная функция при правильном использовании, особенно в сочетании с sprintf.

Пример:

$string = "x' OR name LIKE '%John%";
$integer = '5 OR id != 0';

$query = sprintf( "SELECT id, email, pass, name FROM members WHERE email ='%s' AND id = %d", $mysqli->real_escape_string( $string ), $integer );

echo $query;
// SELECT id, email, pass, name FROM members WHERE email ='x\' OR name LIKE \'%John%' AND id = 5

$integer = '99999999999999999999';
$query = sprintf( "SELECT id, email, pass, name FROM members WHERE email ='%s' AND id = %d", $mysqli->real_escape_string( $string ), $integer );

echo $query;
// SELECT id, email, pass, name FROM members WHERE email ='x\' OR name LIKE \'%John%' AND id = 2147483647

51
задан Chris Martin 2 November 2014 в 22:09
поделиться

6 ответов

Python < 2.7

"%.15g" % f

Или в Python 3.0:

format(f, ".15g")

Python 2.7 +, 3.2 +

Просто передают плавание Decimal конструктор непосредственно, как это:

from decimal import Decimal
Decimal(f)
55
ответ дан javidazac 7 November 2019 в 10:06
поделиться

Вы сказали в своем вопросе:

Может кто-то предлагать хороший способ преобразовать от плавания до Десятичного числа значение сохранения, поскольку пользователь вошел

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

24
ответ дан nosklo 7 November 2019 в 10:06
поделиться

Python действительно поддерживает Десятичное создание от плавания. Вы просто снимаете его в качестве строки сначала. Но потеря точности не происходит при преобразовании строк. Плавание, которое Вы преобразовываете, не имеет такой точности во-первых. (Иначе Вам не было бы нужно Десятичное число)

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

4
ответ дан muhuk 7 November 2019 в 10:06
поделиться

"Официальное" строковое представление плавания дано repr () встроенное:

>>> repr(1.5)
'1.5'
>>> repr(12345.678901234567890123456789)
'12345.678901234567'

можно использовать repr () вместо отформатированной строки, результат не будет содержать ненужного мусора.

3
ответ дан Federico A. Ramponi 7 November 2019 в 10:06
поделиться

Когда Вы говорите "сохранение значения, поскольку пользователь вошел", почему не только хранят вводимое пользователями значение как строку и передачу это конструктору Decimal?

2
ответ дан Paul Fisher 7 November 2019 в 10:06
поделиться

"Правильный" способ сделать это было зарегистрировано в 1990 Steele и 1990 Белого и Clinger PLDI бумаги.

Вы могли бы также посмотреть это , ТАКИМ ОБРАЗОМ, дискуссия о Десятичном числе Python, включая мое предложение, чтобы попытаться использовать что-то как связывают для рационализации плавания.

0
ответ дан Community 7 November 2019 в 10:06
поделиться
Другие вопросы по тегам:

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