PDO :: PARAM用于十进制类型?


77

我有2个数据库字段

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

我有2个pdo查询可以更新它们。更新int的一个可以正常工作

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

但我无法更新小数点字段。我已经尝试了以下3种方法,但没有任何效果

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

看来问题出在数据库类型上decimal?是否有一个PDO::PARAM用于类型的字段decimal?如果没有,我该如何解决?


请发布查询您的准备
Galen '04

Answers:


87

没有PDO::PARAM小数/浮点数,您必须使用PDO::PARAM_STR


2
这是我在此处发布问题之前尝试过但不起作用的事情之一。
dmontain

@dmontain:尝试将$ decval定义为字符串(例如:'1.0'代替1.0)或使用strval($decval)
Alix Axel

6
@dmontain:它应该是开箱即用的(PDO::PARAM_STR在未指定任何内容的情况下,它是默认值),并且您不应更改列数据类型。只需将值用单引号或双引号引起来,或者将strval()它括起来,如下所示:$update_decval->bindParam(':decval', strval($decval), PDO::PARAM_STR);
Alix Axel

@Alix,我不知道为什么strval不起作用。这听起来像是一个非常合乎逻辑的答案,但是那里没有任何工作。我正在尝试不同的组合,以查看它们中的任何一个是否可以工作。
dmontain

17
@dmontain:来自PHP手册:与PDOStatement :: bindValue()不同,该变量被绑定为引用,并且仅在调用PDOStatement :: execute()时进行评估。-bindValue()如果要使用,则必须使用strval()
Alix Axel 2010年

0

UP必须使用相同的PDO :: PARAM_STR,并注意,如果数据库中的列类型为NUMERIC(M,D)或十进制(M,D),则应注意M是字符数精度,应为您可以输入的字符总数,D是小数位数。在示例NUMERIC(10,2)中,我们有8个精度位的房子和两个小数位。因此,我们总共有10个字符,其中2个保留用于小数位。


0

我找到了解决方案,在SQL Server存储过程中发送像PDO :: PARAM_STR这样的十进制参数,在接收它的情况下,如decimal(int,dec)

的PHP

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

SQL SERVER,存储过程:

@valor_escala_desde decimal(18,2),

并完成。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.