sprintf меняет формат чисел - PullRequest
       0

sprintf меняет формат чисел

1 голос
/ 12 октября 2011

У меня проблема с sprintf(), я использую его для сохранения запроса mysql в var, чтобы использовать его позже.

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

например $value=25.5 и $id=5, у меня есть что-то вроде

$value = number_format($baseValue, 2, ".", "");

$query = sprintf("Insert into table_name (id, value) values (%d, $.02f)", $id, $value);
$db->Execute($query);

перед этим есть условие, которое решает, будет ли перед этим еще один $ запрос. если первый запрос не выполняется, он выполняется нормально, являясь запросом

Insert into table_name (id, value) values (5, 25.50)

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

Insert into table_name (id, value) values (5, 25,50)

Я пытался напечатать $value прямо перед sprintf(), и он все еще имеет правильный формат, с какой стати это происходит и как я могу это решить?

Редактировать : $ value даже не использовалось и не изменялось до этого момента

Ответы [ 2 ]

1 голос
/ 12 октября 2011

Вы в основном дважды выполняете преобразование эквивалентного числа в строку, сначала с number_format(), а затем с printf() и модификатором %f.Достаточно заменить $.02f на %s.

Причина, по которой printf() не генерирует действительный номер в английском формате, заключается в том, что он использует региональные настройки (см. setlocale () для дальнейшей информации).Учитывая, что SQL ожидает фиксированный формат, более надежно использовать number_format().

Обновление: Библиотека ADOdb , кажется, поддерживает подготовленных государственных деятелей.Обычно они являются более простым и надежным механизмом, чем вставка значений в код SQL:

$rs = $DB->Execute("select * from table where key=?",array($key));
while (!$rs->EOF) {
    print_r($rs->fields);
    $rs->MoveNext();
}
0 голосов
/ 12 октября 2011

Поместите несколько одинарных кавычек вокруг ваших значений.Для начала 25,50 будет интерпретироваться как два поля (и я уверен, что mySQL тоже не понравится 25.50 без кавычек.

$query = sprintf("Insert into table_name (id, value) values ('%d', '$.02f')", $id, $value);

Результатом будет:

Insert into table_name (id, value) values ('5', '25.50')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...