2011-10-12 122 views
1

我與sprintf()有問題,使用它將一個mysql查詢存儲到一個var以便稍後使用它。sprintf更改數字格式

只是爲了告知,我使用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) 

我就在這一個錯誤我試圖在sprintf()之前打印$value,它仍然有正確的格式,爲什麼地球上發生這種情況,我該如何解決它?

編輯:$值甚至不是使用或更改直到這一刻

+0

兩個「插入」代碼示例看起來是相同的。這是故意的嗎? – ford

+0

它們中沒有一個用點分隔,另一個用逗號分隔 – FabioG

回答

1

你基本上是做了相當的數量,以字符串轉換兩次,第一次與number_format(),然後用printf()%f修改。與%s更換$.02f應該夠了。

printf()未生成有效英文格式編號的原因是因爲它使用的是區域設置(有關更多信息,請參見setlocale())。鑑於SQL需要固定格式,因此使用number_format()更可靠。

更新:ADOdb library似乎支持準備statemens。它們通常比向SQL代碼中注入值更簡單和更健壯的機制:

$rs = $DB->Execute("select * from table where key=?",array($key)); 
while (!$rs->EOF) { 
    print_r($rs->fields); 
    $rs->MoveNext(); 
} 
+0

感謝它正常使用%s而不是%.02f – FabioG

0

沾些單引號括起來你的價值觀。該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') 
+0

值是十進制的,所以加上單引號會導致mysql錯誤 – FabioG

+0

不應該,我想。我不這麼認爲,所以我只是自己測試過,沒關係。例如'test test(id int,value decimal(6,3));','insert into test(id,value)values('5','25 .50');','select * from test;''返回值5和25.500在我的系統上(MySQL 5.1.41) –

+0

你是對的,我試過了,錯誤仍然來自逗號。 「不正確的十進制值:」15,2「列'值'」 – FabioG