Acabei de perceber que o @Berdir foi tão bom de remover db_affected_rows
do Drupal 7 . Agora estou me perguntando qual é a melhor prática agora para detectar se a consulta que você executou mudou alguma coisa no banco de dados.
Um caso típico de uso seria.
db_query(...);
if (!db_affected_rows()) {
db_query(...);
}
Dei uma olhada no objeto de consulta retornado de db_query, mas não pareceu muita ajuda.
Atualização:
Vejo que fiquei um pouco incerto sobre quais circunstâncias eu precisava das informações.
Meu caso de uso atual é bastante simples. Eu tenho uma tabela para um tipo de nó com uma coluna nid e algumas colunas de dados. Eu tenho um formulário e, ao enviar o formulário, desejo inserir ou atualizar a linha no banco de dados.
O problema com db_update
/ db_insert
é que, se eu usar a atualização primeiro e inserir se a atualização retornar 0, não capturarei a condição em que o formulário foi enviado com o valor no banco de dados. Se eu usar o db_insert primeiro, isso gerará um erro se já houver uma linha no db.
Suponho que nessa condição específica possa inserir um valor em branco quando o nó for criado e, em seguida, usar apenas a atualização, mas em alguns casos isso pode não ser possível, se eu precisar armazenar informações que foram codificadas em um banco de dados externo. Eu também gostaria de evitar ter que depender dos valores do banco de dados para que meu código funcione.
Minha estratégia usual para tais casos, foi fazer uma
db_query("INSERT IGNORE INTO ...")
if (!db_affected_rows()) {
db_query("UPDATE ...");
}
Fazer isso é simples e sem erros, independentemente da condição em que o banco de dados estiver. A melhor opção que posso ver agora é lidar com o SQL e fazer o seguinte:
db_query("INSERT ... ON DUPLICATE KEY UPDATE");
Mas eu esperava que a API db fosse capaz de lidar com isso.