PHP 8.4.1 Released!

Funções do MySQL (PDO_MYSQL)

Introdução

PDO_MYSQL é um driver que implementa a interface PHP Data Objects (PDO) para habilitar o acesso do PHP aos bancos de dados MySQL.

PDO_MYSQL utiliza as preparações emuladas por padrão.

MySQL 8

Ao executar uma versão de PHP anterior a 7.1.16, ou 7.2.4, defina o plugin padrão de senhas do Servidor MySQL 8 para mysql_native_password ou poderão surgir erros similares a The server requested authentication method unknown to the client [caching_sha2_password] mesmo quando caching_sha2_password não seja usado.

Isto acontece porque o padrão do MySQL 8 é caching_sha2_password, um plugin que não é reconhecido pelas versões antigas do PHP (mysqlnd). Portanto, altere o plugin configurando default_authentication_plugin=mysql_native_password no arquivo my.cnf. O plugin caching_sha2_password é totalmente suportado a partir do PHP 7.4.4. Para versões anteriores do PHP, a extensão mysql_xdevapi suporta o plugin.

Aviso

Cuidado: Alguns tipos de tabelas do MySQL (motores de armazenamento) não suportam transações. Ao escrever código para um banco de dados transacional onde o tipo de tabela não suporta transações, o MySQL irá entender que a transação foi inicializada com sucesso. Além disso, qualquer consulta DDL irá, de forma implícita, executar o "commit" para qualquer transação que esteja pendente.

Nota:

O driver MySQL não suporta adequadamente a opção PDO::PARAM_INPUT_OUTPUT através de PDOStatement::bindParam(); embora tais parâmetros possam ser usados, eles não são atualizados (isto é, a saída real é ignorada).

Instalação

As distribuições Unix comuns incluem versões binárias do PHP que podem ser instaladas. Embora estas versões binárias são tipicamente compiladas com suporte a extensões MySQL, as bibliotecas das extensões em si podem precisar ser instaladas usando um pacote adicional. Verifique o gerenciador de pacote que vem com a distribuição sendo usada para disponibilidade desse pacote.

Por exemplo, no Ubuntu o pacote php5-mysql instala as extensões PHP ext/mysql, ext/mysqli e PDO_MYSQL. No CentOS, o pacote php-mysql também instala estas três extensões.

Alternativamente, o usuário pode compilar esta extensão por conta própria. Compilar o PHP direto da fonte permite especificar as extensões a serem utilizadas, assim como as bibliotecas clientes para cada extensão.

Ao compilar, use a opção --with-pdo-mysql[=DIR] para instalar a extensão PDO MySQL, onde o [=DIR] opcional é a localização da biblioteca base do MySQL. Mysqlnd é a biblioteca principal. Para detalher sobre a escolha de biblioteca, consulte a seção Escolhendo uma biblioteca MySQL.

Opcionalmente, --with-mysql-sock[=DIR] define a localização do ponteiro do soquete Unix MySQL para todas as extensões MySQL, incluindo a PDO_MYSQL. Se não especificada, as localizações padrão são pesquisadas.

Optionalmente, --with-zlib-dir[=DIR] é usada para definir o caminho da instalação da zlib.

$ ./configure --with-pdo-mysql --with-mysql-sock=/var/mysql/mysql.sock

O suporte a SSL pode ser habilitado usando as constantes PDO_MySQL apropriadas, que é o equivalente a chamar a » função mysql_ssl_set() da API C do MySQL. Além disso, o SSL não pode ser habilitado com PDO::setAttribute porque a conexão já existirá. Consulte também a documentação do MySQL sobre » conexão ao MySQL com SSL.

Constantes predefinidas

As constantes abaixo são definidas por este driver e só estarão disponíveis quando a extensão tiver sido compilada no PHP ou tiver sido carregada dinamicamente em tempo de execução. Além disso, estas constantes específicas do driver só devem ser usadas se este driver estiver sendo usado. Usar atributos específicos de um driver com outro driver pode resultar em comportamento inesperado. PDO::getAttribute() pode ser usada para obter o atributo PDO::ATTR_DRIVER_NAME para verificar o driver, se o código puder ser executado com vários drivers.

PDO::MYSQL_ATTR_USE_BUFFERED_QUERY (bool)
Por padrão todas as instruções são executadas com buffer ativo. Se este atributo for definido para false em um objeto PDO, o driver MySQL usará o modo sem buffer.

Exemplo #1 Configurando o modo sem buffer no MySQL

<?php
$pdo
= new PDO("mysql:host=localhost;dbname=world", 'meu_usuário', 'minha_senha');
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);

$unbufferedResult = $pdo->query("SELECT Nome FROM Cidades");
foreach (
$unbufferedResult as $row) {
echo
$row['Nome'] . PHP_EOL;
}
?>

PDO::MYSQL_ATTR_LOCAL_INFILE (int)

Habilita LOAD LOCAL INFILE.

Observe que essa constante só pode ser usada no array driver_options ao construir um novo manipulador de banco de dados.

PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY (string)

Permite restringir o carregamento através de "LOCAL DATA" a arquivos localizados neste diretório designado. Disponível a partir do PHP 8.1.0.

Observe que esta constante só pode ser usada no array driver_options ao construir um novo manipulador de banco de dados.

PDO::MYSQL_ATTR_INIT_COMMAND (string)

Comando para executar ao se conectar no servidor MySQL. Irá ser executado novamente ao reconectar.

Observe que essa constante só pode ser usada no array driver_options ao construir um novo manipulador de banco de dados.

PDO::MYSQL_ATTR_READ_DEFAULT_FILE (int)

Lê configurações do arquivo definido nas opções ao invés do arquivo my.cnf. Essa opção não está disponível se o mysqlnd for usado, porque o mysqlnd não lê os arquivos de configurações do mysql.

PDO::MYSQL_ATTR_READ_DEFAULT_GROUP (int)

Lê configurações do grupo nomeado em my.cnf ou no arquivo especificado com MYSQL_READ_DEFAULT_FILE. Essa opção não está disponível se o mysqlnd for usado, porque o mysqlnd não lê os arquivos de configurações do mysql.

PDO::MYSQL_ATTR_MAX_BUFFER_SIZE (int)

Tamanho máximo do buffer. O padrão é 1 MiB. Essa constante não é suportada quando o mysqlnd é utilizado.

PDO::MYSQL_ATTR_DIRECT_QUERY (int)

Executa consultas diretamente, não usa instruções preparadas.

PDO::MYSQL_ATTR_FOUND_ROWS (int)

Retorna a quantidade de linhas correspondidas, e não a quantidade de linhas modificadas.

PDO::MYSQL_ATTR_IGNORE_SPACE (int)

Permite espaços depois do nome das funções. Torna o nome de todas as funções palavras reservadas.

PDO::MYSQL_ATTR_COMPRESS (int)

Habilita a compressão na comunicação de rede.

PDO::MYSQL_ATTR_SSL_CA (int)

Caminho para o arquivo da autoridade certificadora (CA) SSL.

PDO::MYSQL_ATTR_SSL_CAPATH (int)

Caminho para o diretório que contém os certificados SSL confiáveis da autoridade certificadora (CA), armazenados no formato PEM.

PDO::MYSQL_ATTR_SSL_CERT (int)

Caminho para o certificado SSL.

PDO::MYSQL_ATTR_SSL_CIPHER (int)

Uma lista de uma ou mais cifras admissíveis para usar na encriptação SSL, em um formato compreendido pelo OpenSSL. Por exemplo: DHE-RSA-AES256-SHA:AES128-SHA

PDO::MYSQL_ATTR_SSL_KEY (int)

Caminho para a chave SSL.

PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT (int)

Fornece uma maneira de desabilitar verificação do certificado SSL do servidor. Esta opção está disponível somente com mysqlnd.

Isto existe a partir do PHP 7.0.18 and PHP 7.1.4.

PDO::MYSQL_ATTR_MULTI_STATEMENTS (int)

Desabilita a execução de consultas múltiplas nas funções PDO::prepare() e PDO::query() quando definido como false.

Note que essa constante só pode ser usada no array driver_options ao construir um novo manipulador de banco de dados.

Configurações em Execução

O comportamento destas funções é afetado pelas configurações do php.ini.

Opções de Configuração do PDO_MYSQL
Nome Padrão Modificável
pdo_mysql.default_socket "/tmp/mysql.sock" INI_SYSTEM
pdo_mysql.debug NULL INI_SYSTEM
Para mais detalhes e definições dos modos INI_*, consulte os Onde uma configuração deve ser definida.

Aqui está uma breve explicação das diretivas de configuração.

pdo_mysql.default_socket string

Define um soquete de domínio Unix. Este valor também pode ser definido no momento da compilação se um soquete de domínio puder ser encontrado durante o comando "configure". Esta configuração ini é apenas para sistemas baseados em Unix.

pdo_mysql.debug bool

Habilita a depuração para o PDO_MYSQL. Esta configuração está disponível somente quando o PDO_MYSQL tiver sido compilado com a mysqlnd e em modo de depuração PDO.

Índice

adicione uma nota

Notas Enviadas por Usuários (em inglês) 6 notes

up
13
Desislav Kamenov
6 years ago
There is an important undocumented attribute which disables certificate CN verification available after
5.6.22 (not sure), 7.0.18 (verified) and 7.1.15 (not sure)

PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT

possible values: true, false
default value: true

Related PHP bugs:
https://bugs.php.net/bug.php?id=71845
https://bugs.php.net/bug.php?id=71003

and github PR: https://github.com/php/php-src/pull/1913
up
7
davey at php dot net
17 years ago
To use "PDO::MYSQL_ATTR_USE_BUFFERED_QUERY" you should call
PDO::setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);

It will not work when passed into PDO::prepare()
up
6
brian at diamondsea dot com
16 years ago
SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. ...

After spending hours trying to track down why we were getting this error on a new server, after the same code ran fine on other servers, we found the problem to be an old MySQL _client_ library running on our web server, and a latest-version MySQL _server_ running on the database server's box.

Upgraded the MySQL client on the web server to the current revision and the problem went away.
up
2
curt at webmasterbond dot com
13 years ago
Today's PHP snapshot now has SSL support for PDO. Follow the directions here ( http://dev.mysql.com/doc/refman/5.0/en/secure-create-certs.html ) to set up MySQL and then use the following connection options:

<?php
$pdo
= new PDO(
'mysql:host=hostname;dbname=ssldb',
'username',
'password',
array(
PDO::MYSQL_ATTR_SSL_KEY =>'/path/to/client-key.pem',
PDO::MYSQL_ATTR_SSL_CERT=>'/path/to/client-cert.pem',
PDO::MYSQL_ATTR_SSL_CA =>'/path/to/ca-cert.pem'
)
);
?>
up
0
snoyes at gmail dot com
21 days ago
> change it by setting default_authentication_plugin=mysql_native_password in my.cnf

This only works in MySQL 8.0. The default_authentication_plugin variable has been removed from 8.4.
up
-3
rmottey at gmail dot com
16 years ago
I have been getting the error below when performing multiple queries within a single page.

Setting the attribute below did not seem to work for me.

So building on previous example i am initilizing my stmt variable on every query and a fetch all into an array. Seems to be working for me.

Error:
PDO Error 1.1: Array ( [0] => xxx[1] => yyy[2] => Lost connection to MySQL server during query )

Fix:

(PDO::setAttribute("PDO::MYSQL_ATTR_USE_BUFFERED_QUERY", true);)

<?

try {
$dbh = new PDO('mysql:host=xxx;port=xxx;dbname=xxx', 'xxx', 'xxx', array( PDO::ATTR_PERSISTENT => false));
$stmt = $dbh->prepare("CALL getname()");

// call the stored procedure
$stmt->execute();
// fetch all rows into an array.
$rows = $stmt->fetchAll();
foreach ($rows as $rs)
{
$id = $rs['id'];
}
//initilise the statement
unset($stmt);
$stmt = $dbh->prepare("call secondprocedure(?);");
$stmt->bindValue(1, $id);
if ( ! $stmt->execute() )
{
echo "PDO Error 1.1:\n";
print_r($stmt->errorInfo());
exit;
}
unset($stmt);
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
?>
To Top