First, change that SQL in the getColumnNames() call. You definitely don’t want to load every row in the database just to get the column names (what if it had a million rows?). You just need one row from the db to do that.
Otherwise, that’s not a bad way, though you can also do a lot cooler things using MySQL full-text indexes, including relevance ranking, full boolean search capabilities, and more, but you need control over the indexes in the tables to do that. Other benefits of this approach are improved search times, as often doing OR searches across every column in a table is going to take a lot more processor time than searching a dedicated full-text index. It is also less resource intensive in general to provide dedicated indexes for those kinds of searches. A minus is this is typically completely dependent on proprietary database features.
BTW, on a side note: one of the reasons I created xPDO was to be able access column meta data without having to even open a connection to the database. This comes in handy when you want to do full database result-set caching, and also eliminates the need to query a row from the table before being able to get that metadata. The same mechanisms in xPDO will also help developers (and eventually end-users) control advanced features, like custom full-text indexes to search specific important fields on the objects.
Anyway, enough of my rambling...