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

Published on Sun, 2008-11-16 - 19:49

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.

Tags
The comments for this post are now closed. If you have corrections, suggestions, or other feedback, you can reach me through the contact page.