2017-03-14 31 views
1

我試圖動態地創建一個基於JSON鍵/值對的INSERT語句,其中$ key是字符串或整型數據類型的數據庫字段,$ value是一個整數或字符串。我沒有問題插入到Postgres的數字字符串,但它是失敗的。動態構建INSERT語句後類型轉換失敗?

例子:

$json = '{"stringField":"string","intString":"42"}'; 
$columns = $values = ''; 
foreach (json_decode($json, true) as $key => $value) { 
    if ($value != NULL) { 
     $columns .= $key . ', ';   
     $values .= "'" . $value . "', "; 
    } 
} 
$query = ('INSERT INTO table ('.rtrim($columns, ', ').') VALUES ('.trim($values, ', ').');'); 
+1

Postgres將同時接受'42'和''42''在一個'INSERT'聲明的數字字段,所以你可以只添加引號無條件。 –

+1

本網站傾向於將問題和答案分開保存,因此我們建議您不要在「問題」字段中添加解決方案,而是點擊「接受」標記對其中一個答案,或者[回答您自己的問題並接受那個答案](http://stackoverflow.com/help/self-answer)。 – IMSoP

+0

@NickBarnes你是對的,這就是我爲什麼如此困惑。原來這是一個導致錯誤的_float_數字字符串。解決方案發布如下 –

回答

1

問題原來是其中一個值實際上是一個float數字字符串無法插入到整數字段中,如果它是數字字符串,則舍入值可解決此問題。 is_numeric檢查避免將字符串字段轉換爲0

解決方案:

$json = '{"stringField":"string","floatString":"42.0","intString":"42"}'; 
$columns = $values = ''; 
foreach (json_decode($json, true) as $key => $value) { 
    if ($value != NULL) { 
     $columns .= $key . ', ';   
     $values .= is_numeric($value) ? round($value) . "," : "'" . $value . "', "; 
    } 
} 
$query = ('INSERT INTO table ('.rtrim($columns, ', ').') VALUES ('.trim($values, ', ').');'); 
1

這是清潔PHP:

$json = '{"stringField":"string","numberField":"42"}'; 
$columns = $values = ''; 
foreach (json_decode($json, true) as $key => $value) { 
    if ($value !== NULL) { 
     $columns .= $key . ', '; 
     $values .= is_numeric($value) ? $value : "'" . $value . "', "; 
    } 
} 

$query = 'INSERT INTO table ('.rtrim($columns, ', ').') VALUES ('.trim($values, ', ').');'; 

請想一想轉義你的價值觀。

+0

在這種特殊情況下需要null條件以避免空字符串值。 –

+0

我編輯了我的答案。 – Gab

+0

如果它適合您的需求,請接受我的答案作爲有效答案 – Gab