0

它运行的环境如下。它是拇指驱动器上的 Server2Go 实例。

Apache/2.2.15 (Win32),
PHP/5.3.2,
SQLite 2,
MySQL 5.1.46-community,
 and Perl 5.8.

php 脚本打开一个文件并逐行循环。使用文件每一行中的信息构建和执行查询。

表结构如下:

CREATE TABLE `exp_report` (
  `b_unit` varchar(11) DEFAULT NULL,            //IMPORTANT TO THIS PROBLEM
  `b_unit_title` varchar(255) DEFAULT NULL,
  `act_code` varchar(11) DEFAULT NULL,
  `act_title` varchar(255) DEFAULT NULL,
  `adopted_bgt` varchar(20) DEFAULT NULL,
  `amended_bgt` varchar(20) DEFAULT NULL,
  `encumb` varchar(20) DEFAULT NULL,
  `ytd_exp` float(14,2) DEFAULT NULL,           //IMPORTANT TO THIS PROBLEM
  `encumb_ytdexp` float(14,2) DEFAULT NULL,     //IMPORTANT TO THIS PROBLEM
  `available_bgt` varchar(20) DEFAULT NULL,
  `percent` varchar(20) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

执行脚本时,我会回显在 php 脚本中执行查询之前和之后生成的查询语句。这是为了确保 PHP 中的数据不会发生任何奇怪的事情。

示例输出:

INSERT INTO exp_report (b_unit, b_unit_title, act_code, act_title, adopted_bgt, 
                        amended_bgt, encumb, ytd_exp, encumb_ytdexp, available_bgt,
                        percent
                       )
   VALUES('01000101', 'COUNCIL', '414000', 'SALARIES & WAGES', '259500','214500',
          '0', '2', '209296.72', '5203.28', '0.97574228'
         ); 

数据库中的结果如下所示:

010001 | COUNCIL | 414000 | SALARIES & WAGES | 259500 | 214500 | 0 | 2.00 | 2.00 | 5203.28 | 0.97574228

请注意上述数据的第一个字段和最后 4 个字段。

第一个字段是b_unitvarchar(11)`,程序尝试插入 01000101,但最后两位数字在存储到数据库时被截断。

接下来的两个字段是ytd_expfloat(14,2) 和encumb_ytdexpfloat(14,2)。我尝试在 encumb_ytdexp 中插入“209296.72”并将其转换为 2.00。

其余两个字段是 varchars,它们正确存储信息。

如果我将回显到浏览器的查询复制并在 phpMyAdmin 中运行,则数据将正确存储,并且看起来与查询语句中传递的内容完全相同。

我似乎无法弄清楚是什么导致了这种行为。

任何建议表示赞赏。

php脚本的代码:

<?php 
include('includes\db_fns.php');

$filename = "d2013expRep.xls";

$lines = file($filename);



foreach($lines as $key=>$current){
    $contents = explode("\t",$current);
    if($key=="0"){
        continue;
    }
    $actr = 0;
    //var_dump($contents);
    foreach($contents as $key2=>$c2){
        $la = trim($c2);

        if($actr==0){
            $finout .= "'".$la."'"; 
        }else{
            if($key2=="7"){
                $la = (float) $la;
                $finout .= ",'".$la."'";
            }else{
                $finout .= ",'".$la."'";
            }
        }

        $actr++;    
        unset($la);
    }

    $query = "INSERT INTO exp_report (b_unit,b_unit_title,act_code,act_title,adopted_bgt,amended_bgt,encumb,ytd_exp,encumb_ytdexp,available_bgt,percent) VALUES($finout); ";
    //echo($query."<BR><BR><BR>");
    $result =  mysqli_query($dc2a,$query) or trigger_error("Failed Query: " . mysqli_error($dc2a)); 
    $finout .= "\r\n";
    echo $query."<BR><BR><BR>";
    unset($finout);
    unset($actr);
}

//$query = "LOAD DATA LOCAL INFILE '/Library/WebServer/Documents/".$filename."' INTO TABLE exp_report FIELDS TERMINATED BY '\s\t' LINES TERMINATED BY '\n' IGNORE 1 LINES ";
//$result = mysqli_query($dc2a,$query) or trigger_error("Failed Query: " . mysqli_error($dc2a)); 
//echo $query;


?>

我尝试了所有受访者的建议,但无济于事。也许这些镜头将有助于阐明这个问题。

一旦脚本执行,数据就会被插入到数据库中。我使用的是文本/字符串,而不是数字/小数/浮点数。现在数据库告诉我记录不存在,而我知道它们存在。

这是我选择浏览时表格结果的图像。

当我使用 like 执行查询时,结果是一个空集。我正在搜索的字段设置为文本字段。

为什么查询会在这里返回一个空结果。

这对任何人都有意义还是我在追鬼?

4

1 回答 1

0

很难从您发布的内容中看出什么问题

确保读取的文件是正确的制表符分隔的文本文件:也许我错了,但从扩展名.xls看来您正在尝试读取本机 Excel 二进制文件(当我从 Excel 中保存为制表符分隔的值时,我得到.txt了扩展名但我在Mac上...)

我重写了您的代码以更清晰

另外(这可能会解决问题)我添加了 3 件事:

  1. 在插入字符串之前,每个值都会被转义。例如,如果该值包含单引号,这将节省您的时间

  2. 我将字段名称括在反引号之间以避免潜在的 mysql 保留关键字冲突。

编辑:

  1. 看来您正在解析 UTF-16 文件。阅读该行后,它被转换为 UTF8。

希望这可以帮助

<?php 
include('includes\db_fns.php');

$filename = "d2013expRep.xls"; // <--- make sure you're importing properly tab separated text data (are you importing an xls file??)

$lines = file($filename);

foreach($lines as $lineNum => $line) {
    // It seem you're working with a UTF-16 text file: convert to UTF8
    $lineUTF8 = mb_convert_encoding( $line, "UTF-8", "UTF-16LE" );
    $contents = explode( "\t", $lineUTF8 );
    if($lineNum==0) {
        continue;
    }

    $queryValues = "";

    foreach( $contents as $valueNum => $value ) {
        // good practice to escape the string
        $queryValues .= ( $valueNum == 0 ? "" : ", " ) . "'" . mysql_escape_string( trim( $value ) ) . "'"; 
    }

    // backtick field names to avoid reserved keywords conflicts
    $query = "INSERT INTO `exp_report` ( `b_unit`,
                                         `b_unit_title`, 
                                         `act_code`, 
                                         `act_title`, 
                                         `adopted_bgt`, 
                                         `amended_bgt`, 
                                         `encumb`, 
                                         `ytd_exp`, 
                                         `encumb_ytdexp`, 
                                         `available_bgt`, 
                                         `percent` ) VALUES( $queryValues ); ";

    $result =  mysqli_query($dc2a,$query) or trigger_error("Failed Query: " . mysqli_error($dc2a)); 

    // echo $query . "<br /><br />";
}

?>
于 2014-03-16T01:31:28.550 回答