Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

uiLhian

Uncaught exception 'PDOException' with message 'SQLSTATE[H

Recommended Posts

Bom estou tentando colocar uma paginação utilizando o PEAR só que estou com o seguinte problema quando vou "abrir" a pagina ele demora demais e me retorna os seguintes erros:

 

  •  

    • Warning: PDO::__construct(): MySQL server has gone away in E:\WebServer\class\PDO.class.php on line 18

      Warning: PDO::__construct(): Error while reading greeting packet. PID=2724 in E:\WebServer\class\PDO.class.php on line 18
    • Warning: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2006] MySQL server has gone away' in E:\WebServer\class\PDO.class.php:18 Stack trace: #0 E:\WebServer\class\PDO.class.php(18): PDO->__construct('mysql:host=loca...', 'root', '') #1 E:\WebServer\USBWebServer 8.5\Construtora\cwva\galeria.php(4): Conexao->__construct() #2 E:\WebServer\portifolio.php(57): require_once('E:\WebServer\...') #3 {main} thrown in E:\WebServer\class\PDO.class.php on line 18

      Fatal error: Maximum execution time of 30 seconds exceeded in E:\WebServer\class\PDO.class.php on line 18

    PDO.class.php

  •  

     

    <?php
    //ela herdará os métodos e atributos do PDO através da palavra-chave extends
    class Conexao extends PDO
    {
    //CONEXÃO COM BANCO DE DADOS
    private $dsn  = "mysql:host=localhost;port=3060;dbname=testando";
    private $user  = "root";
    private $senha  = "";
    public  $handle  = null;
    
    
    function __construct()
    {
    try
    {
    //HERDARÁ O PDO EM SI, USANDO parent::_construct()
    if ( $this->handle == null )
    {
    $dbh = parent::__construct( $this->dsn , $this->user , $this->senha );
    $this->handle = $dbh;
    return $this->handle;
    }
    }
    catch ( PDOException $e )
    {
    echo "Falha na Conexão - Erro: " . $e->getMessage(). " - Código: ".$e->getCode();
    return false;
    }
    }
    //FECHAR CONEXÃO
    function __destruct()
    {
    $this->handle = NULL;
    }
    }
    ?>

    galeria.php

     

     

    <?php
    require_once('class/PDO.Class.php');
    require_once('pager/Pager.php');
    $PDO = new Conexao;
    
    $listar = $PDO->query('SELECT * FROM obras ORDER BY obra_id DESC');
    $dados  = $listar->fetchAll(PDO::FETCH_OBJ);
    
    $params = array
    (
    'mode' => 'Sliding',
    'perPage' => 5,
    'itemData' => $dados
    );
    
    $pager = & Pager::factory($params);
    $data  = $pager->getPageData();
    
    $o = new ArrayIterator($data);
    while($o->valid()):
    ?>
    <li class="span3">
    <div class="thumbnail" id="<?php $o->current()->obra_id; ?>">
    <a href="portifolio.php?id=<?php $o->current()->obra_id; ?>">
    <img src="thumb.php?img=fotos/<?php $o->current()->obra_url; ?>" alt="">
    </a>
    <div class="caption">
    + informações
    </div>
    </div>
    </li>
    <?php
    $o->next();
    endwhile;
    ?>

    portifolio.php

     

    <div class="row-fluid">
    <ul class="thumbnails" id="galeria">
    <?php require_once('galeria.php'); ?>
    </ul>
    <div class="pagination pagination-right">
    <?php
    $links = $pager->getLinks();
    echo $links['all'];
    ?>
    </div>
    </div>

     

Compartilhar este post


Link para o post
Compartilhar em outros sites

o servidor de banco de dados morreu

Compartilhar este post


Link para o post
Compartilhar em outros sites

Verifique certas diretivas no php.ini, tais como:
- mysql.connect_timeout;
- default_socket_timeout.

 

Coloque um tempo alto para testes, como 300 segundos. Depois, verifique o porque está demorando a sua consulta, deve ter alguma coisa errada nela. Há quantos registros na tabela obras?

 

Como todo o trabalho é feito pelo PHP, se houver muitos registros, vai demorar bastante. Eu normalmente utilizo LimitIterator, mas começa a me dar problemas de lentidão com mais de 1500 registros.

Compartilhar este post


Link para o post
Compartilhar em outros sites

esses 3 itens podem te dar uma ideia do q esta acontecendo

 

MySQL server has gone away

 

SQLSTATE[HY000] [2006]


Maximum execution time of 30 seconds exceeded

Compartilhar este post


Link para o post
Compartilhar em outros sites

- mysql.connect_timeout = 200
- default_socket_timeout. =

 

- tem uns 20 registros ainda só.



isso aqui é correto ?

 


$o = new ArrayIterator($data);

foreach($obras as $e => $o->valid()){

o código em si:

 

$listar = $PDO->prepare('SELECT * FROM obras ORDER BY obra_id DESC');
$listar->execulte();


$obras  = $listar->fetchAll(PDO::FETCH_ASSOC);

$params = array
(
'mode' => 'Sliding',
'perPage' => 5,
'itemData' => $obras
);

$pager = & Pager::factory($params);
$data  = $pager->getPageData();

$o = new ArrayIterator($data);
foreach($obras as $e => $o->valid()){

o erro que me retorna:

 

  • Fatal error: Can't use method return value in write context in

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não, não é.

 

ArrayIterator é um objeto que implementa a interface Iterator. A interface Iterator permite você tratar um objeto como um array. Podendo avançar, ou retroceder, em seus elementos.

 

Uma coisa que eu nunca entendi, é a ArrayIterator implementar a interface Traversable, já que Iterator extende Traversable.

 

Traversable é a interface que permite o objeto ser utilizado em um foreach. Só não faz muito sentido implementar as duas se uma já extende a outra.

 

Voltando ao seu problema. Você possui um objeto que pode ser iterado e o foreach. O objeto que pode ser iterado é $o. Trate-o como um array:

foreach($o AS $key => $row) {
}

 

Entretanto, se você fosse utilizar um for, o correto seria:

for($o->rewind() ; $o->valid() ; $o->next()) {
    $key = $o->key();
    $row = $o->current();
}

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

da o mesmo erro que estava dando la em cima:

 

  •  

     

    • Warning: PDO::__construct(): MySQL server has gone away in E:\WebServer\class\PDO.class.php on line 18

      Warning: PDO::__construct(): Error while reading greeting packet. PID=2724 in E:\WebServer\class\PDO.class.php on line 18
    • Warning: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2006] MySQL server has gone away' in E:\WebServer\class\PDO.class.php:18 Stack trace: #0 E:\WebServer\class\PDO.class.php(18): PDO->__construct('mysql:host=loca...', 'root', '') #1 E:\WebServer\USBWebServer 8.5\Construtora\cwva\galeria.php(4): Conexao->__construct() #2 E:\WebServer\portifolio.php(57): require_once('E:\WebServer\...') #3 {main} thrown in E:\WebServer\class\PDO.class.php on line 18

      Fatal error: Maximum execution time of 30 seconds exceeded in E:\WebServer\class\PDO.class.php on line 18

     

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma pesquisa rápida no Google (com critérios bem óbvios, diga-se de passagem) me apontou esse Bug report do PHP do qual se tem um link para uma possível solução especificamente voltada para o MySQL:

 

 

$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);

Sendo $db seu objeto de conexão.

 

Se não resolver, dê uma olhada na resposta melhor avaliada desse stack e cheque o valor daquela diretiva do MySQL.

 

Uma coisa que eu nunca entendi, é a ArrayIterator implementar a interface Traversable, já que Iterator extende Traversable.

 

Será que não é só no manual essa inconsistência, meramente a título descritivo? Não entendo o código do PHP pra dizer com certeza...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Será que não é só no manual essa inconsistência, meramente a título descritivo? Não entendo o código do PHP pra dizer com certeza...

Foi meu primeiro pensamento, mas mesmo em caso positivo, não faz muito sentido. Vou olhar o código fonte e ver se acho algo.

 

Confirmado, é meramente para descrição de implementação ou erro mesmo. Dentre as duas opções, a correta ficará "em haver" ou a critério do leitor. Eu acho a segunda opção a mais correta.

http://www.php.net/~helly/php/ext/spl/classArrayIterator.html

Compartilhar este post


Link para o post
Compartilhar em outros sites

bom eu to tentando tudo isso que estão passando, e nada de resolver...

peguei e revi o video umas 10 vezes e não vi nada de diferente do que ta aqui. :(

 

ta osso. :(

 

 

alguma solução por favor... :(

 

 

pois infelizmente eu não to conseguindo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Testou o que eu te passei na primeira metade do post #9?

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim testei, e nada infelizmente. :(

 

 

<?php
require_once('class/PDO.Class.php');
require_once('pager/Pager.php');

$pdo = new Conexao;
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);

$listar = $pdo->query('SELECT * FROM obras ORDER BY obra_id DESC');
$obras  = $listar->fetchAll(PDO::FETCH_OBJ);


...
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Experimenta conectar diretamente pela PDO, sem ser por essa classe que, com todo respeito, não serve pra nada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

retorna os mesmo erros... :(

 

bom eu não sei se muda de versão anteriores para as de agora, mas eu procure no meu php.ini e não tem essa linha extension=php_pdo.dll

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desde a versão 5.1.0 do PHP, a PDO é parte integrante do próprio PHP, sem extensões. :)

 

ACHO que eu matei seu problema com base nesse stack do ServerFault.

 

Dá uma olha no teu DSN.

 

Especificar a porta de conexão é sempre um problema. Se você tem uma instalação padrão, pode omitir a porta que o PHP se encarrega de conectar na correta, a 3306 e não a 3060.

Compartilhar este post


Link para o post
Compartilhar em outros sites

bom eu usava aquele USBWebServer 8.5 pra rodar o php,mysql e apache aqui no pc..

ae peguei e instalei o Wamp (não sei se é o melhor caso saiba de algum melhor estou a sugestões)

 

depois tirei aquela class e coloquei direto.

 

 

<?php
function conectar()
{

$dsn = 'mysql:host=localhost;dbname=testando';
$user = 'root';
$password = '';

try 
{
$dbh = new PDO($dsn, $user, $password);
} 
catch(PDOException $e) 
{
echo 'Erro encontrado: ' . $e->getMessage();
}
return $dbh;
}
?>

e agora ele está me retornando os seguintes erros:

  •  

    • Erro encontrado: SQLSTATE[HY000] [2002] No connection could be made because the target machine actively refused it.
    • SCREAM: Error suppression ignored for

      ( ! ) Notice: Undefined variable: dbh in E:\WebServer\Wamp\www\class\PDO.class.php on line 17

       

      Fatal error: Call to a member function query() on a non-object in E:\WebServer\Wamp\www\cwva\galeria.php on line 7

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ao que tudo indica, erro de autenticação, verifique usuário e senha.

 

Mas o seu stack trace me chamou a atenção sobre uma supressão de erro na classe sem propósito que está utilizando. Se houver algum arroba ocultando o problema fica difícil de ajudar.

 

E mais! Aquele return deveria estar dentro do try e o catch deveria estar abortando a execução, por isso o Fatal Error.

 

Você disse que está com o WAMP... Você removeu completamente o servidor anterior?

Compartilhar este post


Link para o post
Compartilhar em outros sites

o outro servidor era "portable" sem instalação só desliguei ele...

 

bom fucei e fucei agora ta dando o seguinte erro:

 

 

Non-static method Pager::factory() should not be called statically in E:\Wamp\www\U\galeria.php on line 17

a linha 17 que ele acusa é essa $pager = & Pager::factory($params);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Simples você está invocando um método não estático de forma estática ("usando os dois pontos duplos")

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.