2017-03-14 2 views
1

Ich versuche dynamisch eine INSERT-Anweisung basierend auf JSON-Schlüssel/Wert-Paaren zu erstellen, wobei der Schlüssel $ das Datenbankfeld des Datentyps string oder integer ist und $ value eine Ganzzahl oder eine Zeichenfolge ist. Ich hatte keine Probleme beim Einfügen von numerischen Zeichenfolgen in Postgres vor, aber es ist fehlgeschlagen.Typkonvertierung fehlgeschlagen, nachdem INSERT-Anweisung dynamisch erstellt wurde?

Beispiel:

$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 akzeptieren beide '42' und' '42'' für ein numerisches Feld in einer 'INSERT' Aussage, so dass Sie nur die Zitate bedingungslos hinzufügen könnten. –

+1

Diese Seite zieht es vor, Fragen und Antworten getrennt zu halten. Anstatt also eine Lösung in das Feld "Frage" einzufügen, werden Sie entweder auf das Häkchen "Akzeptieren" mit einer der Antworten klicken oder [Ihre eigene Frage beantworten und akzeptieren diese Antwort] (http://stackoverflow.com/help/self-answer). – IMSoP

+0

@NickBarnes Sie sind richtig, weshalb ich so verwirrt war. Es stellte sich heraus, dass es sich um eine _float_ numerische Zeichenfolge handelte, die den Fehler verursachte. Lösung veröffentlicht unten. –

Antwort

1

Das Problem stellte sich heraus, dass einer der Werte tatsächlich eine float numerische Zeichenfolge beim Einfügen in ein Integer-Feld fehlgeschlagen ist, rundet den Wert, wenn es eine numerische Zeichenfolge ist, löst dies. Die Überprüfung is_numeric verhindert, dass Zeichenfolgenfelder in 0 konvertiert werden.

Lösung:

$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

Dies ist saubere 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, ', ').');'; 

Bitte denken Sie an Ihre Wert zu entkommen.

+0

In diesem speziellen Fall wird die Nullbedingung benötigt, um leere Zeichenfolgenwerte zu vermeiden. –

+0

Ich habe meine Antwort bearbeitet. – Gab

+0

Wenn es Ihren Anforderungen entspricht, bitte akzeptieren Sie meine Antwort als gültige Antwort – Gab

Verwandte Themen