Community & Support

How diagnose: warning: preg_match() expects parameter 2 to be string, array given in .../includes/bootstrap/inc 777

Since I upgraded to Drupal6.15 (along with about a dozen recommended modules updates) I get the following well known (dare I say infamous) side-effect warning:

warning: preg_match() expects parameter 2 to be string, array given in [...]/includes/bootstrap.inc on line 791.

I've inserted the following dump and backtrace into bootstrap.inc:

function drupal_validate_utf8($text) {
  if (strlen($text) == 0) {
    return TRUE;
  }
  ///2010-01-30 DEBUG
  try {
if (is_array($text)) {
var_dump($text); //DEBUG;
ddebug_backtrace();// needs Devel module on
throw new Exception("array passed as text to drupal_validate_utf8");
}
  } catch (Exception $e) {
echo "Caught Exception('{$e>getMessage()}')\n<pre>{$e}</pre>\n";
  }
///
  return (preg_match('/^./us', $text) == 1);
}

I get the following:

array(2) { [0]=>  string(7) "8 reads" [1]=>  string(7) "0 reads" } Caught Exception ('array passed as text to drupal_validate_utf8')

exception 'Exception' with message 'array passed as text to drupal_validate_utf8' in [...]/includes/bootstrap.inc:785
Stack trace:
#0 [...]/includes/bootstrap.inc(741): drupal_validate_utf8(Array)
#1 [...]/includes/theme.inc(1177): check_plain()
#2 [...]/includes/theme.inc(617): theme_links(Array)
#3 [...]/includes/theme.inc(1929): theme()
#4 [...]/includes/theme.inc(658): template_preprocess_node(Array, Array)
#5 [...]/modules/node/node.module(1023): theme()
#6 [...]/modules/node/node.module(1096): node_view()
#7 [...]/modules/node/node.module(1785): node_show()
#8 [...]/includes/menu.inc(348): node_page_view('theme_links', Array)
#9 [...]/index.php(18): menu_execute_active_handler()
#10 {main}

I'm none the wiser. What else can I do to find out what is causing the error ?

Comments

Diagnosing through disable/enable recently upgraded modules

When I upgraded to Drupal6.15, I took the opportunity to upgrade many modules, only due to security recommendations.

Using brute force (and it feels mostly irrelevant) disable of upgraded modules I can now exclude:

- Link 6.x-2,8

- FileField 6.x-3.2

- Date 6.x-2.4

- Calendar 6.x-2.2

..this is ridiculous, there has to be an easier way to find the culprit.

Webel, "Elements of the Web", Scientific IT Consultancy,
For UML, UML Parsing Analysis, SysML, Java, XML, and Drupal CMS.

Diagnosing the backtrace.

Within args of theme_links have statistics_counter (Array, 1 element), with a title (Array, 2 elements), with strings "7 reads" and "0 reads".

check_plain called with args (Array, 1 element) which is the (Array, 2 elements), with strings "7 reads" and "0 reads" (from statistics_counter).

drupal_validate_utf8 then called with args (Array, 1 element) which is the (Array, 2 elements), with strings "7 reads" and "0 reads" (from statistics_counter).

However, drupal_validate_utf8 expects a string arg, not an array.

Surely this is not a core Drupal 6.15 problem ?

Can somebody please explain to me how to find the cause of this problem, this has now wasted hours of my time, and just because I performed recommended security upgrades, which should not have such side-effects.

Webel, "Elements of the Web", Scientific IT Consultancy,
For UML, UML Parsing Analysis, SysML, Java, XML, and Drupal CMS.

The call_user_func_array

The call_user_func_array takes place in menu.inc
line (Integer) 348:

return call_user_func_array($router_item['page_callback'], $router_item['page_arguments']);

And although (and I confess proudly that I'm UML-driven Java boy and Netbeans IDE fan) I love the ability to manipulate functions as strings sometimes, the way function as strings are thrown around in PHP-based Drupal makes it infuriatingly difficult to diagnose anything. Could somebody please help me isolate the cause of this most annoying and common of errors (and surely not one I caused). I am a real coder, and I don't mind getting my hands dirty, even in PHP, however this is so much harder than it need be, because Drupal does not leverage obvious object-oriented strategies, preferring it seems at every turn function-manipulation tricks (and they are mostly not necessary, and makes thinks darn hard to trace).

How do I find which module, or which part of core, is causing drupal_validate_utf8 to be called incorrectly with statistics_counter as an array ?

And who would not be tempted to just hack core to silence drupal_validate_utf8 whenever it is invoked with an array ? I could die figuring it out.

Webel, "Elements of the Web", Scientific IT Consultancy,
For UML, UML Parsing Analysis, SysML, Java, XML, and Drupal CMS.

The cause is the core (optional) statistics module

Brute force Google search brought me to: http://api.drupal.org/api/function/statistics_link/6

Buried (because it is a string key PHP-like, not a real var) inside the statistics.module, I find:

$links['statistics_counter']['title'] = format_plural($statistics['totalcount'], '1 read', '@count reads');

(From that point on of course, all diagnostics become more difficult, because one has to go hunting for the string 'statistics_counter' as $links is passed around.)

Switching off the Statistics 6.15 gets rid of the message from drupal_validate_utf8.

So it IS a core (optional) Drupal 6.15 problem, and because I upgraded to it on the basis of a security warning I had hours of my time wasted (not least because the way Drupal is coded is so unnecessarily hard to trace), and I would rather have used the time for something useful.

Webel, "Elements of the Web", Scientific IT Consultancy,
For UML, UML Parsing Analysis, SysML, Java, XML, and Drupal CMS.

Reported as bug in statistics.module 6.15 core (optional)

#701996: statistics_counter with array title incorrectly passed (eventually) to drupal_validate_utf8($text) in bootstrap.inc 777

Includes backtrace as image (krumo style), revealing array with key statistics_counter buried inside $links.

Webel, "Elements of the Web", Scientific IT Consultancy,
For UML, UML Parsing Analysis, SysML, Java, XML, and Drupal CMS.