Back-End

27 nov, 2015

Como atualizar scripts PHP de MySQL para MySQLi

2947 visualizações
Publicidade

Atualizar para MySQLi não é apenas colocar um “i” a mais nas chamadas de funções comomysql_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');

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 "<p>Total de Resultados: " . $total . "</p>";
 
// loop pelos resultados
while ($f = mysql_fetch_array($res))
{
    echo "<p>" . $f['nome'] . " | " . 
         $f['email'] . " | " . 
         $f['salario'] . " | " . 
         date('d/m/Y', strtotime($f['nascimento'])) . "</p>";
}
 
// 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 "<p>Total de Resultados: " . $total . "</p>";
 
// loop pelos registros
while ($f = mysqli_fetch_array($res))
{
    echo "<p>" . $f['nome'] . " | " . 
         $f['email'] . " | " . 
         $f['salario'] . " | " . 
         date('d/m/Y', strtotime($f['nascimento'])) . "</p>";
}
 
// 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_closeele 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