2012-07-18 2 views
0

나는 데이터베이스에 데이터를 업로드하기 위해 symfony 1.4와 Doctrine에서 이전 작업을하고 있습니다.Doctrine Migration은 CSV 업로드에서 하나의 레코드 만로드합니다.

sfGuardUser 테이블에 일괄 적으로로드하려고 시도하는 CSV 파일이 있고 sfGuardUserGroup 그룹 ID로 사용자 ID를 일치시키고 sf_guard_user 테이블에로드합니다.

마이그레이션을 실행하면 CSV의 첫 번째 레코드 만로드됩니다. 로드 된 레코드가 올바르게 포맷 된 것 같습니다 (사용자 이름과 날짜 작성).

코드를 마이그레이션하기 전에 테스트 한 결과 올바르게 작동했습니다.

여기에 구문 오류가 있습니까? 아니면 올바르게 반복하도록 설정되어 있지 않습니까?

어쩌면 나는 완전히 그것을 방금했습니다.

PHP

public function up() 
     { 

      $fieldseparator = ","; 
      $lineseparator = "\n"; 
      $csvfile = "web/uploads/batchUpload.csv"; 

      $file = fopen($csvfile,"r"); 
      $size = filesize($csvfile); 

      $csvcontent = fread($file,$size); 

      fclose($file); 

      $lines = 0; 
      $queries = ""; 
      $linearray = array(); 

      foreach(explode($lineseparator,$csvcontent) as $line) { 

       //Clean it up 
       $lines++; 
       $line = trim($line," \t");  
       $line = str_replace("\r","",$line);  
       $line = str_replace("'","\'",$line); 
       $linearray = explode($fieldseparator,$line); 

       //build username 
       if (!$linearray[3]) { 
        $username = $linearray[0]; 
        $username = substr($linearray[0], 0, 1); 
        $username .= $linearray[1]; 
        $username = strtolower($username); 
        $linearray[3] = $username; 
       } 

       //add sha1 algorithm 
       if (!$linearray[4]) { 
        $linearray[4] = "sha1"; 
       } 

       //add is_active 
       if(!$linearray[7]) { 
        $linearray[7] = "1"; 
       } 

       //add current date to login, created and updated 
        $now = getdate();   
        if ($now['mday'] < 10) { 
         $now['mday'] = str_pad($now['mday'], 2, "0", STR_PAD_LEFT); 
        }   
        if ($now['hours'] < 10) { 
        $now['hours'] = str_pad($now['hours'], 2, "0", STR_PAD_LEFT); 
        }  
        if ($now['minutes'] < 10) { 
        $now['minutes'] = str_pad($now['minutes'], 2, "0", STR_PAD_LEFT); 
        }  
        if ($now['seconds'] < 10) { 
        $now['seconds'] = str_pad($now['seconds'], 2, "0", STR_PAD_LEFT); 
        } 
        $linearray[10] = $now['year']. "-" .$now['mon']. 
          "-".$now['mday']." ".$now['hours'].":".$now['minutes'].":" 
          .$now['seconds']; 
        $linearray[11] = $now['year']. "-" .$now['mon']. 
          "-".$now['mday']. " ".$now['hours'].":".$now['minutes']. 
          ":".$now['seconds']; 


      //load up sql 
      $linemysql = implode("','",$linearray);  
      $conn = Doctrine_Manager::getInstance()->connection(); 
      $query = "INSERT INTO sf_guard_user VALUES ('', '$linemysql');"; 

      //$queries .= $query . "\n"; 
      $conn->execute($query); 

      //Add userID to group table 
      $conn = Doctrine_Manager::getInstance()->connection(); 
      $getFirstID = Doctrine::getTable('sfGuardUser')->orderBy('id DESC') 
        ->limit(1)->execute(); 
      $id = $getFirstID['id']; 
      $query = "INSERT INTO sf_guard_user_group ('$id', 5, '$linearray[10]',   '$linearray[11]');"; 
      $conn->execute($query); 
      $query = "INSERT INTO sf_guard_user_group ('$id', 14, '$linearray[10]', '$linearray[11]');"; 
      $conn->execute($query); 
     }// close foreach split 
} 

내가 마지막으로로드 ID를 얻고 GuardUserGroup의 GROUP_ID과 일치하도록 노력하고 두 번째 쿼리를 제거하면, 작동

UPDATE. 그래서 우리는 범위를 좁히고 내 오류가 //Add userID to group table 섹션에 있다고 생각합니다.

+0

복사 또는 풀은 맞다? 오류가 있기 때문에,'$ linearray [10] = $ now [ 'year'] 다음의 행. "-". $ now [ 'mon'].'(하이라이트 코드에 따라) – j0k

+0

실제 코드가 아닌 복사 오류였습니다. 하나의 긴 문자열보다 코드를 좀 더 읽기 쉽도록 만들려고합니다. 코드가 업데이트되었습니다. 감사합니다 –

답변

0

최신 ID 기록을 얻으려는 나의 쿼리가 UPdated되었습니다. 주요 문제는 $ id가 여전히 쿼리의 배열이라고 생각합니다. 나는 이것 같이 그것을 끊었다 :

//Add userID to group table 
$getFirstID = Doctrine::getTable('sfGuardUser')->createQuery()->select('MAX(id) as id')->fetchArray(); 
**$id = $getFirstID[0]; 
$id = $id['id'];** 
$q = "INSERT INTO sf_guard_user_group VALUES ('$id', 5, '$linearray[10]', '$linearray[11]');"; 
$conn->execute($q); 
$query = "INSERT INTO sf_guard_user_group VALUES ('$id', 14, '$linearray[10]', '$linearray[11]');"; 
$conn->execute($query); 
+0

'fetchOne()'을 대신 사용해 보셨습니까? – j0k

+0

그래서 $ getFirstID = Doctrine :: getTable ('sfGuardUser') -> createQuery() -> select ('MAX (id) as id') -> fetchArray(), $ getFirstID = Doctrine :: getTable ('sfGuardUser') -> createQuery() -> select ('MAX (id) as id') -> fetchOne(); 배열에 자동으로로드되지 않도록할까요? 나는 그것을 줄 것이다. 감사합니다 –

+1

'fetchOne'은'fetchArray'와 동일하지만 배열로 하나의 요소 만 검색합니다. 그래서, 그것은 당신이 원하는 것입니다. – j0k

관련 문제