我认为问题很清楚。以下是一些细节......
样本数据:
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
}
}
答案 0 :(得分:0)
评论中的答案向我指出了正确的方向。问题不在于十进制0.00
,而是在我尝试设置为空字符串的外键中,这是无效的NULL 和外键。
快速解决方法是检查字符串是否为空并将其设置为NULL:
if (empty($position['order'])) {
$position['order'] = NULL;
}