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.