2013-07-18 2 views
0

매우 큰 쿼리 문자열 (백만 초에 한 번만 사용하는 8000 개의 원시 문자열)을 작성했습니다. 문자열이있는 동안 추가되는 마지막 쉼표를 제거해야합니다. 지어지고있는 중.매우 긴 문자열에서 rtrim이 실패 함

마치 내 코드를보고 어떤 이유로 든 rtrim()이 아무 것도하지 않는 것처럼 보입니다. 문자열이 rtrim()에 전달되면 완전히 원래대로 반환됩니다.

(당신은 QUERY_STRING 값의 값의 사본이 필요하면 저에게 알려 주시면 너무 업로드 할 수 있습니다.)

public function sync_sites_table() 
{ 

    # $query_string = "TRUNCATE TABLE " . self::$table_name; 
    # $db->query($query_string); 

    $this->build_sites_object(); 

    $query_string = "INSERT INTO `".self::$table_name . "` (`site_id`, `site_name`) VALUES \n"; 

    foreach($this->sites_array as $key => $value) 
    { 
     $query_string .= "('".$key."','".$value."'), \n"; 
    } 

    rtrim($query_string, ","); 

    global $db; 
    $db->query($query_string); 

} 
+2

그것은 당신의 문자열, n' \, 당신은 단지 뒤에''을 제거 RTRIM 말하는 것 '으로 끝나는 문제가 있습니까? 결국 쉼표가 없으므로 – andrewsi

+0

검색어 문자열을 게시하면 도움이 될 수 있습니다. 너무 길면 * pastebin 사이트에 게시 할 수 있습니다. –

+0

@andrewsi 나는 그렇게 생각했다. 그러나 그것을 제거하는 것은 도움이되지 않았다. –

답변

0

rtrim()은 참조로 전달되지 않습니다.

$query_string = rtrim($query_string, ","); 

그러나 깨끗한 대답은 할 수 있습니다 : 그것은 손질이 변수에 할당해야 값 반환

$first = true; 
foreach($this->sites_array as $key => $value) 
{ 
    if (!$first) { $query_string .= ', '; } else { $first = false; } 
    $query_string .= "('".$key."','".$value."') \n"; 
} 

그래서 당신이 어떤 후행 트림 할 필요가 없습니다 것을 ,

+0

나는 더 깨끗한 방법을 따르고 있는지 확신하지 못한다. 언제/어디서 첫 번째 가치가 바뀌는가? –

+0

첫 번째 반복에서 $ first는 true로 설정됩니다. 그래서 코드는 $ first를 false로 설정하고 쿼리 문자열에 키/값을 추가합니다. 후속 반복에서는 $ first가 항상 false이므로 코드는 키/값을 쿼리 문자열에 추가하기 전에 쉼표를 추가합니다. 즉, 제거해야 할 후행 쉼표가 없을 것임을 의미합니다. –

+0

의미가 있습니다. 고맙습니다. –

0

당신은 substr($query_string,0,-1) 대신이 기능을 사용할 수 있습니다 rtrim($query_string, ",");

0
foreach($this->sites_array as $key => $value) 
{ 
    $query_string .= "('".$key."','".$value."'), \n"; 
} 

rtrim($query_string, ","); 

rtrim의 두 번째 매개 변수는 문자열의 끝에서 제거하려는 문자 목록입니다. 그러나 생성하는 문자열은 항상 , \n으로 끝나며 쉼표가 없습니다. 시도해 볼 수 있습니다 :

rtrim($query_string, ", \n"); 

어느 것이 좋습니다. 하지만 더 우아 할 수도 있습니다 :

$params = array(); 

foreach($this->sites_array as $key => $value) 
{ 
    $params[] = "('".$key."','".$value."')"; 
} 

$query_string .= implode (",", $params); 
+0

나는 rtrim이 실패하는 이유를 알아 내려고 노력하고 있지만이 해결책을 알고있었습니다. –

+1

Mark Baker의 코멘트가 그것을 설명한다고 생각합니다. 나는 그 자신을 알아야했다. ... – andrewsi

+0

그래, 그는 옳다. –

0

3 년 전에이 질문을했지만, 여전히 대답하는 것이 도움이 될 수 있다고 생각합니다.

최근 70Mb 크기의 문자열을 처리하는 것과 동일한 문제가 발생하여 임시로 증가하는 PHP의 ini 설정 memory_limit에 의해 해결되었습니다.

따라서 ini_set('memory_limit', '512M')을 사용하거나 php.ini 파일을 영구적 인 해결책으로 변경할 수 있습니다.

ps. memory_limit을 -1로 설정하면 PHP 메모리 사용이 제한되지 않지만주의해서 사용해야합니다.

의 memory_limit에 대한 자세한 : http://php.net/manual/en/ini.core.php#ini.memory-limit