数据库中有个工资数据表 主要结构如下
flow_id(存月份),user_name,S1,S2,S3,S4,S5,S6,S7,S8
工资项目表 主要结构如下:
item_id,item_namecsv格式:(根据工资项目表调整)
姓名、S1,S2,S3,S4,S5,S6,
读取方法如下(不是我写的这个方法)
function CSV2Array( $content, $title = array( ), $delimiter = ",", $enclosure = "\"", $optional = 1 )
{
$content = trim( $content );
$content = str_replace( "\r", "", $content );
$reg = "/((".$enclosure.")".( $optional ? "?(?(2)" : "(" )."[^".$enclosure."]*".$enclosure."|[^".$delimiter."\\n]*))(".$delimiter."|\\n)/smi";
preg_match_all( $reg, $content, $treffer );
$linecount = 0;
$i = 0;
for ( ; $i <= count( $treffer[3] ); ++$i )
{
$field = $treffer[1][$i];
if ( $field[0] == $enclosure && $field[strlen( $field ) - 1] == $enclosure )
{
$field = substr( $field, 1, -1 );
}
$liste[$linecount][] = str_replace( $enclosure.$enclosure, $enclosure, $field );
if ( $treffer[3][$i] != $delimiter )
{
++$linecount;
}
}
if ( !is_array( $title ) && count( $title ) == 0 || count( $liste ) == 0 )
{
return $liste;
}
$field_map = array( );
while ( list( $key, $value ) = each( &$title ) )
{
if ( ( $index = array_search( $key, $liste[0] ) ) !== FALSE )
{
$field_map[$value] = $index;
}
}
$lines = array( );
$i = 1;
for ( ; $i < $linecount; ++$i )
{
$line = array( );
reset( &$field_map );
while ( list( $key, $value ) = each( &$field_map ) )
{
$line[$key] = $liste[$i][$value];
}
$lines[] = $line;
}
return $lines;
}
导入页面如下(导入时提示 未注册、也没有给出名字,经过测试发射 USER_NAME没有取到值 不知道哪里错了,请大侠帮忙看、可以留qq联机看最好,或者加我qq:271663858)
<?phpinclude_once( "inc/auth.php" );
include_once( "inc/utility_all.php" );
echo "<html>\r\n<head>\r\n<title>导入数据</title>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=gb2312\">\r\n</head>\r\n<body class=\"bodycolor\" topmargin=\"5\">\r\n";
if ( $FILE_NAME == "" )
{
$query = "SELECT count(*) from SAL_DATA where FLOW_ID='".$FLOW_ID."'";
$cursor = exequery( $connection, $query );
if ( $ROW = mysql_fetch_array( $cursor ) )
{
$ROW_COUNT = $ROW[0];
}
echo "<script Language=\"JavaScript\">\r\nfunction CheckForm()\r\n{\r\n   if(document.form1.CSV_FILE.value==\"\")\r\n   { alert(\"请选择要导入的文件!\");\r\n     return (false);\r\n   }\r\n\r\n   if (document.form1.CSV_FILE.value!=\"\")\r\n   {\r\n     var file_temp=document.form1.CSV_FILE.value,file_name;\r\n     var Pos;\r\n     Pos=file_temp.lastIndexOf(\"\\\\\");\r\n     file_name=file_temp.substring(Pos+1,file_temp.length);\r\n     document.form1.FILE_NAME.value=file_name;\r\n   }\r\n\r\n   return (true);\r\n}\r\n</script>\r\n\r\n  <table border=\"0\" width=\"100%\" cellspacing=\"0\" cellpadding=\"3\" class=\"small\">\r\n    <tr>\r\n";
if ( $ROW_COUNT != 0 )
{
echo "      <td class=\"Big\"><img src=\"/images/sys_config.gif\" align=\"absmiddle\"><span class=\"big3\"> 导入CSV工资数据(该流程已录入过数据)</span><br>\r\n      </td>\r\n";
}
else
{
echo "      <td class=\"Big\"><img src=\"/images/sys_config.gif\" align=\"absmiddle\"><span class=\"big3\"> 导入CSV工资数据</span><br>\r\n      </td>\r\n";
}
echo "    </tr>\r\n  </table>\r\n\r\n  <br>\r\n  <br>\r\n\r\n  <div align=\"center\" class=\"Big1\">\r\n  <b>请指定用于导入的CSV文件:</b>\r\n  <form name=\"form1\" method=\"post\" action=\"import.php?FLOW_ID=";
echo $FLOW_ID;
echo "\" enctype=\"multipart/form-data\" onSubmit=\"return CheckForm();\">\r\n    <input type=\"file\" name=\"CSV_FILE\" class=\"BigInput\" size=\"30\">\r\n    <input type=\"hidden\" name=\"FILE_NAME\">\r\n    <input type=\"hidden\" name=\"GROUP_ID\" value=\"";
echo $GROUP_ID;
echo "\">\r\n    <input type=\"submit\" value=\"导入\" class=\"BigButton\">\r\n  </form>\r\n\r\n  <br>\r\n  <input type=\"button\" value=\"返回\" class=\"BigButton\" onClick=\"location='index.php'\">\r\n  ";
if ( $FILE_NAME == "" )
{
message( "说明", "1)EXECL的工资报表的列顺序为姓名、工资项目,将部门、职务等列删除;<BR>2)将改好的EXECL工资报表另存为CSV格式的文件;" );
}
echo "\r\n  </div>\r\n";
exit( );
}
if ( strtolower( substr( $FILE_NAME, -3 ) ) != "csv" )
{
message( "错误", "只能导入CSV文件!" );
button_back( );
exit( );
}
$query = "SELECT ITEM_ID ,ITEM_NAME from SAL_ITEM";
$cursor = exequery( $connection, $query );
$title = array( );
while ( $ROW = mysql_fetch_array( $cursor ) )
{
$ITEM_NAME = $ROW['ITEM_NAME'];
$ITEM_ID = "S".$ROW['ITEM_ID'];
$title[$ITEM_NAME] = $ITEM_ID;
}
$title += array( "姓名" => "USER_NAME" );
$ROW_COUNT = 0;
$data = file_get_contents( $CSV_FILE );
$lines = csv2array( $data, $title, "\t" );
if ( !$data )
{
message( "错误", "打开文件错误!" );
button_back( );
exit( );
}
$query = "DELETE FROM `SAL_DATA` WHERE `FLOW_ID` = '".$FLOW_ID."'";
$cursor = exequery( $connection, $query );
foreach ( $lines as $line )
{
$STR_VALUE = "";
$STR_KEY = "";
foreach ( $line as $key => $value )
{
if ( $key != "USER_NAME" )
{
$STR_KEY .= $key.",";
$STR_VALUE .= "'".$value."',";
}
else
{
$USER_NAME = $value;
}
}
if ( substr( $STR_KEY, -1 ) == "," )
{
$STR_KEY = substr( $STR_KEY, 0, -1 );
}
if ( substr( $STR_VALUE, -1 ) == "," )
{
$STR_VALUE = substr( $STR_VALUE, 0, -1 );
}
$query = "insert into SAL_DATA(FLOW_ID,USER_ID,";
$query1 = "SELECT USER_ID from USER where USER_NAME='".$USER_NAME."'";
$cursor1 = exequery( $connection, $query1 );
if ( !( $ROW = mysql_fetch_array( $cursor1 ) ) )
{
echo "<font color=#FF6633><b>员工".$USER_NAME."尚未在OA系统中注册!!</b></font><br>";
}
else
{
$query .= $STR_KEY.( ") values ('".$FLOW_ID."','{$ROW['0']}'," ).$STR_VALUE.")";
exequery( $connection, $query );
echo "员工".$USER_NAME."的工资导入完成!!<br>";
++$ROW_COUNT;
}
}
if ( file_exists( $CSV_FILE ) )
{
@unlink( $CSV_FILE );
}
message( "", "共".$ROW_COUNT."条数据导入!" );
echo "<div align=\"center\">\r\n<input type=\"button\" value=\"返回\" class=\"BigButton\" onClick=\"location='index.php';\" title=\"返回\">\r\n</div>\r\n\r\n</body>\r\n</html>\r\n";
?>

解决方案 »

  1.   


    <?phpinclude_once( "inc/auth.php" );
    include_once( "inc/utility_all.php" );
    改成
    <?phpinclude_once( "inc/auth.php" );
    include_once( "inc/utility_all.php" );
    $USER_NAME='';
    确定:
    foreach ( $lines as $line )
    {
    $STR_VALUE = "";
    $STR_KEY = "";
    foreach ( $line as $key => $value )
    {
    if ( $key != "USER_NAME" )
    {
    $STR_KEY .= $key.",";
    $STR_VALUE .= "'".$value."',";
    }
    else确定 $lines的值,$key的值,$key != "USER_NAME"的值,$value的值
      

  2.   

    代码太烂,有没有测试数据,无法查找出错原因
    仅提几点供参考
    1、EXECL 导出 csv 是,标题行同时被导出。处理时应去除。不知你做了没有
    2、php 已经提供了 fgetcsv 函数,用于读取 csv 文件,为什么不用?
    3、mysql 可以将不含标题行的 csv 文件导入(loadfile),可以尝试一下
    4、在 $lines = csv2array( $data, $title, "\t" ); 之后
    打印出 $lines 的内容,一般就可以找到问题所在
      

  3.   

    我要做的是导入、 csv 格式中有标题的 (对应数据库表列名)
    错误原因是在走到逻辑
    foreach ( $lines as $line )
    {
    $STR_VALUE = "";
    $STR_KEY = "";
    foreach ( $line as $key => $value )
    {
    if ( $key != "USER_NAME" )
    {
    $STR_KEY .= $key.",";
    $STR_VALUE .= "'".$value."',";
    }
    else
    {
    $USER_NAME = $value;
    }
    }
    if ( substr( $STR_KEY, -1 ) == "," )
    {
    $STR_KEY = substr( $STR_KEY, 0, -1 );
    }
    if ( substr( $STR_VALUE, -1 ) == "," )
    {
    $STR_VALUE = substr( $STR_VALUE, 0, -1 );
    }
    $query = "insert into SAL_DATA(FLOW_ID,USER_ID,";
    $query1 = "SELECT USER_ID from USER where USER_NAME='".$USER_NAME."'";
    $cursor1 = exequery( $connection, $query1 );
    if ( !( $ROW = mysql_fetch_array( $cursor1 ) ) )
    {
    echo "<font color=#FF6633><b>员工".$USER_NAME."尚未在OA系统中注册!!</b></font><br>";
    }
    处  页面给出了 尚未在OA系统中注册! 这个提示
    打个比方 我数据库中有个员工a   导入的csv 中有条数据 a 、1、2、3、4   导入的时候 提示 尚未在OA系统中注册 连a都没有打印出来各位大侠 我是童鞋 请帮忙啊
      

  4.   

    关键是我没有看懂那个自定义方法,如何把csv文件中的数据 按照表头的标题  分成 数组
      

  5.   

    print_r($lines);
    贴出结果,片段就行