API para acesso a banco de dados utilizado no Drupal

O Drupal possui uma camada de abstração da base de dados, vamos entender um pouco melhor como ela funciona.

Vamo começar pelo arquivo de configuração:

no arquivo sites/default/settings.php definimos as configurações de acesso ao banco de dados dessa forma:

$db_url = "mysql://username:password@localhost/databasename";

este exemplo como pode notar é para conexão com banco mysql, para quem usa postgresql é só mudar o prefixo mysql por pgsql. o usuário e senha bem como outros parâmetros você deve configurar através da sua aplicação de gerenciamento de banco de dados (ex: phpmyadmin) pois o drupal não controla isso!

A camada de abstração da base de dados do drupal é leve e possui duas principais finalidades. A primeira é manter seu código funcionando em diferente database. A segunda é para previnir SQL Injection. Esta camada foi construida com o princípio de que escrever SQL é mais conveniente do que aprender uma nova linguagem de camada de abstração.

Fazendo consultas simples

a função db_query() é usada para executar (SELECT, INSERT, UPDATE, DELETE) utilizando a conexão da base ativa. nas consultas utilizamos placeholders, vamos ver alguns exemplos:

//busca o nome do usuário 25 utilizando o placeholder %d
db_query('SELECT name FROM {users} WHERE uid = %d', 25);
esta consulta será traduzida para: SELECT name FROM {users} WHERE uid = 25

db_query("INSERT INTO {test} (nid, vid, nome) VALUES (%d, %d, '%s') ", 12, 2, 'Fulano');
esta consulta será traduzida para: INSERT INTO test (nid, vid, nome) VALUES (12, 2, 'Fulano')

utilize sempre os placeholder corretamente, as opções são:

%s para string
%d para inteiros
%f para float
%b para dados binários (não se utiliza aspas nesse caso igual a string)
%% literal para ser utilizado com like

Recuperando os resultados

único resultado com db_result()

exemplo para pegar a qtde total de posts do blog.

$sql = "SELECT COUNT(*) FROM {node} WHERE type = '%s' AND status = %d";
$total = db_result(db_query($sql, 'blog', 1));

múltiplos resultados

$sql = "SELECT * FROM {node} WHERE type = '%s' AND status = %d";
$result = db_query(db_rewrite_sql($sql));
while( $dados = db_fetch_object($result) ){
$node = node_load($dados->nid));
print node_view($node, TRUE);
}

a função db_fetch_object() pega uma linha do resultado e gera um objeto, para recuperar em forma de array utilize db_fetch_array() porém a pratica de pegar em forma de objeto é preferida e mais comum entre desenvolvedores por possui uma sintaxe mais curta.

LIMIT
Podemos também pegar intervalo limitado de resultados com db_query_range ao invés de db_query().

//apenas os 100 primeiros registros
$result = db_query_range( db_rewrite_sql($sql), 0, 100);

//limite de resultados com ordenação:

$sql = "SELECT * FROM users where type = '%s' ORDER BY created DESC";
$result = db_query_range(db_rewrite_sql($sql), 'blog', 0, 100);
fazemos isso ao invés de fazer o uso de LIMIT do mysql, isso porque estamos trabalhando com abstração, então seus sql tem que funcionar também para o postgresql, e este não possui LIMIT.

tabela temporária
outro recurso legal é a criação de tabela temporária:

db_query_temporary( $sql, $argumentos, $nomedatabela);

e também o recurso de alterar sql de módulos sem precisar alterar o módulo, isso é possivel com o uso do hook_db_rewrite_sql(), estes eu não vou comentar aqui pois é mais complicado, e não quero deixar esse tutorial muito longo e estressante. :)

valeu.