Jedi Tux

PHP e MySQL funções para conexões e consultas

Posted in PHP by Fernando Basso on 20 de maio de 2012

TODO: em alguns pontos eu mencionei que alguma funções retornam um array, sendo que elas retorna um object com os dados da query. Concertar isso.

PHP e MySQL

Introdução

As principais funções para estabelecer uma conexão no banco de dados e selecionar uma database para usada são mysql_connect(), mysql_set_charset() e mysql_select_db();

Nas versões mais novas do MySQL essas (e outras) funções foram melhoradas (Improved) e hoje temos as funções mysqli_connect(), mysqli_set_charset() e mysqli_select_db().

MySQL – Básico

mysql_connect() e mysqli_connect

Essas funções abrem (ou reusam) uma conexão com um servidor MySQL. Os parâmetros mínimos (e os mais úteis) esperados pelo mysql_connect e mysqli_connect são o nome do host onde está o banco de dados mysql, o nome do usuário no banco de dados, e o password desse usuário. Não importa qual das funções você use, esses três parâmetros são os mesmos:

mysql_connect(‘localhost’, ‘admin’, ‘secretPass’);

ou

mysqli_connect(‘localhost’, ‘admin’, ‘secretPass’);

Essas duas funções retornam um identificador de link mysql quando a conexão foi bem sucedida, e FALSE quando houve algum tipo de erro. O identificador de link é usado para referenciar a conexão com o banco de dados toda vez que precisarmos executar uma query. Por esse motivo, sempre atribuímos valor retornado a uma variável para facilitar o seu uso posterior. Veja:

$dblinkid = mysqli_connet(‘localhost’, ‘admin’, ‘secretPass’);

Se a conexão foi bem sucedida, de agora em diante podemos usar a variável $dblinkid em outras funções para realizar queries. Exemplos serão mostrados em momentos oportunos.

mysql_set_charset() vs mysqli_set_charset()

Usadas para estabelecer o encoding da conexão, estas duas funções precisam dos parâmetros identificador de link e charset. O identificador de link nós já conhecemos, no exemplo anterior, colocamos ele na variável $dblinkid. Quanto ao charset, normalmente usamos utf8. O “problema” é que a ordem em que passamos esses argumentos muda. Veja nos exemplos como ficariam esses parâmetros e sua ordem:

mysql_set_charset(‘utf8’, $dblinkid);

ou

mysqli_set_charset($dblinkid, ‘utf8’);

Colocando esses parâmetros na ordem errada resulta um erro parecido com este:

Warning: mysqli_set_charset() expects parameter 1 to be mysqli,

string given in /caminho/para/arquivo.php

ou

Warning: mysql_set_charset() expects parameter 1 to be string,

object given in /caminho/para/arquivo.php

Os parâmetros são os mesmo, mas a ordem não. Lembre-se disso.

mysql_select_db() vs mysqli_select_db()

Funções usadas para especificar o banco de dados dentro de servidor MySQL. Os parâmetros esperados são o identificador de link (viu como ele é importante?) e o nome da database no servidor. Novamente, o que muda é a ordem, embora os parâmetros sejam os mesmos.

mysql_select_db(‘db_articles’, $dblinkid);

ou

mysqli_select_db($dblinkid, ‘db_articles’);

Se nada saiu errado nos três passos vistos até agora, a conexão foi estabelecida. Em todo caso, podemos e devemos verificar por erros para ter certeza, tornando o código mais robusto e confiável. Continue lendo.

 

 Verificando por Erros (mysql)

Em breve (é algo bem simples).

Queries – mysql_query vs mysqli_query

Colocamos uma query mysql em uma variável, por exemplo:

$sql = ‘SELECT id, nome FROM tb_pessoas’;

E usamos uma das funções para executar a query. Mais uma vez o que muda é apenas a ordem dos parâmetros.

mysql_query($sql, $dblinkid);

ou

mysqli_query($dblinkid, $sql);

Essas funções retornam FALSO em caso de erro. Por outro lado, queries bem sucedidas com SELECT (e alguns outros comandos sql) retornam um result object ou result set, que é um array contendo o resultado da query. Por esse motivo, atribuímos esse result object a uma variável para futura manipulação dos dados.

$result_set = mysqli($dblinkid, $sql);

O array retornado pode ser acessado por um punhado de funções, cada uma com sua particularidade, sendo que a escolha de uma vai depender do resultado desejado.

Extraindo dados do result object / result set) (mysql)

As principais funções para recuperar dados de um result set (que contém um array com os dados solicitados na query) são mysqli_fetch_assoc(), mysqli_fetch_row() e mysqli_fetch_array(). Outras duas funções que são úteis em diversas situações são mysqli_num_fields() e mysqli_field_name(). Todas essas funções também estão disponíveis na versão mais antigas – aquelas que não contém o “i” após “mysql” (mysqli).

Esta é a nossa tabela no banco de dados:

Note que temos três colunas, c_id, c_text, e c_author e sete tuplas, linhas ou rows (fileiras).

mysqli_fetch_row()

A função mysqli_fetch_row() espera um result set como parâmetro e retorna uma tupla em forma de array com índices numéricos. No caso da tabela acima, o array retornado teria o índice [0] como a coluna c_id, o índice [1] como c_text, e o índice [2] como c_author. Tenha em mente que se você mudar a ordem das colunas na query SQL, mudará o conteúdo que os [índices] irão acessar. Outro fator importante é que cada chamada subsequente dessa função retorna a próxima tupla/item/row do result set, e NULL quando não há mais tuplas restantes, e por esse motivo podemos usar essa função dentro de loops (já que loops dependem de verdadeiro ou falso decidir se sua execução será encerrado ou deve continuar). Cada vez que a função é chamada, o ponteiro interno é movido para o próximo registro da consulta (query). Essa funcionalidade é útil para que possamos mostrar todas as tuplas de uma determinada tabela. Veja:

/* Enquanto há elementos a serem atribuídos a variaável $minha_tupla,

* retorna o elemento propriamente dito, e um TRUE. */

while ($minha_tupla = mysqli_fetch_row($result_set) {

echo(‘<p>’); print_r($minha_tupla); echo(‘</p>’);

$output = $minha_tupla[1] // [1] é a coluna c_text.

inlcude(‘./output.html.php’);

}

No exemplo acima, cada vez que o while executar, a próxima tupla do result set (que é um array) será retornada e assinada à variável $minha_tupla, e então guardamos o valor do índice [1] (c_text) na variável $output. Essa variável é então mostrada através de um arquivo especial para isso, pois assim evitamos misturar html e php no mesmo código/arquivo. O conteúdo do arquivo output.html.php é simples:

<p><?php echo($output); ?></p>

A linha que contém o print_r() é usada para mostrar a estrutura da tupla. Útil para debugar.

mysqli_fetch_assoc()

Tudo o que falamos sobre mysqli_fetch_row() tambémse aplica para mysqli_fetch_assoc(). A diferença é que em vez de acessarmos os índices do array retornado com um valor numérico, usamos uma string, por que o array retornado é associativo (como o nome da função sugere).

while ($minha_tupla = mysqli_fetch_assoc($result_set) {

$output = $minha_tupla[‘c_author’];

include(‘./output.html.php’);

}

Note que passamos o exato nome da coluna na tabela mysql como o índice do array $minha_tupla.

mysqli_fetch_array()

Essa função é mais elaborada porque ele pode retornar tanto um array com índice numérico, associativo, ou ambos.

while ($tupla_array = mysqli_fetch_array($result_set, MYSQLI_BOTH)) {

$output = $tupla_array[2];

include(‘./output.html.php’);

$output = $tupla_array[‘c_text’];

include(‘./output.html.php’);

}

Veja um simples resumo dos três tipos.

/* Índice numérico. */

while ($tuple = mysqli_fetch_row($result_object)) {

$output = $tuple[1];

}

/* Índice associativo. */

while ($tuple = mysqli_fetch_assoc($result_object)) {

$output = $tuple[‘c_author’];

}

/* Índice ou numérico, ou associativo, ou ambos. */

while ($tuple = mysqli_fetch_array($result_object, MYSQLI_BOTH)) {

// MYSQLI_NUM

// MYSQLI_ASSOC

$output1 = $tuple[1];

$output2 = $tuple[‘c_author’];

}

Se encontrar um erro, quiser fazer uma sugestão, o seja lá o que for, pode postar nos comentários.