A site for solving at least some of your technical problems...
A site for solving at least some of your technical problems...
Today I ran in an error that looked like this:
Invalid argument supplied for foreach() in <path>/modules/taxonomy/taxonomy.module on line 1214.
The line number may vary depending on the version you are using. At the time, I had Drupal 6.14 and the line number was 1214.
The problem is with a node that has an invalid definition of its taxonomy field. In other words, the $node->taxonomy is not defined. If it were an empty array, the function would not fail.
I was updating a new Drupal website from an old static website generating nodes automatically with a little module. There were a little over 300 such nodes. My first attempt did not include all the necessary taxonomy entries (Oops). I fixed a few of the nodes by hand, and then I decided that I should do that again with the taxonomy included. Somehow, when I deleted the remaining nodes, I missed one. Now, what is the most surprising is that I did not get any such errors when I edited the first few converted nodes...
Looking for a solution, I found several pages on Drupal.org that would explain that the problem came from a few invalid nodes. Edit them to fix them and when you click on Save you'll be all good to go. So... I started to look for the node.
First I put a var_dump($node) so I could see the content of the node at the time the failing function is called. I thought that at least that way I'd see the node identifier and know which node is generating this problem.
There is the function we are dealing with:
  function taxonomy_node_update_index(&$node) {
    $output = array();
    foreach ($node->taxonomy as $term) {
      $output[] = $term->name;
    }
    if (count($output)) {
      return '<strong>('. implode(', ', $output) .')</strong>';
    }
  }
I just added a test and a var_dump() at the beginning as follow:
    if (!is_array($node->taxonomy)) {
      var_dump($node);
    }
The output was quite interesting. That is, not quite what I anticipated. An Object, yes, but very limited. And it idid not even include the node identifier!
stdClass Object ( [build_mode] => 2, [body] => <!-- google_ad_section_start --><!-- google_ad_section_end -->, [readmore] => , [content] => Array ( [adsense_start] => Array ( [#weight] => -5, [#value] => <!-- google_ad_section_start -->, [#title] => , [#description] => , [#printed] => 1 ), [body] => Array ( [#weight] => 0, [#value] => , [#title] => , [#description] => , [#printed] => 1 ), [adsense_end] => Array ( [#weight] => 5, [#value] => <!-- google_ad_section_end -->, [#title] => , [#description] => , [#printed] => 1 ), [#title] => , [#description] => , [#children] => <!-- google_ad_section_start --><!-- google_ad_section_end -->, [#printed] => 1 ) )
At that point I wondered how I could find the problem and decided that a trace of the stack would help much. So I changed my code to use a trace:
    if (!is_array($node->taxonomy)) {
      debug_print_backtrace();
    }
The debug call printed the stack so at least I could see who calls what. Quite instructive, although I still don't know what the update index event is used for, I can see that was the reason why the taxonomy function was being called.
The stack is a bit long because a three entries have the node object as a parameter. Notice that the nid does NOT appear in those! Yet, frame #3 gave me my answer. My bad node was number 239. Cool! So, now I could test that node.
#0  taxonomy_node_update_index(
  stdClass Object (
    [build_mode] => 2,
    [body] => <!-- google_ad_section_start --><!-- google_ad_section_end -->,
    [readmore] => ,
    [content] => Array (
      [adsense_start] => Array (
        [#weight] => -5,
        [#value] => <!-- google_ad_section_start -->,
        [#title] => ,[#description] => ,
        [#printed] => 1
      ),
      [body] => Array(
        [#weight] => 0,
        [#value] => ,
        [#title] => ,
        [#description] => ,
        [#printed] => 1
      ),
      [adsense_end] => Array (
        [#weight] => 5,
        [#value] => <!-- google_ad_section_end -->,
        [#title] => ,
        [#description] => ,
        [#printed] => 1
      ),
      [#title] => ,
      [#description] => ,
      [#children] => <!-- google_ad_section_start --><!-- google_ad_section_end -->,
      [#printed] => 1
    )
  )
) called at [/usr/clients/www/drupal/modules/taxonomy/taxonomy.module:1205]
#1  taxonomy_nodeapi(
  stdClass Object (
    [build_mode] => 2,
    [body] => <!-- google_ad_section_start --><!-- google_ad_section_end -->,
    [readmore] => ,
    [content] => Array (
      [adsense_start] => Array (
        [#weight] => -5,
	[#value] => <!-- google_ad_section_start -->,
	[#title] => ,
	[#description] => ,
	[#printed] => 1
      ),
      [body] => Array (
        [#weight] => 0,
	[#value] => ,
	[#title] => ,
	[#description] => ,
	[#printed] => 1
      ),
      [adsense_end] => Array (
        [#weight] => 5,
	[#value] => <!-- google_ad_section_end -->,
	[#title] => ,
	[#description] => ,
	[#printed] => 1
      ),
      [#title] => ,
      [#description] => ,
      [#children] => <!-- google_ad_section_start --><!-- google_ad_section_end -->,
      [#printed] => 1
    )
  ),
  update index,
  ,
) called at [/usr/clients/www/drupal/modules/node/node.module:673]
#2  node_invoke_nodeapi(
  stdClass Object (
    [build_mode] => 2,
    [body] => <!-- google_ad_section_start --><!-- google_ad_section_end -->,
    [readmore] => ,
    [content] => Array (
      [adsense_start] => Array (
        [#weight] => -5,
	[#value] => <!-- google_ad_section_start -->,
	[#title] => ,
	[#description] => ,
	[#printed] => 1
      ),
      [body] => Array (
        [#weight] => 0,
        [#value] => ,
	[#title] => ,
	[#description] => ,
	[#printed] => 1
      ),
      [adsense_end] => Array (
	[#weight] => 5,
	[#value] => <!-- google_ad_section_end -->,
	[#title] => ,
	[#description] => ,
	[#printed] => 1
      ),
      [#title] => ,
      [#description] => ,
      [#children] => <!-- google_ad_section_start --><!-- google_ad_section_end -->,
      [#printed] => 1
    )
  ),
  update index
) called at [/usr/clients/www/drupal/modules/node/node.module:1828]
#3  _node_index_node(stdClass Object ([nid] => 239))
    called at [/usr/clients/www/drupal/modules/node/node.module:1804]
#4  node_update_index()
#5  call_user_func_array(node_update_index, Array ())
    called at [/usr/clients/www/drupal/includes/module.inc:450]
#6  module_invoke(node, update_index)
    called at [/usr/clients/www/drupal/modules/search/search.module:273]
#7  search_cron()
#8  call_user_func_array(search_cron, Array ())
    called at [/usr/clients/www/drupal/includes/module.inc:471]
#9  module_invoke_all(cron) called at [/usr/clients/www/drupal/includes/common.inc:2693]
#10 drupal_cron_run() called at [/usr/clients/www/drupal/cron.php:11]
I wasn't too sure what to do with that node though... hmmm... when I tried to view the node it told me "Page not found". How weird! Then I tried to edit the node, same thing. I went to the administration area and tried to delete the node from the list. Did not work either!?
So I tested directly in the database and delete the two entries I found. One in the node table and the other in the node_comment_statistics. I'm really not too sure why that one node did not make it right. Out of the about 300 nodes I added today, this is the only one that failed.
In any event, once I delete those two entries, all the errors went away.