php - 数据库值与数据流不匹配

标签 php mysql sql csv

由于某些奇怪的原因,某些数据库值与数据流不匹配。但这并不适用于每个条目。例如,下面是我的 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/

相关文章:

mysql 从缓冲中排除模式

sql - 如何翻译为 Linq 表达式

mysql - SQL获取所有不是我 friend 的 friend 的 friend

javascript - 禁用 mysql 的时间选择器

php - docker 和 PHP : getting dependencies (composer) into the container

PHP - 从数据 URI 调整图像大小并压缩图像

sql - 更新 postgresql 中的列

php - WordPress 媒体库钩子(Hook)和过滤器在 2 个函数之间传递变量

php - 在别处定义的匿名函数中使用变量

python - 将 MySQL 查询结果存储到 python 变量中