Invalid argument supplied for foreach() in wp-capabilities.php: Case Cracked! [en]

[fr] Le problème avec wp-capabilities.php qui fait qu'on peut se retrouver "exfermé" (enfermé dehors) de son blog WordPress (typiquement en cas de changement de serveur) semble avoir sa source dans le contenu du champ wp_user_roles dans la table wp_options. En particulier, pour la version française, "Abonné" est un rôle d'utilisateur, et en cas de problèmes d'encodage MySQL, le caractère accentué sera corrompu, causant ainsi l'erreur.

Il suffit de remplacer le caractère fautif dans PhpMyAdmin, et on retrouve l'accès à son blog. Bon, reste ensuite à régler les questions d'encodage... mais c'est déjà ça!

Finally. At last. Endlich. Enfin.

Once more, while trying to transfer a WordPress installation from one server to another, I found myself facing the dreaded problem which locks me out of my WordPress install with a rather cryptic message:

Warning: Invalid argument supplied for foreach() in /home/user/wp/wp-includes/capabilities.php on line 31

(Your lineage may vary.)

What happens is that WordPress cannot read user roles, and therefore, even though your password is accepted, you get a message telling you that you’re not welcome in the wp-admin section:

Vous n’avez pas les droits suffisants pour accéder à cette page.

Or, in English:

You do not have sufficient permissions to access this page.

A quick search on the WordPress forums told me that I was not alone in my fight with wp-capabilities.php, but that many problems had not been resolved, and more importantly, that suggested solutions often did not work for everyone.

I’ve bumped into this problem a couple of times before, and I knew that it was linked to encoding problems in the database. (I’ve had my share of encoding problems: once, twice, thrice — “once” being on of the most-visited posts on this blog, by the way, proof if needed that I’m not alone with mysql encoding issues either.)

I’ll leave the detailed resolution of how to avoid/cure the MySQL problems later (adding
mysql_query("SET NAMES 'utf8'");
to wp-db.php as detailed in this thread, and as zedrdave had already previously told me to do — should have listened! — should prevent them). So anyway, adding that line to my working WordPress install showed me that the problem was not so much in the database dumping process than in the way WordPress itself interacted with the database, because the dreaded wp-capabilities.php problem suddenly appeared on the original blog.

Now, this is where I got lucky. Browsing quickly through the first dozen or so of forum threads about wp-capability.php problems, this response caught my eye. It indicated that the source of the problem was the content of the wp_user_roles field (your prefix may vary). In this case, it had been split on more than one line.

I headed for the database, looked at the field, and didn’t see anything abnormal about it at first. All on one line, no weird characters… just before giving up, I moved the horizontal scrollbar to the end of the line, and there — Eurêka! I saw it.

Abonné

“Contributor”, in French, is “abonné”, with an accent. Accent which got horribly mangled by the MySQL problems which I’ll strive to resolve shorty. Mangled character which caused the foreach() loop to break in wp-capabilities.php, which caused the capabilities to not be loaded, which caused me to be locked out of my blog.

So, in summary: if you’re locked out of your blog and get a warning/error about wp-capabilities and some invalid foreach() loop thingy, head for PhpMyAdmin, and look carefully through the wp_user_roles field in the wp_options table. If it’s split over two or more lines, or contains funky characters, you have probably found the source of your problem.

Good luck!

IT Conversations: Dan Gillmor [en]

Some notes on IT Conversations show with Halley Suitt and Dan Gillmor (audio available online).

[fr] Interview audio de Dan Gillmor par Halley Suitt. Quelques notes.

I’m currently listening to Halley’s interview of Dan Gillmor on IT Conversations. I’m not used to listening to stuff through the internet (the whole podcasting hype hasn’t really caught my interest… yet) — so here are a few notes and comments, mainly for myself.

First of all, I’m always slightly shocked to hear people I know from the Internet actually speaking. When chatting, or reading blogs, I forget that people have accents. So, my first reaction upon hearing Halley speaking was “Gosh! She really has an American accent!”.

After a first part on American politics that went completely over my head, the topic turned to “Journalism and blogging” (already more interesting) and finally, more webby stuff. A few random notes:

  • Strive for objectivity in journalism still a valid aim.
  • 9-11, elections, tsunami: made blogs visible as a media, rather than “made more people blog” (I’ve finally managed to name the confusion that irritates me so much.)
  • Camera phones (and digicams in general) have a highly disruptive potential. Towards more transparency. Harder to hide nasty things.
  • Podcasting: most people not trained to produce the kind of audio we enjoy listening to.
  • Blogs with small readership (target audience=family and close friends): very important sociologically.
  • Internet allows to bring readers closer to source material.
  • Probably lots of source material for historians gathering now on the web. Web stuff as potential replacement for the letter, which used to give lots of information on people’s lives and current events. (Biographies, History.)
  • Not holding people accountable (in future) about silly things they wrote on their teenage blogs…
  • About writing the book online: retaining authorship, while having thousands of “eyes” to give feedback and comments. (And the eyes in question will be those interested by the topic.)

Next one I’m listening to is Joi’s.