它运行的环境如下。它是拇指驱动器上的 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_unit
varchar(11)`,程序尝试插入 01000101,但最后两位数字在存储到数据库时被截断。
接下来的两个字段是ytd_exp
float(14,2) 和encumb_ytdexp
float(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 执行查询时,结果是一个空集。我正在搜索的字段设置为文本字段。
这对任何人都有意义还是我在追鬼?