Php 数据库值与数据流不匹配

Php 数据库值与数据流不匹配,php,mysql,sql,csv,Php,Mysql,Sql,Csv,出于某些奇怪的原因,某些数据库值与数据流不匹配。但并不是每个条目都适用。例如,下面是我的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 =

出于某些奇怪的原因,某些数据库值与数据流不匹配。但并不是每个条目都适用。例如,下面是我的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);
}
}
函数转储($csvFile,$conn){
if($handle=fopen($csvFile,'r'))!==false){
$header=fgetcsv($handle);
$id=0;
$sql=“截断表存货价格”;
$sth=$conn->prepare($sql);
$sth->execute();
while(($data=fgetcsv($handle))!==false){
$sql=“插入“库存价格”(sku、零件状态、msrp、当前零售价、您的价格)
值(“$id”、“$data[0]”、“$data[1]”、“$data[2]”、“$data[3]”);
打印(数据);
试一试{
$conn->query($sql);
}
捕获(PDO$e){
打印“错误!:”$e->getMessage()。“
”; 模具(); } $id++; } fclose($handle); } }

打印到控制台的
$data
与CSV文件匹配。我不确定某些行如何或为什么将值更改为
999.99

最可能的解释是,该列被定义为数据类型
十进制(5,2)
,它只允许小数点前的三位数字。并且错误/警告被忽略

存储在列中的值是可存储在该数据类型中的最大值。我们也观察到整数值的类似行为


另一方面,代码似乎容易受到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();

是的,最奇怪的情况是行动。我有一种感觉,这和你所指出的有关。啊,当一个人看到一个绿色的痒痒,把它标记为已解决时,我喜欢它。路要走;-)就准备好的语句而言,我可以用截短的方法来准备吗?或者我必须使用上面显示的方法吗?@AWood:不要求准备好的语句必须使用绑定占位符和
bindParam
。但是,使用预先准备好的语句进行插入,而不使用绑定占位符将是很奇怪的。这将无视事先准备好的声明的存在。
  $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();