在使用cacti(版本为0.8.7b)时发现它有一个小bug,就是不可以修改已经做好了的graph,因为在修改graph时,Data Source总是空的,查看日志发现有这么一行: 11/20/2008 10:24:32 PM - CMDPHP: Poller[0] ERROR: SQL Assoc Failed!, Error:'1271', SQL:"select CONCAT_WS('', case when host.de scription is null then 'No Host - ' when host.description is not null then '' end,data_template_data.name_cache,' (',data_templa te_rrd.data_source_name,')') as name, data_template_rrd.id from (data_template_data,data_template_rrd,data_local) left join ho st on (data_local.host_id=host.id) where data_template_rrd.local_data_id=data_local.id and data_template_data.local_data_id=data _local.id and data_local.host_id=7 order by name" 这是因为在执行SQL语句:select CONCAT_WS('', case when host.de scription is null then 'No Host - ' when host.description is not null then '' end,data_template_data.name_cache,' (',data_templa te_rrd.data_source_name,')') as name, data_template_rrd.id from (data_template_data,data_template_rrd,data_local) left join ho st on (data_local.host_id=host.id) where data_template_rrd.local_data_id=data_local.id and data_template_data.local_data_id=data _local.id and data_local.host_id=7 order by name 出错了,把这条语句放到mysql手工执行,果然是错的,但我研究了很久也不知道应该怎么改,最后只好找到这行所的php文件在html_form_template.php里的第119行找到以下: $struct_graph_item["task_item_id"]["sql"] = "select CONCAT_WS('', case when host.description is null then 'No Host - ' when host.description is not null then '' end,data_template_data.name_cache,' (',data_template_rrd.data_source_name,')') as name, data_template_rrd.id from (data_template_data,data_template_rrd,data_local) left join host on (data_local.host_id=host.id) where data_template_rrd.local_data_id=data_local.id and data_template_data.local_data_id=data_local.id " . (empty($host_id) ? "" : " and data_local.host_id=$host_id") . " order by name"; 删除case语句 把它改为: $struct_graph_item["task_item_id"]["sql"] = "select CONCAT_WS('', data_template_data.name_cache,' (',data_template_rrd.data_source_name,')') as name, data_template_rrd.id from (data_template_data,data_template_rrd,data_local) left join host on (data_local.host_id=host.id) where data_template_rrd.local_data_id=data_local.id and data_template_data.local_data_id=data_local.id " . (empty($host_id) ? "" : " and data_local.host_id=$host_id") . " order by name"; 之后就一切ok了,不过我想不明白原来的那句为什么执行出错,有了解的朋友请指教一二