Mikkel Høgh

Preparing for Drupal 7 by changing the way to make parameters for db_query.

Sunday, November 321st, 2008

After attending DrupalCon in Szeged and following the new database stuff, I thought a bit about how to make the transition easier when Drupal 7 comes out.

I didn’t think that it was anything special, but Robert Douglass encouraged me to share it, so here you are:

I figured out that you can actually use the Drupal 7-style of arguments to db_query right now (more or less).

The thing is that db_query in Drupal 6 allows you to use either the classic way with an arbitrary number of extra arguments to the db_query function or arguments as an array which is the future style.

The deal is that Drupal 6 takes the arguments in order, where Drupal 7 will use array keys (so I’d have :title in my query instead of %s).

So you can use the same arguments in Drupal 6 and Drupal 7, because Drupal 6 doesn’t care about which keys you have in your arguments array.

So whithout further ado, an example query from my TSearch module (the implementation of PostgreSQL’s TSearch in Drupal):

db_query("UPDATE {tsearch_node} SET vid = %d,
          node_tsvector =
            setweight(to_tsvector('%s'), 'A') ||
            setweight(to_tsvector('%s'), 'B') ||
            setweight(to_tsvector('%s'), 'C') ||
            setweight(to_tsvector('%s'), 'D'),
          updated = %d
          WHERE nid = %d",
        array(':vid' => $node->vid,
              ':title' => $text['title'],
              ':extra' => $text['extra'],
              ':teaser' => $text['teaser'],
              ':body' => $text['body'],
              ':time' => $_SERVER['REQUEST_TIME'],
              ':nid' => $nid,
        ));

Isn’t that neat? I’ve become quite fond of this syntax, because I think it’s easier to see what’s going on, and it’ll be even better in Drupal 7, where I don’t have to care about the ordering any longer.


Mikkel Høgh

My name is Mikkel Høgh, I've worked with web tech for the last 20 years. These days, I work with e-commerce in Central Switzerland.