Erro, muitas conexões para o mysql usando o PDO mostraram nosso nome de usuário e senha do db?

Em algum momento antes, parece que havia muitas conexões SQL e o seguinte foi exibido para quem estava procurando:

PHP Fatal error:  Uncaught exception 'PDOException' with message  'SQLSTATE[08004] [1040] Too many connections' in /dir/file.php:21
Stack trace:
#0 /dir/file.php(21): PDO->__construct('mysql:host=loca...', 'the user', 'password')

Como você pode ver, imprimiu o nome de usuário e a senha.

Eu sou novo no formulário PDO de conexão com o banco de dados, e eu entrei nisso porque as pessoas me disseram que meu formulário regular do mysql_connect era inseguro. No entanto, por padrão, quando o mysql_connect já tinha conexões demais, nunca imprimia o nome de usuário e a senha na tela.

Que desastre.

Como faço para parar o PDO de fazer isso se o erro acabar?

Estou a usar:

$dbh = new PDO('mysql:host=localhost;dbname=' . $db, $user, $pass);
3
Concordo que isso é um problema e deve ser levantado para a equipe do PDO. Por favor vote para a ocultação das credenciais em caso de erro: bugs.php.net/bug.php ? id = 62184
adicionado o autor IMB, fonte
Ok - vai fazer. Embora pareça bizarro, deve haver uma necessidade de votar - é simplesmente ridículo imprimir credenciais de nome de usuário e senha em uma mensagem de erro! E especialmente quando, aparentemente, pelo menos minha compreensão do DOP é fazer uma maneira mais segura de acessar o banco de dados! Super falha.
adicionado o autor willdanceforfun, fonte
Você já descobriu isso?
adicionado o autor hafichuk, fonte

2 Respostas

O DOP não está fazendo nada do tipo.

Isso está acontecendo porque você não está executando nenhuma manipulação de exceção, portanto, o manipulador de erro PHP padrão está sendo chamado e mostrando sua pilha de chamadas, incluindo argumentos de função.

Geralmente as pilhas de chamadas são uma coisa muito boa, então você quer que o manipulador de erros funcione; você só precisa usá-lo corretamente.

  • Coloque try / catch em locais relevantes em torno do código que podem lançar exceções; no mínimo, coloque um bloco catch try / catch em torno do nível superior do seu código para que nada passe.

A documentação do DOP, no entanto, afirma claramente (em uma caixa de aviso vermelha) o grande risco que você assume de não receber apropriadamente as exceções do PDO:

Se o seu aplicativo não detectar a exceção lançada do construtor PDO, a ação padrão executada pelo mecanismo zend será encerrar o script e exibir um rastreio de retorno. Esse rastreamento de volta provavelmente revelará os detalhes completos da conexão com o banco de dados, incluindo o nome de usuário e a senha. É sua responsabilidade capturar essa exceção, seja explicitamente (por meio de uma instrução catch) ou implicitamente via set_exception_handler ().

( http://www.php.net/manual/en/pdo.connections. PHP

3
adicionado
Isso faz sentido para uma versão mais inteligente de mim mesmo. Agora, se eu pudesse trabalhar ou o que é uma tentativa/captura. obrigado pelo ponteiro !!
adicionado o autor willdanceforfun, fonte
Isso também faz sentido :)
adicionado o autor willdanceforfun, fonte
@cosmicbdog: Você definitivamente precisa aprender sobre exceções antes de usar uma biblioteca que as utilize!
adicionado o autor Lightness Races in Orbit, fonte

Edite seu php.ini e defina

display_errors = 0

Se você não tem acesso ao php.ini, então, na parte superior do (s) seu (s) script (s) você precisa adicionar:

ini_set("display_errors", "0");

See http://php.net/manual/en/errorfunc.configuration.php and http://php.net/manual/en/function.error-reporting.php

Isso impedirá que todos os erros sejam enviados para o navegador. Verifique se você ainda está registrando erros (via configuração do php.ini).

P.S. Não jogue fora PDO

2
adicionado
aprecie isso! obrigado.
adicionado o autor willdanceforfun, fonte
btw é display_errors = 0 ou display_errors = Off?
adicionado o autor willdanceforfun, fonte
Não. Pegue exceções.
adicionado o autor Lightness Races in Orbit, fonte
Se você desabilitar erros, você não verá o que está acontecendo ... (esconda-os para produção, no entanto)
adicionado o autor Lightness Races in Orbit, fonte
@ TomalakGeret'kal Eu concordo completamente, no entanto, você ainda deseja desativar a saída para o navegador como medida de precaução.
adicionado o autor hafichuk, fonte
ou vai funcionar - siga a convenção no seu arquivo php.ini
adicionado o autor hafichuk, fonte