PDO :: PARAM für Typ Dezimal?

77

Ich habe 2 Datenbankfelder

`decval` decimal(5,2)
`intval` int(3)

Ich habe 2 PDO-Abfragen, die sie aktualisieren. Derjenige, der das int aktualisiert, funktioniert in Ordnung

$update_intval->bindParam(':intval', $intval, PDO::PARAM_INT);

Ich kann das Dezimalfeld jedoch nicht aktualisieren. Ich habe die folgenden 3 Möglichkeiten ausprobiert, aber nichts funktioniert

$update_decval->bindParam(':decval', $decval, PDO::PARAM_STR);
$update_decval->bindParam(':decval', $decval, PDO::PARAM_INT);
$update_decval->bindParam(':decval', $decval);

Es scheint, dass das Problem mit dem Datenbanktyp ist decimal? Gibt es ein PDO::PARAMfür ein Typfeld decimal? Wenn nicht, was verwende ich als Problemumgehung?

dmontain
quelle
Bitte posten Sie die Frage Ihre Vorbereitung
Galen
mögliches Duplikat von stackoverflow.com/questions/1335081/…
Alix Axel

Antworten:

87

Es gibt keine PDO::PARAMfür Dezimalstellen / Gleitkommazahlen, die Sie verwenden müssen PDO::PARAM_STR.

Alix Axel
quelle
2
Das war eines der Dinge, die ich versucht habe und die nicht funktioniert haben, bevor ich die Frage hier gestellt habe.
Dmontain
@dmontain: Versuchen Sie, $ decval als Zeichenfolge zu definieren (z. B.: '1.0'anstelle von 1.0) oder verwenden Sie strval($decval).
Alix Axel
6
@dmontain: Es sollte sofort funktionieren ( PDO::PARAM_STRist die Standardeinstellung, wenn keine angegeben ist), und Sie sollten Ihren Spaltendatentyp nicht ändern. Schließen Sie den Wert einfach in einfache oder doppelte Anführungszeichen oder strval()wie folgt ein : $update_decval->bindParam(':decval', strval($decval), PDO::PARAM_STR);.
Alix Axel
@Alix, ich habe keine Ahnung warum strvalnicht funktioniert. Es klingt nach einer sehr logischen Antwort, aber dort funktioniert etwas nicht. Ich versuche verschiedene Kombinationen, um zu sehen, ob eine davon funktionieren würde.
Dmontain
17
@dmontain: Aus dem PHP-Handbuch: Im Gegensatz zu PDOStatement :: bindValue () wird die Variable als Referenz gebunden und nur zum Zeitpunkt des Aufrufs von PDOStatement :: execute () ausgewertet. - Sie müssen bindValue()stattdessen verwenden, wenn Sie verwenden möchten strval().
Alix Axel
0

UP muss das gleiche PDO :: PARAM_STR verwenden. Wenn die Spalte in der Datenbank vom Typ NUMERIC (M, D) oder dezimal (M, D) ist, sollte beachtet werden, dass M die Anzahl der Zeichen ist Gesamtzahl der Zeichen, die Sie eingeben können, und D die Anzahl der Dezimalstellen. Im Beispiel NUMERIC (10,2) haben wir 8 Häuser zu Genauigkeitsstellen und zwei Dezimalstellen. Wir haben also insgesamt 10 Zeichen, wobei 2 für Dezimalstellen reserviert sind.

Gil
quelle
0

Ich habe eine Lösung gefunden, sende den Dezimalparameter wie PDO :: PARAM_STR, empfange ihn in der SQL Server-Speicherprozedur wie Dezimal (int, dec)

PHP

$stmt_e->bindParam(':valor_escala_desde', $valor_escala_desde, PDO::PARAM_STR);

SQL Server, Speicherverfahren:

@valor_escala_desde decimal(18,2),

und ist fertig.

julio castillo
quelle
0

Verwenden Sie PDO :: PARAM_STR für alle Spaltentypen, die nicht vom Typ int oder Bool sind

Paul Kiarie
quelle