数据库值与数据流不匹配


Database values do not match data stream

由于某些奇怪的原因,某些数据库值与数据流不匹配。但并不是每个条目都适用。例如,下面是我的CSV文件中的一行。

00-1751,P,1649.95,1649.95,1237.00

而在我的数据库中同样的条目读取为

00-1751,P,999.99,999.99,999.99

转储到DB的代码如下:

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注入。

奇怪的是,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();