为什么我不能将带有PDO的0.00十进制值插入到我的数据库中?

时间:2016-05-13 08:26:19

标签: php mysql pdo

我认为问题很清楚。以下是一些细节......
样本数据:

array(2) {
  [0]=>
  array(5) {
    ["index"]=>
    string(1) "1"
    ["source"]=>
    string(0) ""
    ["target"]=>
    string(0) ""
    ["price"]=>
    string(6) "153.00"
    ["order"]=>
    string(5) "19442"
  }
  [1]=>
  array(5) {
    ["index"]=>
    string(1) "2"
    ["source"]=>
    string(5) "Test1"
    ["target"]=>
    string(5) "Test2"
    ["price"]=>
    string(4) "0.00"
    ["order"]=>
    string(0) ""
  }
}

然后我只是循环数据并将其插入数据库,如下所示:

$sql = "INSERT INTO `os_bill_position`
        (`position_index`, `source_name`, `target_name`, `price_netto`, `FID_bill`, `FID_order`)
        VALUES
        (:index, :source, :target, :price, :billID, :orderID)";
$stmt = $link->prepare($sql);

foreach ($allPositions as $position) {
        $stmt->bindValue(':index', $position['index']);
        $stmt->bindValue(':source', $position['source']);
        $stmt->bindValue(':target', $position['target']);
        $stmt->bindValue(':price', $position['price'], PDO::PARAM_STR);
        $stmt->bindValue(':billID', $billID);
        $stmt->bindValue(':orderID', $position['order']);

        $stmt->execute();
    }

$billID是常量

数据库:

CREATE TABLE `os_bill_position` (
  `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `position_index` tinyint(3) unsigned NOT NULL,
  `source_name` varchar(255) NOT NULL,
  `target_name` varchar(255) NOT NULL,
  `price_netto` decimal(10,2) DEFAULT NULL,
  `FID_bill` int(10) unsigned NOT NULL,
  `FID_order` int(10) unsigned DEFAULT NULL,
  `position_tax` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`ID`),
  KEY `FID_bp_bill` (`FID_bill`),
  KEY `FID_bp_order` (`FID_order`),
  CONSTRAINT `FID_bp_bill` FOREIGN KEY (`FID_bill`) REFERENCES `os_bill` (`ID`) ON DELETE NO ACTION ON UPDATE CASCADE,
  CONSTRAINT `FID_bp_order` FOREIGN KEY (`FID_order`) REFERENCES `os_order` (`ID`) ON DELETE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

到目前为止我尝试了什么:

1.根据PDO::PARAM for type decimal

  

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

$stmt->bindValue(':price', $position['price'], PDO::PARAM_STR);

2。 $stmt->bindValue(':price', $position['price']);

3。 $stmt->bindValue(':price', (float) $position['price']);

我总是成功插入任何东西,但不能完全插入0.00 ...它可以在任何地方,循环不会破坏它仍然循环,如果它在开始或在中间或结束的某个地方。 ASD

编辑我被要求添加错误消息:

在我的循环中,我收集错误然后输出它们:

$stmt->execute();
$errors[] = $stmt->errorInfo();

array(1) {
  [0]=>
  array(3) {
    [0]=>
    string(5) "00000"
    [1]=>
    NULL
    [2]=>
    NULL
  }
}

1 个答案:

答案 0 :(得分:0)

评论中的答案向我指出了正确的方向。问题不在于十进制0.00,而是在我尝试设置为空字符串的外键中,这是无效的NULL 外键。

快速解决方法是检查字符串是否为空并将其设置为NULL:

if (empty($position['order'])) {
    $position['order'] = NULL;
}