Diogo Besson :: tecnologia

PHP – extensão mysql está obsoleta

PHP – extensão mysql está obsoleta

PHP – extensão mysql está obsoleta. as funções da extensão mysql estão obsoletas.  E agora? O que fazer? Como migrar pra Mysqli ou PDO?

php-mysql

fonte: http://www.techremedy.net/blog/wp-content/uploads/2011/01/php-mysql.gif

 

Na versão 5.5.0 do PHP (desde a v. 18 Dec 2012, PHP 5.5.0 Alpha 2. linha 25) há um aviso: a extensão mysql foi marcada como obsoleta. Isso significa que as versões posteriores poderão vir configuradas com a desativação por padrão ou, em um cenário mais pessimista, poderão não contar com essa extensão no pacote.

O manual do PHP incentiva a, desde já, começarmos a escolher com sabedoria nossa próxima maneira de realizar conexão com o banco de dados, o que nos deixa duas opções: o PDO e o Mysqli. São opções bem diferentes, em todos os sentidos, como veremos a seguir.

*** No caso, o PHP oferece essas duas opções, sendo uma delas a API do PHP Data Objects (PDO) e a API da extensão do PHP mysqli, mas não se preocupe com esses termos, ainda…  apenas tenha em mente que são duas coisas bem diferentes. ***

Mysqli

A extensão que trataremos aqui se chama MySQLi, ou MySQL Improved, as you wish. É uma forma de conexão bastante recomendada pela Oracle MySQL por apresentar fortes vantagens em relação às outras formas. Caso você queira ter uma visão (beeem superficial) de como funciona o PDO, pode encontrar nesse post antigo ou na própria documentação do PHP. Não trataremos de PDO aqui nesse momento.

$mysqli = new mysqli ( "servidor_do_mysql.com" , "usuario" , "senha" , "base_de_dados" );
$result = $mysqli -> query ( "SELECT 'E aí, carinha?!' AS mensagem_do_billy FROM DUAL" );
$row = $result -> fetch_assoc ();
echo htmlentities ( $row [ 'mensagem_do_billy' ]);

Basicamente, Mysqli é a versão “melhorada” da extensão mysql padrão, que nos acompanha há tanto tempo. Com ela é possível operar o MySQL (desde a versão 4.1 deste SGBD) através de procedimentos muito parecidos ao que já estamos acostumados.

A extensão do PHP mysqli, que fornece o conjunto de ferramentas, funções e o diabo a quatro, está disponível desde a versão 5.0 do PHP e tem um desenvolvimento ativo, além de ser a recomendada pela MySQL para novos projetos (desde o MySQL 4.1.3), segundo o próprio manual do PHP.

Na minha opinião, tem como vantagem principal (sobre o PDO e antiga mysql_) a capacidade de ser utilizada tanto numa programação procedural (programação estruturada) como orientada a objetos, além de suportar stored procedures, prepared statements, binding, commit, rollback e milhares de outros recursos próprios do banco de dados, que muitas vezes são deixados de lado, mas que em outras são altamente necessários.

5 principais funções do mysqli

1- mysqli_connect() – Abre uma conexão com o MySQL Server.
uso: $conexao = new mysqli(‘servidor_do_mysql.com.br’, ‘usuario’, ‘senha’, ‘nome_database’);
observação: diferente do mysql_connect() não é necessário utilizar mysql_select_db() para selecionar a base de dados. Na mesma função você já pode fornecer o nome da base que será utilizada na conexao. O que não o impede de trocar a base padrão usando a função mysqli_select_db() ou até mesmo o usuário com a função mysqli_change_user(). Para debugar falhas de conexão, utilize mysqli_connect_error() e mysqli_connect_errno().

veja também: mysqli_real_connect()

2- mysqli_query() – Executa uma consulta na base de dados selecionada dentro da conexão estabelecida com o MySQL Server.
uso: $result = mysqli_query($conexao, “SELECT ‘E aí, carinha?!’ AS mensagem_do_billy FROM DUAL”);
observação: migrar scripts antigos será uma maçada bem no meio do cérebro. Veja que a ordem dos parâmetros mudou e a conexão vem antes da string com a consulta, obrigando o pobre programador a sempre indicar – explicitamente – qual conexão utilizar.

Outro ponto importante dessa função é que ela é diferente do mysqli_real_query(), pois retorna um objeto result (no caso, mysqli_result). A função real_query só retorna TRUE ou FALSE.

Uma coisa que achei bacana nessa função é que, quando foi redesenhada, abriu as portas para a criação de uma série de outras funções muito úteis, como a mysqli_multi_query(), por exemplo, que retorna um result iterável*.

(* essa palavra existe?)

3- mysqli_autocommit() – Essa função ativa e desativa o compromisso entre a declaração das querys e a sua execução no banco.
uso: mysqli_autocommit($conexao, TRUE); para ativar um commit automático e mysqli_autocommit($link, FALSE); para desativar.
observação: primeiro, essa função não funciona se você tiver conexão com base de dados em MyISAM; segundo, se você decidir desativar o commit automático, deve ler antes como utilizar as funções mysqli_commit() e mysqli_rollback().

4- mysqli_stmt_init() – Essa função permite o uso dos recursos de afirmações (é assim que se chama?) (prepared statements) e anexo de variáveis (bind variables). Algumas pessoas são veementes e insistem incansavelmente em dizer que essa técnica, além de reduzir o tempo de execução do script e a carga do servidor em runtime, ainda incrementa a segurança, evitando SQL injection e etc… Tenho lá minhas dúvidas em relação à melhoria da performance, mas é – quase – certo que seu script ficará mais seguro com o uso disso.
uso: $stmt = mysqli_stmt_init($conexao);
observação: Adotar o uso de stmts é quase como adotar uma cadela prenha: a cria vem de brinde, ou seja, prepare-se para ter que estudar mysqli_stmt_prepare()mysqli_stmt_bind_param()mysqli_stmt_execute()mysqli_stmt_bind_result() e mysqli_stmt_fetch(), no mínimo…

5- mysqli_error() – Provavelmente será a função mais usada durante o debugar das consultas do teu script. Vai te trazer informações mais completas que o mysqli_errno() e ajudará bastante a fazer um script mais redondo. Uma dica legal é combinar ela com file_put_contents() pra gravar um arquivo de log no servidor, usando a string da query, o erro obtido, o __LINE__ do script PHP, né? Desse jeito fica interessante.
uso: echo “Ocorreu um erro: <br />”.mysqli_error($conexao);
sem observações 🙂

Se você quiser saber mais sobre a implementação de mysqli orientada a objetos, o link para o manual da classe mysqli é esse.

Offtopic -> Leia aqui o que o mestre Rasmus disse sobre OOP vs Procedural. hehehe

7 Comments

  1. Caio

    Muito bom opost parabéns…

  2. Rosa Moraes

    *snif*
    Isso é…tão…poético..!!! Fiquei especialmente comovida com o final. Achei que a Mysqli ia ficar com o mocinho, mas terminou dando erro..!

    XD

    Adoro seu blog! 😀
    Beijos e vê se aparece! 😀

  3. Diogo Besson

    KkKkKkKk
    Só você mesmo, Rosa!!!
    Vamos no show do Sonata???
    é domingo agora!
    beijos!

  4. Diogo Besson

    Obrigado, Caio!
    Volte sempre ao blog.
    abraço!

  5. Eduardo Xuze

    Parabéns pelo artigo! Acho interessante o projeto do PDO, bem robusto e completo, mas particularmente sou bem avesso a incluir 2 mil arquivos pra fazer uma conexão com o banco. Gosto do PHP exatamente pela facilidade e flexibilidade, de poder fazer uma conexão segura com 4 ou 5 linhas do bom e velho código estruturado. Já com PDO, nem Deus ou o Beuzebu sabem quantos includes são gerados só pra instanciar a classe e fazer um select na tabela. Pra mim, a simplicidade é sempre mais elegante! Mas eu sou um rabugento do contra.

  6. Diogo Besson

    xuze, somos 2.
    mysqli foi o que chegou mais perto do que a gente tava acostumado e vai bem, fácil, alem de facilitar pro weber transformar tudo em objeto se assim desejar.
    só quero ver como vai ser esse monte de sistema legado qdo as coisas começarem a parar de funcionar. KkkKkk
    abraço!

  7. @D_Oliiver

    obrigado cara salvou meu projeto , fica com deus .
    abraços

Leave a Comment

O seu endereço de e-mail não será publicado.