2010-05-21 4 views
1

OK, 난 놀랐어. 데이터베이스에서 (로컬로) 쿼리를 실행하려고하는데 연결 재설정 오류가 계속 발생합니다. 나는 일반적인 DAO 클래스에서 아래의 메소드를 사용하여 쿼리 문자열을 작성하고 Zend_Db API에 전달했습니다.MySQL 쿼리에서 연결 재설정

public function insert($params) { 
    $loop = false; 
    $keys = $values = ''; 
    foreach($params as $k => $v){ 
     if($loop == true){ 
      $keys .= ','; 
      $values .= ','; 
     } 
     $keys .= $this->db->quoteIdentifier($k); 
     $values .= $this->db->quote($v); 
     $loop = true; 
    } 

    $sql = "INSERT INTO " . $this->table_name . " ($keys) VALUES ($values)"; 

    //formatResult returns an array of info regarding the status and any result sets of the query 
    //I've commented that method call out anyway, so I don't think it's that 
    try { 
     $this->db->query($sql); 
     return $this->formatResult(array(
       true, 
       'New record inserted into: '.$this->table_name 
     )); 
    }catch(PDOException $e) { 
     return $this->formatResult($e); 
    } 
} 

지금까지이 잘 근무하고있다 - 우리는 사용자 입력을 기록하는 새 테이블을 생성하기 때문에 오류가 발생하고있다. 삽입 문자열은 다음과 같습니다 여기

INSERT INTO tablename(`id`,`title`,`summary`,`description`,`keywords`,`type_id`,`categories`) VALUES ('5539','Sample Title','Sample content',' 
\'Lorem ipsum dolor sit amet, consectetur adipiscing elit. In et pellentesque mauris. Curabitur hendrerit, leo id ultrices pellentesque, est purus mattis ligula, vitae imperdiet neque ligula bibendum sapien. Curabitur aliquet nisi et odio pharetra tincidunt. Phasellus sed iaculis nisl. Fusce commodo mauris et purus vehicula dictum. Nulla feugiat molestie accumsan. Donec fermentum libero in risus tempus elementum aliquam et magna. Fusce vitae sem metus. Aenean commodo pharetra risus, nec pellentesque augue ullamcorper nec. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nullam vel elit libero. Vestibulum in turpis nunc.\'','this,is,a,sample,array',1,'category title') 

는 쿼리 (위해서 var_dump) 조립하기 전에 점점 매개 변수입니다

array 
    'id' => string '1' (length=4) 
    'title' => string 'Sample Title' (length=12) 
    'summary' => string 'Sample content' (length=14) 
    'description' => string '<p>'Lorem ipsum dolor sit amet, consectetur adipiscing elit. In et pellentesque mauris. Curabitur hendrerit, leo id ultrices pellentesque, est purus mattis ligula, vitae imperdiet neque ligula bibendum sapien. Curabitur aliquet nisi et odio pharetra tincidunt. Phasellus sed iaculis nisl. Fusce commodo mauris et purus vehicula dictum. Nulla feugiat molestie accumsan. Donec fermentum libero in risus tempus elementum aliquam et magna. Fusce vitae sem metus. Aenean commodo pharetra risus, nec pellentesque augue'... (length=677) 
    'keywords' => string 'this,is,a,sample,array' (length=22) 
    'type_id' => int 1 
    'categories' => string 'category title' (length=43) 

전화의 다음 포트가 테이블에 한계를 확인했습니다, 그 이후 '설명'의 길이가 300 자 (약 310 - 330) 인 경우 삽입하는 것입니다. 필드 제한은 VARCHAR (1500)로 설정되며이 필드의 유효성 검사는 HTML이있는 1200보다 크거나 800이없는 항목을 허용하지 않습니다.

진짜 키커는이 SQL 문자열을 가져 와서 명령 줄을 통해 실행하면 정상적으로 작동하므로 나에게 잘못된 것이 무엇인지 파악할 수 없다는 것입니다.

나는 서버 매개 변수 즉 Unexpected Connection Reset: A PHP or an Apache issue?

그래서, 간단히 말해서, 내가 난처한 상황에 빠진거야 확장 시도했습니다. 어떤 아이디어?

답변

1

이 문제가 발생한 다른 사용자는 문제가 Zend_Db_Statement 또는이 구성 요소가 사용하는 preg 라이브러리와 관련이 있습니다. Zend 이슈 추적기에 플래그가 지정되었습니다 : http://framework.zend.com/issues/browse/ZF-8399, Zend lib의 문제는 아닙니다. 서버 환경에 따라이 문제가 발생할 수도 있고 그렇지 않을 수도 있습니다.

윈 XP, WAMP 2 PHP 5.3

그것은 PDO (효과적으로 어댑터를 통해 SQL을 직접 실행

db->getConnection()->exec($sql) 

를 사용하여 해결할 수 있습니다 : 내 경우,이 오류에 발생 기타). 또는 PCRE 자체에서 segfaulting을 수정하기 위해 서버를 수정할 수 있습니다 (필자는이 방법에 대해 어떻게 확신 할 지 확신하지 못함). 즉 MySQL의 쿼리를 수행 할 때 다시 인터넷 검색 및 연결에 대한이 게시물을 찾을 수 있습니다 사람들을 위해 동일한 문제

+0

많은 도움을 주셔서 감사합니다. :) Btw, 그건'$ db-> getConnection() -> exec ($ sql)' – Znarkus

+0

thx! 나는 구문을 수정했다. – sunwukung

0

정확한 오류 메시지를 게시 할 수 있습니까 (PDO를 사용하는 경우 $ this-> db-> errorInfo())? DB 연결을 설정 했습니까?

+0

연결이 재설정되므로 어떤 스크립트 출력도 출력되지 않습니다. – sunwukung

+0

PDO :: ERRMODE_SILENT를 false로 설정하면 어떻게됩니까? –

+0

아니, 아직도 죽는다. 신선한 PDO 인스턴스를 만들면 괜찮습니다. Zend_API가 손상 될 때마다 발생합니다. – sunwukung

0

와 다른 사람을 도움이되기를 바랍니다 : 또한 확인하시기 바랍니다 sunwukung에서 답에서 제외하고

을 병이있는 경우 그 -neck (특히 MySQL 설정에서) :

max_allowed_packet = 1M 

더 큰 수로 변경할 수 있습니다. 여기 내 것이 있습니다 :

max_allowed_packet = 32M 

이제 작동합니다.

설명 : 설정 이름에서 읽을 수 있듯이

, 연결 재설정 MySQL의 연결을 "종료"하는,에서와 MySQL의 외출 너무 큰 데이터 세트의 주로 결과이다.

관련 문제