Como Atualizar Scripts PHP de MySQL Para MySQLi

alt

Atualizar para MySQLi não é apenas colocar um “i” a mais nas chamadas de funções como mysql_connect ou mysql_query, como muitos dizem.

Porém também não é nada muito complicado. Você apenas precisa tomar cuidado com os parâmetros de cada função.

Neste artigo vou mostrar como atualizar seus scripts PHP de MySQL para MySQLi.

O Motivo

Como eu comentei neste artigo, a biblioteca mysql está obsoleta.

Isso significa que você não deve usar funções como mysql_connect, mysql_query e semelhantes.

Em vez delas, você deve usar mysqli_connect e mysqli_query

Porém a diferença não está apenas no “i” a mais no nome da função. A lista de parâmetros geralmente também é um pouco diferente, por isso precisamos estar atentos a isso.

MySQLi ou PDO?

Particularmente, recomendo e prefiro PDO. Mas há um pequeno problema…

PDO requer um pouco de conhecimento sobre Orientação a Objetos (OOP). E eu sei que muitos iniciantes têm bastante dificuldade com isso.

Por isso vou mostrar aqui como usar mysqli da forma procedural, ou seja, como usá-lo com chamadas a funções, em vez de usar a classe mysqli e seus métodos e propriedades.

Por Que Não É Tão Simples Como Dizem

Tem muita gente por aí dizendo que é só colocar o “i” nas chamadas das funções e pronto.

Não é bem assim.

Várias funções do MySQLi possuem parâmetros a mais, ordem diferente etc.

As funções mysql_* não exigiam o parâmetro de identificação da conexão (valor retornado por mysql_connect). Elas sempre buscavam uma conexão ativa.

Com mysqli a coisa é diferente…

É fundamental informar o identificador da conexão.

Dessa forma, podemos ter diversas conexões no mesmo script, sem risco de conflitos ou funcionamento inesperado.

Esse é só um dos exemplos.

Veremos isso com mais detalhes, na prática, logo logo.

Banco de Dados de Exemplo

Vamos criar um simples banco de dados para nossos testes.

CREATE TABLE funcionarios(
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    nome VARCHAR(50) NOT NULL,
    email VARCHAR(80) NOT NULL,
    salario DECIMAL(10,2) NOT NULL,
    nascimento DATE NOT NULL,
    PRIMARY KEY (id)
) COLLATE=utf8_unicode_ci;

Vamos inserir alguns dados:

INSERT INTO funcionarios(nome, email, salario, nascimento) VALUES
('Ana', 'ana@ana.com', 1400.00, '1993-10-16'),
('Daniela', 'dani@dani.com', 1380.50, '1996-05-15'),
('João', 'joao@joao.com', 1400.00, '1995-11-10'),
('Julia', 'julia@julia.com', 1200.95, '1997-03-22'),
('Sabrina', 'sabrina@sabrina.com', 1800.57, '1990-12-03'),
('Paulo', 'paulo@paulo.com', 1750.43, '1991-06-25');

[cta id=”1571″]

Exibindo os Dados Usando MySQL

Vamos criar um simples script para exibir todos os dados, usando funções mysql_*.

// dados de conexão
$host = 'localhost';
$user = 'usuario';
$pass = 'senha';
$db   = 'nome_do_banco';
 
// conecta com o banco de dados
$con = mysql_connect($host, $user, $pass);
 
// seleciona o banco de dados
mysql_select_db($db);
 
// efetua a consulta
$sql = "SELECT * FROM funcionarios ORDER BY nome";
$res = mysql_query($sql);
 
// total de resultados
$total = mysql_num_rows($res);
 
echo "

Total de Resultados: ” . $total . ”

“; // loop pelos resultados while ($f = mysql_fetch_array($res)) { echo ”

” . $f[‘nome’] . ” | ” . $f[’email’] . ” | ” . $f[‘salario’] . ” | ” . date(‘d/m/Y’, strtotime($f[‘nascimento’])) . ”

“; } // fecha a conexão mysql_close();

O script é super simples. Apenas um SELECT que lista os registros da tabela, junto ao número total de registros.

Exibindo os Dados Usando MySQLi

Vamos ver agora como rescrever o script anterior usando MySQLi.

Vou colocar o código aqui e falo sobre os principais detalhes logo em seguida.

$host = 'localhost';
$user = 'usuario';
$pass = 'senha';
$db   = 'nome_do_banco';
 
// conexão e seleção do banco de dados
$con = mysqlI_connect($host, $user, $pass, $db);
 
// executa a consulta
$sql = "SELECT * FROM funcionarios ORDER BY nome";
$res = mysqli_query($con, $sql);
 
// conta o número de registros
$total = mysqli_num_rows($res);
 
echo "

Total de Resultados: ” . $total . ”

“; // loop pelos registros while ($f = mysqli_fetch_array($res)) { echo ”

” . $f[‘nome’] . ” | ” . $f[’email’] . ” | ” . $f[‘salario’] . ” | ” . date(‘d/m/Y’, strtotime($f[‘nascimento’])) . ”

“; } // fecha a conexão mysqli_close($con);

Podemos notar três diferenças principais:

  1. mysqli_connect permite conectar ao MySQL e já selecionar o banco de dados. Nem é necessário usar a função mysqli_select_db;
  2. O primeiro parâmetro de mysqli_query não é a consulta SQL, como era com mysql_query. Agora é necessário passar o identificador da conexão (retornado por mysqli_connect) e, depois, a string com a consulta SQL;
  3. mysqli_close exige o parâmetro que identifica a conexão. Por outro lado, para mysql_close ele era opcional.

Como você pode ver, só colocar o “i” não resolve 100%. Algumas pequenas modificações ainda são necessárias.

As Listas de Parâmetros

Percebeu que existem algumas diferenças nesses scripts simples?

Essas diferenças aumentam um pouco, caso você esteja usando outras funções, como mysql_affected_rows, mysql_real_escape_string e algumas outras.

Recomendo que você olhe a documentação de cada uma delas e preste atenção à lista de parâmetros de cada uma.

Veja qual é a ordem deles, quais são obrigatórios ou não.

Vou deixar aqui os links para as documentações:

Só pra você entender melhor, parâmetros entre colchetes são opcionais. resource é o tipo do retorno de mysql_connect e mysql_query. mysqli é o identificador da conexão, retornado por mysqli_connect e mysqli_result é o retorno de mysqli_query.

Com isso você entende melhor quais são os parâmetros que cada função exige.

Aprenda Com Mais Detalhes

Aqui eu mostrei a ideia geral, mostrando o básico sobre a migração.

Escrevi um guia completo sobre como atualizar de MySQL para MySQLi.

No guia eu entro em mais detalhes, mostro uma tabela comparativa entre cada umas das funções mysql e suas correspondentes no mysqli.

Também mostro como usar MySQLi Orientado a Objetos, para você economizar linhas de código, facilitando o trabalho.

O guia é 100% Gratuito!

CLIQUE AQUI Para Baixar o Guia Gratuitamente

Curso Completo de MySQLi

Se você procura um curso completo sobre MySQLi, abordando os principais comandos (CREATE TABLE, INSERT INTO, UPDATE, SELECT etc), clique aqui e aproveite a promoção especial do Curso de MySQLi.

Você vai aprender a realizar as principais operações com bancos de dados, de forma simples, organizada e otimizada.

Clique aqui e conheça o Curso de MySQLi

 

Guia Completo Passo-a-Passo

Guia de migração MySQL para MySQLi

Aprenda passo-a-passo como migrar de MySQL para MySQLi

Equivalência entre funções com exemplos práticos de uso!

Baixe gratuitamente este guia e não fique com scripts obsoletos!

The following two tabs change content below.
Graduado em Ciência da Computação, pela Universidade Federal do Paraná (UFPR), é desenvolvedor de software desde 2008, com foco em Desenvolvimento Web com PHP.
  • Blood Nick

    Olá, estou com um problema: “Deprecated: mysql_pconnect(): The mysql extension is drprecated and will be removed in future: use mysqli or PDO instead in C:\wamp\www\Pixels\Connections\pixels_conexao.php on line 9”.

    E código do pixels_conexao.php é:

    “”

  • belo artigo rberaldo

    • Oliveira Neilde

      Muitíssimo Obrigada. Deu certo consegui!

  • Oliveira Neilde

    Olá eu entendi como funciona o mysqli se eu colocar a conexao no mesmo arquivo que contém os selects. Porém não consigo fazer com várias páginas com selects e um include conexao.php… o que acontece? não sei definir uma variável que seja compartilhada em todas as páginas que contenham o include. Trata-se da variavel $con no exemplo. Não sei mexer com classes ainda e minha noção de OOP é quase nula. Pode ajudar?

  • Pela primeira vez consegui compreender exatamente a mudança.
    Muito obrigado pelo artigo.

  • Rogerio Oliveira

    Olá Beraldo,
    Parabéns pelo seu trabalho.
    Vamos lá.
    Sou novato no PHP e estou tendo uma dificuldade no uso do comando SQL Select simples quando for a leitura apenas de um único registro acessando com a chave primária da tabela de Usuário. Vou exemplificar: Num Loop While para a confecção de uma lista de Pessoas, onde o comando SQL Select abriu uma leitura com vários registros, para cada registro de Pessoa necessito fazer um outro comando Select usando a chave primária, caso a Pessoa já tenha um Usuário cadastrado.
    Meu ambiente é XAMP e uso o MySQL.

    Numa lista de Pessoas que acessam o sistema, gostaria de identificar quem já tem a identificação de usuário no sistema.

    A seguir o código da minha ultima tentativa: Ele faz a lista só que ainda não consegui acessar dados da tabela de usuário num acesso a um único registro.

    $query1 = (“Select
    P.IdPessoa
    , P.IdCliente
    , P.IdUsuarioPessoa
    , P.Nome
    , P.TipoPessoal
    , P.Sexo
    , P.Email
    , P.Cpf
    , C.IdCliente
    , C.SiglaCliente
    FROM pessoa P
    , cliente C
    WHERE ” . $ClausulaWHERE . ” order by
    P.Nome
    , P.TipoPessoal
    , P.Sexo
    , P.Email
    , P.Cpf; ” );

    mysqli_stmt_bind_result($stmt, $idpessoa, $idclientep, $idusuario, $nome, $tipopessoal, $sexo, $email, $cpf, $idcliente, $siglacliente);
    // CARREGA AS PESSOAS SELECIONADAS
    if ($stmt = mysqli_prepare($conn, $query))
    {
    /* execute statement */
    mysqli_stmt_execute($stmt);

    /* bind result variables */

    // ELABORA LISTA DE PESSOA SEJA DO CLIENTE OU DA INSTITUIÇÃO
    while (mysqli_stmt_fetch($stmt))
    {
    $contador++;

    // Verifica se Pessoa já tem usuário cadastrado
    if ($idusuario > 0 )
    {
    $query3 = mysqli_query($conn,”SELECT
    IdUsuario
    , SiglaUsuario
    , TipoUsuario
    , UsuarioAutorizado
    FROM usuario
    WHERE IdUsuario = $idusuario “);

    // output data of each row
    $row = mysqli_fetch_assoc($query3)

    $idusuario = $row[“IdUsuario”];
    $siglausuario = $row[“SiglaUsuario”];
    $tipousuario = $row[“TipoUsuario”];