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.