【问题标题】:Can't insert decimal value with PDO无法使用 PDO 插入十进制值
【发布时间】:2013-02-03 05:52:40
【问题描述】:

我已经在网上搜索了好几个小时并尝试了不同的方法,但我不明白为什么 PDO 不能插入其中一个值包含小数的任何行。

例如,如果输入到成本字段中的值没有十进制值,那么它可以正常工作。但是任何像小数一样的东西,它都会忽略整行。

200 件作品,甚至 200.00 件作品。但是像 39.99 这样的东西不会。

代码如下:

$invoice_id = $db->lastInsertId('id');

$item_name = $_POST['item_name'];
$item_qty = $_POST['item_qty'];
$item_cost = $_POST['item_cost'];
$item_vat = $_POST['item_vat'];

for($i = 0; $i < count($item_name); $i++) {
$item_query = $db->prepare("INSERT INTO hm_invoice_items(invoice, item, qty, amount, vat) VALUES(:invoice, :item, :qty, :amount, :vat)");
$item_query->bindParam(":invoice", $invoice_id);
$item_query->bindParam(":item", $item_name[$i]);
$item_query->bindParam(":qty", $item_qty[$i]);
$item_query->bindParam(":amount", $item_cost[$i]);
$item_query->bindParam(":vat", $item_vat[$i]);

if (!$item_query->execute())
    {
        die(showMessage("There has been a problem adding the invoice items.", "Error!"));
    }
}

var_dump 告诉我插入查询正在接收值,但它不喜欢处理小数。

【问题讨论】:

  • 忽略如何?你得到你的错误信息?您至少应该输出 mysql 错误消息,而不是仅仅说“出现问题”。
  • 您的列是 DECIMAL 类型吗?
  • 为什么你使用$item_name[$i]而不是$_POST['item_name'][$i]?有什么好处吗?
  • 是的,它会抛出错误。我似乎无法让 PDO 错误消息正常工作?是的,列类型是 DECIMAL(19,2)。
  • $db-&gt;setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); 连接后以使 PDO 错误消息正常工作

标签: php mysql insert pdo decimal


【解决方案1】:

小数点分隔符可能存在问题。
在调试此类情况时,var_dump()e-ve-ry-thing!

您为什么不 var_dump 您的值以进行更仔细的检查? 为什么不只使用小数,不使用 POST,不使用其他值?

题为“无法使用 PDO 插入十进制值”的问题应包含简短的可复制代码,其中包含向读者展示的十进制值和结果。
以间接的方式判断对你没有帮助,尤其是不会给你带来陌生人的帮助。

"var_dump your values" 表示每个可疑值,例如

var_dump($item_cost[$i]);

在你的循环中
如果你没有得到输出 - 那么就有空值,所以,难怪没有插入任何东西。

顺便说一句,您显然将十进制 item_cost 值绑定到显然整数 amount 字段。是不是笔误?

但是再一次 - 某个可复制的证明代码在哪里包含一个插入查询、一个硬编码的十进制值和一个结果?呃——当然还有表定义。

【讨论】:

  • 出于某种原因,我没有从 var_dump 或 PDO 错误中得到任何信息。
  • 当试图插入一个成本为 2000 的项目和一个成本为 39.99 的项目时,成本字段上的 var_dump 返回 string(4) "2000" string(5) "39.99"。而 db 列被称为数量,这正是我所做的方式。
【解决方案2】:

使用以下内容显示发布到您的 PHP 脚本的所有值的内容:

print_r($_POST);

【讨论】:

    【解决方案3】:

    试试这个?

    $item_query->bindParam(":amount", floatval($item_cost[$i]));
    

    当我使用 PDO 处理 MySQL 十进制数据类型时,至少它对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      • 2014-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-09
      • 1970-01-01
      相关资源
      最近更新 更多