Como atualizar scripts PHP de MySQL para MySQLi
Atualizar para MySQLi não é apenas colocar um “i” a mais nas chamadas de funções comomysql_connect ou mysql_query, como muitos dizem.
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 motivoComo 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 dizemTem 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 exemploVamos 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 MySQLiVamos 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:
- mysqli_connect permite conectar ao MySQL e já selecionar o banco de dados. Nem é necessário usar a função mysqli_select_db;
- 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;
- 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âmetrosPercebeu 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 detalhesAqui 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!







