将excel中的行数据与php

时间:2018-02-09 07:05:14

标签: php

$emapData[3]是excel中的第4行输入数据,我如何将$emapData[3]$categories匹配,这是一个数组。就像$emapData[3](row 4 excel input , so if user puts AMT 1) = {AMT 1}存在于$categories数组中一样,它会将5801D447D5583插入数据库,这是AMT 1的值。此外,无论用户输入什么,它都会与类别数组匹配,它存在。我在下面尝试过。

 $filename=$_FILES["file"]["tmp_name"];
        if($_FILES["file"]["size"] > 0)
        {
            $file = fopen($filename, "r");
            $count = 0;
            $stud_id = strtoupper(uniqid());
            $categories=array("5801D447D5583" => "AMT 1","5801D447D5583" => "AMT 2","5801D457CAF7F" => "AMT 3");
            while (($emapData = fgetcsv($file, 10000, ",")) !== FALSE)
            {
                $count++;
                $stud_id = strtoupper(uniqid());
                $added_by = $_SESSION['userid'];
                if($count > 1) {
                echo $count;
                $sql = "INSERT into students(stud_id ,stud_no , first_name , last_name, date_added ,added_by) values ('$stud_id','$emapData[0]','$emapData[1]', '$emapData[2]' ,NOW(), '$added_by')";

                $emapData[3] = $categories['AMT 1'];
                $sql1 = "INSERT into categories(student_id ,category_id ) values ('$stud_id','$emapData[3]')";



                mysql_query($sql);

            }

1 个答案:

答案 0 :(得分:0)

我会使用数组搜索

http://php.net/manual/en/function.array-search.php

  

array_search - 在数组中搜索给定值,并在成功时返回第一个相应的键

类似

$value = array_search('AMT 1', $categories);

输出:

5801D447D5583

正如你所说的那样

  

$ emapData [3]是excel中的第4行输入数据,我如何将$ emapData [3]与$ classes作为数组匹配。就像$ emapData [3](第4行excel输入,所以如果用户放AMT 1)= = AMT 1

你会像array_search($emapData[3], $categories);

这样的东西

但我会检查是否通过

找到了它
if( $value !== false)

注意 - 您需要使用检查类型的!==,因为在某些情况下,数组搜索可以返回索引0,这在PHP中是错误的。在您的特定情况下,您没有索引0,但无论如何它都是良好的做法。如果您阅读PHP文档,特别是此警告。

  

警告此函数可能返回布尔值FALSE,但也可能返回非布尔值,其值为FALSE。有关更多信息,请阅读有关布尔值的部分。使用===运算符测试此函数的返回值。

这就是它的意思。

干杯。

<强>更新

代码中的这一行

 $emapData[3] = $categories['AMT 1'];

我至少会替换

 $emapData[3] = array_search($emapData[3], $categories);
 if(false !== $emapData[3]){
    //insert
 }else{
    //do something else?
 }

然而,还有很多其他&#34; Stuff&#34;例如使用在PHP7中删除的mysql_系列函数,以及直接将数据插入到查询中,这是一个安全问题,即使是从文件中也是如此。它叫做SQL Injection。

就我个人而言,我不会覆盖$emapData[3]而是使用单独的变量,但我认为这是您最不担心的问题。

但是这些事情超出了这个问题的范围,但我强烈建议使用像PDO和预备语句这样的东西。

<强> UPDATE1

这段代码      while(($ emapData = fgetcsv($ file,10000,&#34;,&#34;))!== FALSE)      {      ///..other代码       if($ count&gt; 1){//缺少关闭}             echo $ count;             $ sql =&#34; INSERT into students(stud_id,stud_no,first_name,last_name,date_added,added_by)值(&#39; $ stud_id&#39;,&#39; $ emapData [0]&#39;,& #39; $ emapData [1]&#39;,&#39; $ emapData [2]&#39;,NOW(),&#39; $ added_by&#39;)&#34;;

        $emapData[3] = $categories['AMT 1'];
        $sql1 = "INSERT into categories(student_id ,category_id ) values ('$stud_id','$emapData[3]')";

        mysql_query($sql);
  } //end while

你注意除了错过我在评论中指出的结尾},你永远不会打电话给mysql_query($sql1);所以第二次插入永远不会被执行。

好的...所以简单的解决方法就是像这样添加:

 while (($emapData = fgetcsv($file, 10000, ",")) !== FALSE)
 {
 ///..other code
  if($count > 1) { //missing closing }
        echo $count;
        $sql = "INSERT into students(stud_id ,stud_no , first_name , last_name, date_added ,added_by) values ('$stud_id','$emapData[0]','$emapData[1]', '$emapData[2]' ,NOW(), '$added_by')";
        mysql_query($sql);

        $emapData[3] = $categories['AMT 1'];
        $sql1 = "INSERT into categories(student_id ,category_id ) values ('$stud_id','$emapData[3]')";
        mysql_query($sql1);
  } //end while

您会注意到我移动了第一个mysql_query($sql);,这只是为了方便起见,您创建了一个查询并执行它。因此,创建1个查询执行它更好,然后创建第二个查询并执行它,这两个东西是彼此独立的独立操作。

最后一点是我不确切知道你是如何处理原始问题的,但把它们放在一起应该是这样的:

 while (($emapData = fgetcsv($file, 10000, ",")) !== FALSE)
 {
 ///..other code
  if($count > 1) { 
        echo $count;

        $emapData[3] = array_search($emapData[3], $categories);
       if(false !== $emapData[3]){
              $sql = "INSERT into students(stud_id ,stud_no , first_name , last_name, date_added ,added_by) values ('$stud_id','$emapData[0]','$emapData[1]', '$emapData[2]' ,NOW(), '$added_by')";
              mysql_query($sql);

              $emapData[3] = $categories['AMT 1'];
              $sql1 = "INSERT into categories(student_id ,category_id ) values ('$stud_id','$emapData[3]')";
              mysql_query($sql1);
        }else{
            /*
               do something else?
               It's a question as I have no way to know the importance of
               the array search to the insert, maybe it's ok if it's null.
               maybe that is an error that ruins one or both inserts?
               So without knowing that, I have no idea on the exact
               implementation of non-matching states.
             */
        } 
     }//end if $count
  } //end while