由于某些奇怪的原因,某些数据库值与数据流不匹配。但这并不适用于每个条目。例如,下面是我的 CSV 文件中的一行。
00-1751,P,1649.95,1649.95,1237.00
不知何故,在我的数据库中读取相同的条目
00-1751,P,999.99,999.99,999.99
我转储到数据库的代码如下:
function dump($csvFile, $conn){
if(($handle = fopen($csvFile, 'r')) !== false) {
$header = fgetcsv($handle);
$id = 0;
$sql = "TRUNCATE TABLE inv_price";
$sth = $conn->prepare($sql);
$sth->execute();
while(($data = fgetcsv($handle)) !== false) {
$sql = "INSERT INTO `inv_price` (sku, part_status, msrp, curr_sugg_retail, your_price)
VALUES ('$id', '$data[0]', '$data[1]', '$data[2]', '$data[3]')";
print_r($data);
try{
$conn->query($sql);
}
catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
$id++;
}
fclose($handle);
}
}
打印到控制台的 $data
与 CSV 文件匹配。我不确定某些行如何或为何将值更改为 999.99
。
最佳答案
对此行为最可能的解释是该列被定义为数据类型 DECIMAL(5,2)
,它只允许小数点前三位数字。并且错误/警告被忽略。
列中存储的值是该数据类型可以存储的最大值。我们也观察到整数值的类似行为。
SQL Fiddle Here http://sqlfiddle.com/#!2/a7577f/1
create table foo (col52 DECIMAL(5,2), col72 decimal(7,2));
insert ignore into foo (col52, col72) values (1234.56, 1234.56);
select * from foo;
col52 col72
------ -------
999.99 1234.56
完全不同的是,该代码似乎容易受到 SQL 注入(inject)的攻击。
奇怪的是,TRUNCATE TABLE
语句是准备好的语句,但 INSERT
不是。
$sql = 'INSERT INTO `inv_price` (sku, part_status, msrp, curr_sugg_retail, your_price)
VALUES (?, ?, ?, ?, ?)';
$sth=conn->prepare($sql);
$sth->bindParam(1,$id);
$sth->bindParam(2,$data[0]);
$sth->bindParam(3,$data[1]);
$sth->bindParam(4,$data[2]);
$sth->bindParam(5,$data[3]);
$sth->execute();
关于php - 数据库值与数据流不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30651072/