Connection Redefinir na consulta do MySQL

1

OK, eu estou desconcertado. (Eu já fiz esta pergunta sobre o Stack - mas eu preciso consertá-lo, então estou perguntando aqui também - qualquer ajuda é MUITO apreciada) Estou tentando executar uma consulta em um banco de dados (localmente) e continuo recebendo um erro de redefinição de conexão. Eu tenho usado o método abaixo em uma classe DAO genérica para criar uma seqüência de consulta e passar para a API Zend_Db.

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);
    }
}

Até agora, isso funcionou bem - os erros vêm ocorrendo desde que geramos novas tabelas para registrar a entrada do usuário. A string de inserção é assim:

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') 

Aqui estão os parâmetros que está obtendo antes de montar a consulta (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)

O próximo porto de escala foi verificar os limites na tabela, já que parece inserir se o comprimento de "descrição" está em torno da marca 300 (varia entre 310 - 330). O limite de campo é definido como VARCHAR (1500) e a validação neste campo não permitirá nada além de 1200 com HTML, 800 sem.

O kicker real é que, se eu pegar essa string sql e executá-la pela linha de comando, ela funcionará bem - então, não posso, na minha vida, descobrir o que há de errado.

Eu tentei estender os parâmetros do servidor, ou seja, link

Então, em poucas palavras, estou perplexo. Alguma idéia?

    
por sunwukung 21.05.2010 / 13:05

3 respostas

1

OK, para qualquer um que tenha esse problema - o problema é com o Zend_Db_Statement - ou melhor, a biblioteca preg usada por esse componente. Ele foi sinalizado no rastreador de problemas do Zend: link , mas não é estritamente um problema com o lib Zend. Você pode ou não enfrentar esse problema, dependendo do ambiente do servidor. No meu caso, esse erro ocorreu em:

Win XP, Wamp 2 PHP 5.3

Pode ser resolvido usando

db->getConnection>exec($sql)

que efetivamente executa o sql diretamente através do adaptador (PDO etc). Alternativamente, você pode modificar seu servidor para retificar o segfaulting no próprio PCRE (embora eu confesse que não tenho certeza de como você faria isso). Espero que ajude alguém com o mesmo problema

    
por 23.05.2010 / 12:41
1

Se o SQL gerado funcionar quando você copiá-lo / colá-lo, ficaria tentado a dizer que é um problema com seu código.

Eu tenho uma classe de banco de dados semelhante, que insere um registro em uma tabela de log se ocorrer um erro de SQL. Uma vez eu modifiquei a rotina e fiz algo parecido com o que você descreveu, pois gerou um erro SQL, que chamou a função, que gerava um erro SQL, que chamava a função .... você pega a idéia:)

O que faz sua função $this->db->query($sql); ? Pode valer a pena olhar para ver se faz algo semelhante, ou apenas faz um mysql_query

    
por 21.05.2010 / 13:44
0

Já tentou ver o log de erros do MySQL? Eu também vi este erro quando as versões de cliente e servidor do MySQL são incompatíveis (cliente 5,5.x para 5.0, x servidor etc) e você está executando uma consulta que não é válida na versão do servidor, mas é válida com o cliente atual versão. Se esse for o caso, eu verificaria se a versão da API do Zend que você está usando é compatível com a versão do servidor MySQL que você está usando. O log de erros do MySQL no servidor deve pelo menos zerar você no servidor ou no cliente.

    
por 23.05.2010 / 10:17

Tags