If you move instances of SuiteCRM around it’s possible to have a copy of the SuiteCRM files that reference a custom field that doesn’t exist in the fields_meta_data table.

This can cause broken SQL queries since SuiteCRM will try to reference a field but won’t have it’s name. A broken query may look something like:

UPDATE my_custom_module SET name='Foo', =NULL,=NULL WHERE id='1234';

This can be fixed in one of two ways.

The first, preferred way is to get the info from the fields_meta_data table. This mysqldump command will create a file with the fields meta data:

mysqldump -uYourDBUser --insert-ignore --no-create-info -p YourDB fields_meta_data > fields_meta_data.sql

This can then be used to populate the new DB:

mysql -uYourDBUser -p YourNewDB < fields_meta_data.sql

The second is to find and remove the fields which are causing the issue. The following script will list any entries in the vardefs without a name which causes the original broken queries. Simply change the \$base variable to be the path to the SuiteCRM instance you want to check and run php -f fieldcheck.php:

<?php

$base = "/path/to/suitecrm";
$searchBase = $base.DIRECTORY_SEPARATOR."cache".DIRECTORY_SEPARATOR."modules";
$dirs = scandir($searchBase);
$GLOBALS["dictionary"] = array();
foreach($dirs as $dir){
    $dir = $searchBase .DIRECTORY_SEPARATOR . $dir;
    if($dir == '.' || $dir == '..' || !is_dir($dir)){
        continue;
    }

    $files = glob($dir.DIRECTORY_SEPARATOR.'*vardefs.php');
    foreach($files as $file){
        include $file;
    }
}
foreach($GLOBALS["dictionary"] as $module => $arr){
    foreach($arr["fields"] as $key => $field){
        if(empty($key)){
            echo "Empty key for field in $module\n";
        }
        if(empty($field['name'])){
            echo "Empty name for $key field in $module\n";
        }
    }
}

Once you have found the offending fields you can remove the definitions for them.