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

Posted

技术标签:

【中文标题】PDO::PARAM 用于十进制类型?【英文标题】:PDO::PARAM for type decimal? 【发布时间】:2011-02-12 16:50:11 【问题描述】:

我有 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 上? decimal 类型的字段是否有 PDO::PARAM?如果不是,我应该使用什么解决方法?

【问题讨论】:

请发布您准备的查询 ***.com/questions/1335081/…的可能重复 【参考方案1】:

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

【讨论】:

这是我在此处发布问题之前尝试过但没有奏效的方法之一。 @dmontain:尝试将 $decval 定义为字符串(例如:'1.0' 而不是1.0)或使用strval($decval) @dmontain:它应该开箱即用(PDO::PARAM_STR 是未指定时的默认值),并且您不应该更改您的列数据类型。只需用单引号或双引号或strval() 将值括起来,如下所示:$update_decval->bindParam(':decval', strval($decval), PDO::PARAM_STR); @Alix,我不知道为什么strval 不起作用。这听起来像是一个非常合乎逻辑的答案,但有些东西在那里不起作用。我正在尝试不同的组合,看看它们是否可行。 @dmontain:来自 php 手册:与 PDOStatement::bindValue() 不同,变量被绑定为引用,并且只会在PDOStatement::execute() 被调用。 - 如果你想使用strval(),你必须使用bindValue()【参考方案2】:

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

【讨论】:

【参考方案3】:

我找到了一个解决方案,发送像PDO::PARAM_STR这样的十进制参数,在sql server存储过程中像decimal(int,dec)那样接收它

PHP

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

SQL 服务器,存储过程:

@valor_escala_desde decimal(18,2),

完成了。

【讨论】:

【参考方案4】:

对所有非 int 或 Bool 类型的列类型使用 PDO::PARAM_STR

【讨论】:

以上是关于PDO::PARAM 用于十进制类型?的主要内容,如果未能解决你的问题,请参考以下文章

pdo知识点2

预定义常量

PHP PDO::bindParam() 数据类型.. 它是如何工作的?

哪种 MIME 类型用于特定于我的程序的二进制文件?

核心数据 - 货币的十进制类型

PDO::PARAM_FLOAT 不存在,为啥?